|
@@ -74,6 +74,41 @@ export class ArcRotateCamera extends TargetCamera {
|
|
|
this.setPosition(newPosition);
|
|
|
}
|
|
|
|
|
|
+ @serializeAsVector3("upVector")
|
|
|
+ protected _upVector = Vector3.Up();
|
|
|
+
|
|
|
+ protected _upToYMatrix: Matrix;
|
|
|
+ protected _YToUpMatrix: Matrix;
|
|
|
+
|
|
|
+ /**The vector the camera should consider as up. (default is Vector3(0, 1, 0) aka Vector3.Up())
|
|
|
+ * Setting this will copy the given vec to the camera's upVector, and set rotation matrices to and from the Y up.
|
|
|
+ * DO NOT set the up vector using copyFrom or copyFromFloats, as this bypasses setting the above matrices.
|
|
|
+ */
|
|
|
+ set upVector(vec: Vector3) {
|
|
|
+ if (!this._upToYMatrix) {
|
|
|
+ this._YToUpMatrix = new Matrix();
|
|
|
+ this._upToYMatrix = new Matrix();
|
|
|
+
|
|
|
+ this._upVector = Vector3.Zero();
|
|
|
+ }
|
|
|
+
|
|
|
+ vec.normalize();
|
|
|
+ this._upVector.copyFrom(vec);
|
|
|
+ this.setMatUp(); // still more efficient to calculate this once
|
|
|
+ }
|
|
|
+
|
|
|
+ get upVector() {
|
|
|
+ return this._upVector;
|
|
|
+ }
|
|
|
+
|
|
|
+ setMatUp() {
|
|
|
+ // from y-up to custom-up (used in _getViewMatrix)
|
|
|
+ Matrix.RotationAlignToRef(Vector3.UpReadOnly, this._upVector, this._YToUpMatrix);
|
|
|
+
|
|
|
+ // from custom-up to y-up (used in rebuildAnglesAndRadians)
|
|
|
+ Matrix.RotationAlignToRef(this._upVector, Vector3.UpReadOnly, this._upToYMatrix);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Current inertia value on the longitudinal axis.
|
|
|
* The bigger this number the longer it will take for the camera to stop.
|
|
@@ -574,8 +609,6 @@ export class ArcRotateCamera extends TargetCamera {
|
|
|
protected _targetBoundingCenter: Nullable<Vector3>;
|
|
|
|
|
|
private _computationVector: Vector3 = Vector3.Zero();
|
|
|
- private _tempAxisVector: Vector3;
|
|
|
- private _tempAxisRotationMatrix: Matrix;
|
|
|
|
|
|
/**
|
|
|
* Instantiates a new ArcRotateCamera in a given scene
|
|
@@ -942,22 +975,8 @@ export class ArcRotateCamera extends TargetCamera {
|
|
|
this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);
|
|
|
|
|
|
// Rotate according to up vector
|
|
|
- if (this.upVector.x !== 0 || this.upVector.y !== 1.0 || this.upVector.z !== 0) {
|
|
|
-
|
|
|
- if (!this._tempAxisVector) {
|
|
|
- this._tempAxisVector = new Vector3();
|
|
|
- this._tempAxisRotationMatrix = new Matrix();
|
|
|
- }
|
|
|
-
|
|
|
- Vector3.CrossToRef(Vector3.Up(), this.upVector, this._tempAxisVector);
|
|
|
- this._tempAxisVector.normalize();
|
|
|
-
|
|
|
- let angle = Math.acos(Vector3.Dot(Vector3.UpReadOnly, this.upVector));
|
|
|
-
|
|
|
- Matrix.RotationAxisToRef(this._tempAxisVector, angle, this._tempAxisRotationMatrix);
|
|
|
-
|
|
|
- this._tempAxisVector.copyFrom(this._computationVector);
|
|
|
- Vector3.TransformCoordinatesToRef(this._tempAxisVector, this._tempAxisRotationMatrix, this._computationVector);
|
|
|
+ if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {
|
|
|
+ Vector3.TransformCoordinatesToRef(this._computationVector, this._YToUpMatrix, this._computationVector);
|
|
|
}
|
|
|
|
|
|
target.addToRef(this._computationVector, this._newPosition);
|