StereoEffect.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {
  2. StereoCamera,
  3. Vector2
  4. } from 'three';
  5. /**
  6. * A class that creates an stereo effect.
  7. *
  8. * Note that this class can only be used with {@link WebGLRenderer}.
  9. * When using {@link WebGPURenderer}, use {@link StereoPassNode}.
  10. */
  11. class StereoEffect {
  12. /**
  13. * Constructs a new stereo effect.
  14. *
  15. * @param {WebGLRenderer} renderer - The renderer.
  16. */
  17. constructor( renderer ) {
  18. const _stereo = new StereoCamera();
  19. _stereo.aspect = 0.5;
  20. const size = new Vector2();
  21. /**
  22. * Sets the given eye separation.
  23. *
  24. * @param {number} eyeSep - The eye separation to set.
  25. */
  26. this.setEyeSeparation = function ( eyeSep ) {
  27. _stereo.eyeSep = eyeSep;
  28. };
  29. /**
  30. * Resizes the effect.
  31. *
  32. * @param {number} width - The width of the effect in logical pixels.
  33. * @param {number} height - The height of the effect in logical pixels.
  34. */
  35. this.setSize = function ( width, height ) {
  36. renderer.setSize( width, height );
  37. };
  38. /**
  39. * When using this effect, this method should be called instead of the
  40. * default {@link WebGLRenderer#render}.
  41. *
  42. * @param {Object3D} scene - The scene to render.
  43. * @param {Camera} camera - The camera.
  44. */
  45. this.render = function ( scene, camera ) {
  46. if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
  47. if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
  48. _stereo.update( camera );
  49. const currentAutoClear = renderer.autoClear;
  50. renderer.getSize( size );
  51. renderer.autoClear = false;
  52. renderer.clear();
  53. renderer.setScissorTest( true );
  54. renderer.setScissor( 0, 0, size.width / 2, size.height );
  55. renderer.setViewport( 0, 0, size.width / 2, size.height );
  56. renderer.render( scene, _stereo.cameraL );
  57. renderer.setScissor( size.width / 2, 0, size.width / 2, size.height );
  58. renderer.setViewport( size.width / 2, 0, size.width / 2, size.height );
  59. renderer.render( scene, _stereo.cameraR );
  60. renderer.setScissorTest( false );
  61. renderer.autoClear = currentAutoClear;
  62. };
  63. }
  64. }
  65. export { StereoEffect };
粤ICP备19079148号