diff --git a/src/renderers/webvr/WebVRUtils.js b/src/renderers/webvr/WebVRUtils.js index 11d03de531122edccc23ba26bd08d1e039c578a3..3e06a8d2269e48f1a8830c51d276b14c670de1f3 100644 --- a/src/renderers/webvr/WebVRUtils.js +++ b/src/renderers/webvr/WebVRUtils.js @@ -9,7 +9,7 @@ var cameraLPos = new Vector3(); var cameraRPos = new Vector3(); /** - * Assumes 2 cameras that are perpendicular and share an X-axis, and that + * Assumes 2 cameras that are parallel and share an X-axis, and that * the cameras' projection and world matrices have already been set. * And that near and far planes are identical for both cameras. */ @@ -31,22 +31,22 @@ function setProjectionFromUnion( camera, cameraL, cameraR ) { var leftFovL = ( projL[ 8 ] - 1 ) / projL[ 0 ]; var rightFovR = ( projR[ 8 ] + 1 ) / projR[ 0 ]; - var leftL = leftFovL * near; - var rightR = rightFovR * near; + var leftL = near * leftFovL; + var rightR = near * rightFovR; var topL = near * ( projL[ 9 ] + 1 ) / projL[ 5 ]; var topR = near * ( projR[ 9 ] + 1 ) / projR[ 5 ]; var bottomL = near * ( projL[ 9 ] - 1 ) / projL[ 5 ]; var bottomR = near * ( projR[ 9 ] - 1 ) / projR[ 5 ]; // Calculate the new camera's position offset from the - // left camera. - var zOffset = ipd / ( leftFovL - rightFovR ); - var xOffset = zOffset * leftFovL; + // left camera. xOffset should be roughly half `ipd`. + var zOffset = ipd / ( - leftFovL + rightFovR ); + var xOffset = zOffset * - leftFovL; // TODO: Better way to apply this offset? cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); camera.translateX( xOffset ); - camera.translateZ( - zOffset * 2 ); + camera.translateZ( zOffset ); camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); camera.matrixWorldInverse.getInverse( camera.matrixWorld );