| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import { Matrix4 } from '../math/Matrix4.js';
- import { _Math } from '../math/Math.js';
- import { PerspectiveCamera } from './PerspectiveCamera.js';
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- function StereoCamera() {
- this.type = 'StereoCamera';
- this.aspect = 1;
- this.eyeSep = 0.064;
- this.cameraL = new PerspectiveCamera();
- this.cameraL.layers.enable( 1 );
- this.cameraL.matrixAutoUpdate = false;
- this.cameraR = new PerspectiveCamera();
- this.cameraR.layers.enable( 2 );
- this.cameraR.matrixAutoUpdate = false;
- }
- Object.assign( StereoCamera.prototype, {
- update: ( function () {
- var instance, focus, fov, aspect, near, far, zoom, eyeSep;
- var eyeRight = new Matrix4();
- var eyeLeft = new Matrix4();
- return function update( camera ) {
- var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||
- aspect !== camera.aspect * this.aspect || near !== camera.near ||
- far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;
- if ( needsUpdate ) {
- instance = this;
- focus = camera.focus;
- fov = camera.fov;
- aspect = camera.aspect * this.aspect;
- near = camera.near;
- far = camera.far;
- zoom = camera.zoom;
- // Off-axis stereoscopic effect based on
- // http://paulbourke.net/stereographics/stereorender/
- var projectionMatrix = camera.projectionMatrix.clone();
- eyeSep = this.eyeSep / 2;
- var eyeSepOnProjection = eyeSep * near / focus;
- var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;
- var xmin, xmax;
- // translate xOffset
- eyeLeft.elements[ 12 ] = - eyeSep;
- eyeRight.elements[ 12 ] = eyeSep;
- // for left eye
- xmin = - ymax * aspect + eyeSepOnProjection;
- xmax = ymax * aspect + eyeSepOnProjection;
- projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
- projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
- this.cameraL.projectionMatrix.copy( projectionMatrix );
- // for right eye
- xmin = - ymax * aspect - eyeSepOnProjection;
- xmax = ymax * aspect - eyeSepOnProjection;
- projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
- projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
- this.cameraR.projectionMatrix.copy( projectionMatrix );
- }
- this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );
- this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );
- };
- } )()
- } );
- export { StereoCamera };
|