Spaces:
Running
Running
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 }; | |