|
@@ -7,6 +7,7 @@ module BABYLON {
|
|
|
export class TargetCamera extends Camera {
|
|
|
private static _RigCamTransformMatrix = new Matrix();
|
|
|
private static _TargetTransformMatrix = new Matrix();
|
|
|
+ private static _TargetFocalPoint = new Vector3();
|
|
|
|
|
|
/**
|
|
|
* Define the current direction the camera is moving to
|
|
@@ -54,6 +55,8 @@ module BABYLON {
|
|
|
/** @hidden */
|
|
|
public _currentTarget = Vector3.Zero();
|
|
|
/** @hidden */
|
|
|
+ public _initialFocalDistance = 1;
|
|
|
+ /** @hidden */
|
|
|
public _viewMatrix = Matrix.Zero();
|
|
|
/** @hidden */
|
|
|
public _camMatrix = Matrix.Zero();
|
|
@@ -213,6 +216,8 @@ module BABYLON {
|
|
|
public setTarget(target: Vector3): void {
|
|
|
this.upVector.normalize();
|
|
|
|
|
|
+ this._initialFocalDistance = target.subtract(this.position).length();
|
|
|
+
|
|
|
if (this.position.z === target.z) {
|
|
|
this.position.z += Epsilon;
|
|
|
}
|
|
@@ -446,11 +451,8 @@ module BABYLON {
|
|
|
//provisionnaly using _cameraRigParams.stereoHalfAngle instead of calculations based on _cameraRigParams.interaxialDistance:
|
|
|
var leftSign = (this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED) ? 1 : -1;
|
|
|
var rightSign = (this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED) ? -1 : 1;
|
|
|
- this._getRigCamPosition(this._cameraRigParams.stereoHalfAngle * leftSign, camLeft.position);
|
|
|
- this._getRigCamPosition(this._cameraRigParams.stereoHalfAngle * rightSign, camRight.position);
|
|
|
-
|
|
|
- camLeft.setTarget(this.getTarget());
|
|
|
- camRight.setTarget(this.getTarget());
|
|
|
+ this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * leftSign, camLeft);
|
|
|
+ this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * rightSign, camRight);
|
|
|
break;
|
|
|
|
|
|
case Camera.RIG_MODE_VR:
|
|
@@ -469,15 +471,21 @@ module BABYLON {
|
|
|
super._updateRigCameras();
|
|
|
}
|
|
|
|
|
|
- private _getRigCamPosition(halfSpace: number, result: Vector3) {
|
|
|
+ private _getRigCamPositionAndTarget(halfSpace: number, rigCamera: TargetCamera) {
|
|
|
var target = this.getTarget();
|
|
|
- Matrix.TranslationToRef(-target.x, -target.y, -target.z, TargetCamera._TargetTransformMatrix);
|
|
|
+ target.subtractToRef(this.position, TargetCamera._TargetFocalPoint);
|
|
|
+
|
|
|
+ TargetCamera._TargetFocalPoint.normalize().scaleInPlace(this._initialFocalDistance);
|
|
|
+ var newFocalTarget = TargetCamera._TargetFocalPoint.addInPlace(this.position);
|
|
|
+
|
|
|
+ Matrix.TranslationToRef(-newFocalTarget.x, -newFocalTarget.y, -newFocalTarget.z, TargetCamera._TargetTransformMatrix);
|
|
|
TargetCamera._TargetTransformMatrix.multiplyToRef(Matrix.RotationY(halfSpace), TargetCamera._RigCamTransformMatrix);
|
|
|
- Matrix.TranslationToRef(target.x, target.y, target.z, TargetCamera._TargetTransformMatrix);
|
|
|
+ Matrix.TranslationToRef(newFocalTarget.x, newFocalTarget.y, newFocalTarget.z, TargetCamera._TargetTransformMatrix);
|
|
|
|
|
|
TargetCamera._RigCamTransformMatrix.multiplyToRef(TargetCamera._TargetTransformMatrix, TargetCamera._RigCamTransformMatrix);
|
|
|
|
|
|
- Vector3.TransformCoordinatesToRef(this.position, TargetCamera._RigCamTransformMatrix, result);
|
|
|
+ Vector3.TransformCoordinatesToRef(this.position, TargetCamera._RigCamTransformMatrix, rigCamera.position);
|
|
|
+ rigCamera.setTarget(newFocalTarget);
|
|
|
}
|
|
|
|
|
|
/**
|