| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { Camera } from '../cameras/Camera.js'; |
| import { Vector3 } from '../math/Vector3.js'; |
| import { LineSegments } from '../objects/LineSegments.js'; |
| import { Color } from '../math/Color.js'; |
| import { FaceColors } from '../constants.js'; |
| import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; |
| import { BufferGeometry } from '../core/BufferGeometry.js'; |
| import { Float32BufferAttribute } from '../core/BufferAttribute.js'; |
|
|
| function CameraHelper( camera ) { |
|
|
| var geometry = new BufferGeometry(); |
| var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); |
|
|
| var vertices = []; |
| var colors = []; |
|
|
| var pointMap = {}; |
|
|
| |
|
|
| var colorFrustum = new Color( 0xffaa00 ); |
| var colorCone = new Color( 0xff0000 ); |
| var colorUp = new Color( 0x00aaff ); |
| var colorTarget = new Color( 0xffffff ); |
| var colorCross = new Color( 0x333333 ); |
|
|
| |
|
|
| addLine( 'n1', 'n2', colorFrustum ); |
| addLine( 'n2', 'n4', colorFrustum ); |
| addLine( 'n4', 'n3', colorFrustum ); |
| addLine( 'n3', 'n1', colorFrustum ); |
|
|
| |
|
|
| addLine( 'f1', 'f2', colorFrustum ); |
| addLine( 'f2', 'f4', colorFrustum ); |
| addLine( 'f4', 'f3', colorFrustum ); |
| addLine( 'f3', 'f1', colorFrustum ); |
|
|
| |
|
|
| addLine( 'n1', 'f1', colorFrustum ); |
| addLine( 'n2', 'f2', colorFrustum ); |
| addLine( 'n3', 'f3', colorFrustum ); |
| addLine( 'n4', 'f4', colorFrustum ); |
|
|
| |
|
|
| addLine( 'p', 'n1', colorCone ); |
| addLine( 'p', 'n2', colorCone ); |
| addLine( 'p', 'n3', colorCone ); |
| addLine( 'p', 'n4', colorCone ); |
|
|
| |
|
|
| addLine( 'u1', 'u2', colorUp ); |
| addLine( 'u2', 'u3', colorUp ); |
| addLine( 'u3', 'u1', colorUp ); |
|
|
| |
|
|
| addLine( 'c', 't', colorTarget ); |
| addLine( 'p', 'c', colorCross ); |
|
|
| |
|
|
| addLine( 'cn1', 'cn2', colorCross ); |
| addLine( 'cn3', 'cn4', colorCross ); |
|
|
| addLine( 'cf1', 'cf2', colorCross ); |
| addLine( 'cf3', 'cf4', colorCross ); |
|
|
| function addLine( a, b, color ) { |
|
|
| addPoint( a, color ); |
| addPoint( b, color ); |
|
|
| } |
|
|
| function addPoint( id, color ) { |
|
|
| vertices.push( 0, 0, 0 ); |
| colors.push( color.r, color.g, color.b ); |
|
|
| if ( pointMap[ id ] === undefined ) { |
|
|
| pointMap[ id ] = []; |
|
|
| } |
|
|
| pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); |
|
|
| } |
|
|
| geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); |
| geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); |
|
|
| LineSegments.call( this, geometry, material ); |
|
|
| this.camera = camera; |
| if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); |
|
|
| this.matrix = camera.matrixWorld; |
| this.matrixAutoUpdate = false; |
|
|
| this.pointMap = pointMap; |
|
|
| this.update(); |
|
|
| } |
|
|
| CameraHelper.prototype = Object.create( LineSegments.prototype ); |
| CameraHelper.prototype.constructor = CameraHelper; |
|
|
| CameraHelper.prototype.update = function () { |
|
|
| var geometry, pointMap; |
|
|
| var vector = new Vector3(); |
| var camera = new Camera(); |
|
|
| function setPoint( point, x, y, z ) { |
|
|
| vector.set( x, y, z ).unproject( camera ); |
|
|
| var points = pointMap[ point ]; |
|
|
| if ( points !== undefined ) { |
|
|
| var position = geometry.getAttribute( 'position' ); |
|
|
| for ( var i = 0, l = points.length; i < l; i ++ ) { |
|
|
| position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| return function update() { |
|
|
| geometry = this.geometry; |
| pointMap = this.pointMap; |
|
|
| var w = 1, h = 1; |
|
|
| |
| |
|
|
| camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse ); |
|
|
| |
|
|
| setPoint( 'c', 0, 0, - 1 ); |
| setPoint( 't', 0, 0, 1 ); |
|
|
| |
|
|
| setPoint( 'n1', - w, - h, - 1 ); |
| setPoint( 'n2', w, - h, - 1 ); |
| setPoint( 'n3', - w, h, - 1 ); |
| setPoint( 'n4', w, h, - 1 ); |
|
|
| |
|
|
| setPoint( 'f1', - w, - h, 1 ); |
| setPoint( 'f2', w, - h, 1 ); |
| setPoint( 'f3', - w, h, 1 ); |
| setPoint( 'f4', w, h, 1 ); |
|
|
| |
|
|
| setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); |
| setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); |
| setPoint( 'u3', 0, h * 2, - 1 ); |
|
|
| |
|
|
| setPoint( 'cf1', - w, 0, 1 ); |
| setPoint( 'cf2', w, 0, 1 ); |
| setPoint( 'cf3', 0, - h, 1 ); |
| setPoint( 'cf4', 0, h, 1 ); |
|
|
| setPoint( 'cn1', - w, 0, - 1 ); |
| setPoint( 'cn2', w, 0, - 1 ); |
| setPoint( 'cn3', 0, - h, - 1 ); |
| setPoint( 'cn4', 0, h, - 1 ); |
|
|
| geometry.getAttribute( 'position' ).needsUpdate = true; |
|
|
| }; |
|
|
| }(); |
|
|
|
|
| export { CameraHelper }; |
|
|