| |
| |
| |
| |
|
|
| import { Vector3 } from '../../math/Vector3.js'; |
|
|
| var cameraLPos = new Vector3(); |
| var cameraRPos = new Vector3(); |
|
|
| |
| |
| |
| |
| |
| |
| function setProjectionFromUnion( camera, cameraL, cameraR ) { |
|
|
| cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); |
| cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); |
|
|
| var ipd = cameraLPos.distanceTo( cameraRPos ); |
|
|
| var projL = cameraL.projectionMatrix.elements; |
| var projR = cameraR.projectionMatrix.elements; |
|
|
| |
| |
| |
| var near = projL[ 14 ] / ( projL[ 10 ] - 1 ); |
| var far = projL[ 14 ] / ( projL[ 10 ] + 1 ); |
| var topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; |
| var bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; |
|
|
| var leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; |
| var rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; |
| var left = near * leftFov; |
| var right = near * rightFov; |
|
|
| |
| |
| var zOffset = ipd / ( - leftFov + rightFov ); |
| var xOffset = zOffset * - leftFov; |
|
|
| |
| cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); |
| camera.translateX( xOffset ); |
| camera.translateZ( zOffset ); |
| camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); |
| camera.matrixWorldInverse.getInverse( camera.matrixWorld ); |
|
|
| |
| |
| |
| var near2 = near + zOffset; |
| var far2 = far + zOffset; |
| var left2 = left - xOffset; |
| var right2 = right + ( ipd - xOffset ); |
| var top2 = topFov * far / far2 * near2; |
| var bottom2 = bottomFov * far / far2 * near2; |
|
|
| camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); |
|
|
| } |
|
|
| export { setProjectionFromUnion }; |
|
|