stereoscopicScreenUniversalCamera.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { Camera } from "../../Cameras/camera.js";
  2. import { UniversalCamera } from "../../Cameras/universalCamera.js";
  3. import { Matrix, Vector3 } from "../../Maths/math.vector.js";
  4. import { TargetCamera } from "../targetCamera.js";
  5. import { TransformNode } from "../../Meshes/transformNode.js";
  6. import { Viewport } from "../../Maths/math.viewport.js";
  7. /**
  8. * Camera used to simulate stereoscopic rendering on real screens (based on UniversalCamera)
  9. * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras
  10. */
  11. export class StereoscopicScreenUniversalCamera extends UniversalCamera {
  12. set distanceBetweenEyes(newValue) {
  13. this._distanceBetweenEyes = newValue;
  14. }
  15. /**
  16. * distance between the eyes
  17. */
  18. get distanceBetweenEyes() {
  19. return this._distanceBetweenEyes;
  20. }
  21. set distanceToProjectionPlane(newValue) {
  22. this._distanceToProjectionPlane = newValue;
  23. }
  24. /**
  25. * Distance to projection plane (should be the same units the like distance between the eyes)
  26. */
  27. get distanceToProjectionPlane() {
  28. return this._distanceToProjectionPlane;
  29. }
  30. /**
  31. * Creates a new StereoscopicScreenUniversalCamera
  32. * @param name defines camera name
  33. * @param position defines initial position
  34. * @param scene defines the hosting scene
  35. * @param distanceToProjectionPlane defines distance between each color axis. The rig cameras will receive this as their negative z position!
  36. * @param distanceBetweenEyes defines is stereoscopic is done side by side or over under
  37. */
  38. constructor(name, position, scene, distanceToProjectionPlane = 1, distanceBetweenEyes = 0.065) {
  39. super(name, position, scene);
  40. this._distanceBetweenEyes = distanceBetweenEyes;
  41. this._distanceToProjectionPlane = distanceToProjectionPlane;
  42. this.setCameraRigMode(Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL, {
  43. stereoHalfAngle: 0,
  44. });
  45. this._cameraRigParams.stereoHalfAngle = 0;
  46. this._cameraRigParams.interaxialDistance = distanceBetweenEyes;
  47. }
  48. /**
  49. * Gets camera class name
  50. * @returns StereoscopicScreenUniversalCamera
  51. */
  52. getClassName() {
  53. return "StereoscopicUniversalCamera";
  54. }
  55. /**
  56. * @internal
  57. */
  58. createRigCamera(name) {
  59. const camera = new TargetCamera(name, Vector3.Zero(), this.getScene());
  60. const transform = new TransformNode("tm_" + name, this.getScene());
  61. camera.parent = transform;
  62. transform.setPivotMatrix(Matrix.Identity(), false);
  63. camera.isRigCamera = true;
  64. camera.rigParent = this;
  65. return camera;
  66. }
  67. /**
  68. * @internal
  69. */
  70. _updateRigCameras() {
  71. for (let cameraIndex = 0; cameraIndex < this._rigCameras.length; cameraIndex++) {
  72. const cam = this._rigCameras[cameraIndex];
  73. cam.minZ = this.minZ;
  74. cam.maxZ = this.maxZ;
  75. cam.fov = this.fov;
  76. cam.upVector.copyFrom(this.upVector);
  77. if (cam.rotationQuaternion) {
  78. cam.rotationQuaternion.copyFrom(this.rotationQuaternion);
  79. }
  80. else {
  81. cam.rotation.copyFrom(this.rotation);
  82. }
  83. this._updateCamera(this._rigCameras[cameraIndex], cameraIndex);
  84. }
  85. }
  86. _updateCamera(camera, cameraIndex) {
  87. const b = this.distanceBetweenEyes / 2;
  88. const z = b / this.distanceToProjectionPlane;
  89. camera.position.copyFrom(this.position);
  90. camera.position.addInPlaceFromFloats(cameraIndex === 0 ? -b : b, 0, -this._distanceToProjectionPlane);
  91. const transform = camera.parent;
  92. const m = transform.getPivotMatrix();
  93. m.setTranslationFromFloats(cameraIndex === 0 ? b : -b, 0, 0);
  94. m.setRowFromFloats(2, cameraIndex === 0 ? z : -z, 0, 1, 0);
  95. transform.setPivotMatrix(m, false);
  96. }
  97. _setRigMode() {
  98. this._rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1);
  99. this._rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);
  100. for (let cameraIndex = 0; cameraIndex < this._rigCameras.length; cameraIndex++) {
  101. this._updateCamera(this._rigCameras[cameraIndex], cameraIndex);
  102. }
  103. }
  104. }
  105. //# sourceMappingURL=stereoscopicScreenUniversalCamera.js.map