WebVRCamera.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.WebVRCamera = function ( display, renderer ) {
  5. var scope = this;
  6. var frameData = null;
  7. if ( 'VRFrameData' in window ) {
  8. frameData = new window.VRFrameData();
  9. }
  10. var cameraL = new THREE.PerspectiveCamera();
  11. cameraL.bounds = new THREE.Vector4( 0.0, 0.0, 0.5, 1.0 );
  12. cameraL.layers.enable( 1 );
  13. var cameraR = new THREE.PerspectiveCamera();
  14. cameraR.bounds = new THREE.Vector4( 0.5, 0.0, 0.5, 1.0 );
  15. cameraR.layers.enable( 2 );
  16. var matrixWorldInverse = new THREE.Matrix4();
  17. //
  18. var currentSize, currentPixelRatio;
  19. function onVRDisplayPresentChange() {
  20. if ( display.isPresenting ) {
  21. var eyeParameters = display.getEyeParameters( 'left' );
  22. var renderWidth = eyeParameters.renderWidth;
  23. var renderHeight = eyeParameters.renderHeight;
  24. currentPixelRatio = renderer.getPixelRatio();
  25. currentSize = renderer.getSize();
  26. renderer.setPixelRatio( 1 );
  27. renderer.setSize( renderWidth * 2, renderHeight, false );
  28. scope.enabled = true;
  29. } else if ( scope.enabled ) {
  30. scope.enabled = false;
  31. renderer.setPixelRatio( currentPixelRatio );
  32. renderer.setSize( currentSize.width, currentSize.height, true );
  33. }
  34. }
  35. window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );
  36. //
  37. THREE.ArrayCamera.call( this, [ cameraL, cameraR ] );
  38. //
  39. this.onBeforeRender = function () {
  40. display.depthNear = scope.near;
  41. display.depthFar = scope.far;
  42. display.getFrameData( frameData );
  43. //
  44. var pose = frameData.pose;
  45. if ( pose.orientation !== null ) {
  46. scope.quaternion.fromArray( pose.orientation );
  47. }
  48. if ( pose.position !== null ) {
  49. scope.position.fromArray( pose.position );
  50. } else {
  51. scope.position.set( 0, 0, 0 );
  52. }
  53. //
  54. cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
  55. cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
  56. if ( scope.parent !== null ) {
  57. matrixWorldInverse.getInverse( scope.parent.matrixWorld );
  58. cameraL.matrixWorldInverse.multiply( matrixWorldInverse );
  59. cameraR.matrixWorldInverse.multiply( matrixWorldInverse );
  60. }
  61. cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );
  62. cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );
  63. // HACK @mrdoob
  64. // https://github.com/w3c/webvr/issues/203
  65. scope.projectionMatrix.copy( cameraL.projectionMatrix );
  66. //
  67. var layers = display.getLayers();
  68. if ( layers.length ) {
  69. var layer = layers[ 0 ];
  70. if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
  71. cameraL.bounds.fromArray( layer.leftBounds );
  72. }
  73. if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
  74. cameraR.bounds.fromArray( layer.rightBounds );
  75. }
  76. }
  77. };
  78. this.onAfterRender = function () {
  79. if ( display.isPresenting ) display.submitFrame();
  80. };
  81. };
  82. THREE.WebVRCamera.prototype = Object.assign( Object.create( THREE.ArrayCamera.prototype ), {
  83. constructor: THREE.WebVRCamera,
  84. isWebVRCamera: true
  85. } );