Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Camera: Modify Camera Movement to work off of time, instead of frame rate, revisited #14809

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/dev/core/src/Animations/animatable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,12 @@ Scene.prototype._animate = function (customDeltaTime?: number): void {
this._animationTimeLast = now;
}

this.deltaTime = customDeltaTime !== undefined ? customDeltaTime : this.useConstantAnimationDeltaTime ? 16.0 : (now - this._animationTimeLast) * this.animationTimeScale;
this.deltaTime =
customDeltaTime !== undefined
? customDeltaTime
: this.useConstantAnimationDeltaTime
? this.constantAnimationDeltaTime
: (now - this._animationTimeLast) * this.animationTimeScale;
this._animationTimeLast = now;

const animatables = this._activeAnimatables;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,11 @@ export class AutoRotationBehavior implements Behavior<ArcRotateCamera> {
this._attachedCamera.inertialRadiusOffset !== 0 ||
this._attachedCamera.inertialPanningX !== 0 ||
this._attachedCamera.inertialPanningY !== 0 ||
this._attachedCamera.pendingAlphaOffset !== 0 ||
this._attachedCamera.pendingBetaOffset !== 0 ||
this._attachedCamera.pendingRadiusOffset !== 0 ||
this._attachedCamera.pendingPanningX !== 0 ||
this._attachedCamera.pendingPanningY !== 0 ||
this._isPointerDown
);
}
Expand Down
5 changes: 5 additions & 0 deletions packages/dev/core/src/Behaviors/Cameras/framingBehavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,11 @@ export class FramingBehavior implements Behavior<ArcRotateCamera> {
this._attachedCamera.inertialRadiusOffset !== 0 ||
this._attachedCamera.inertialPanningX !== 0 ||
this._attachedCamera.inertialPanningY !== 0 ||
this._attachedCamera.pendingAlphaOffset !== 0 ||
this._attachedCamera.pendingBetaOffset !== 0 ||
this._attachedCamera.pendingRadiusOffset !== 0 ||
this._attachedCamera.pendingPanningX !== 0 ||
this._attachedCamera.pendingPanningY !== 0 ||
this._isPointerDown
);
}
Expand Down
3 changes: 2 additions & 1 deletion packages/dev/core/src/Behaviors/Meshes/fadeInOutBehavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type { Mesh } from "../../Meshes/mesh";
import type { Nullable } from "../../types";
import type { Observer } from "core/Misc/observable";
import type { Scene } from "core/scene";
import { Constants } from "core/Engines/constants";

/**
* A behavior that when attached to a mesh will allow the mesh to fade in and out
Expand Down Expand Up @@ -42,7 +43,7 @@ export class FadeInOutBehavior implements Behavior<Mesh> {
this.fadeOutDelay = value;
}

private _millisecondsPerFrame = 1000 / 60;
private _millisecondsPerFrame = Constants.STANDARD_TIME_STEP;
private _hovered = false;
private _hoverValue = 0;
private _ownerNode: Nullable<Mesh> = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,14 @@ export class ArcRotateCameraGamepadInput implements ICameraInput<ArcRotateCamera
if (rsValues.x != 0) {
const normalizedRX = rsValues.x / this.gamepadRotationSensibility;
if (normalizedRX != 0 && Math.abs(normalizedRX) > 0.005) {
camera.inertialAlphaOffset += normalizedRX;
camera.pendingAlphaOffset += normalizedRX;
}
}

if (rsValues.y != 0) {
const normalizedRY = (rsValues.y / this.gamepadRotationSensibility) * this._yAxisScale;
if (normalizedRY != 0 && Math.abs(normalizedRY) > 0.005) {
camera.inertialBetaOffset += normalizedRY;
camera.pendingBetaOffset += normalizedRY;
}
}
}
Expand All @@ -115,7 +115,7 @@ export class ArcRotateCameraGamepadInput implements ICameraInput<ArcRotateCamera
if (lsValues && lsValues.y != 0) {
const normalizedLY = lsValues.y / this.gamepadMoveSensibility;
if (normalizedLY != 0 && Math.abs(normalizedLY) > 0.005) {
this.camera.inertialRadiusOffset -= normalizedLY;
this.camera.pendingRadiusOffset -= normalizedLY;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,31 +187,31 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput<ArcRotateC
const keyCode = this._keys[index];
if (this.keysLeft.indexOf(keyCode) !== -1) {
if (this._ctrlPressed && this.camera._useCtrlForPanning) {
camera.inertialPanningX -= 1 / this.panningSensibility;
camera.pendingPanningX -= 1 / this.panningSensibility;
} else {
camera.inertialAlphaOffset -= this.angularSpeed;
camera.pendingAlphaOffset -= this.angularSpeed;
}
} else if (this.keysUp.indexOf(keyCode) !== -1) {
if (this._ctrlPressed && this.camera._useCtrlForPanning) {
camera.inertialPanningY += 1 / this.panningSensibility;
camera.pendingPanningY += 1 / this.panningSensibility;
} else if (this._altPressed && this.useAltToZoom) {
camera.inertialRadiusOffset += 1 / this.zoomingSensibility;
camera.pendingRadiusOffset += 1 / this.zoomingSensibility;
} else {
camera.inertialBetaOffset -= this.angularSpeed;
camera.pendingBetaOffset -= this.angularSpeed;
}
} else if (this.keysRight.indexOf(keyCode) !== -1) {
if (this._ctrlPressed && this.camera._useCtrlForPanning) {
camera.inertialPanningX += 1 / this.panningSensibility;
camera.pendingPanningX += 1 / this.panningSensibility;
} else {
camera.inertialAlphaOffset += this.angularSpeed;
camera.pendingAlphaOffset += this.angularSpeed;
}
} else if (this.keysDown.indexOf(keyCode) !== -1) {
if (this._ctrlPressed && this.camera._useCtrlForPanning) {
camera.inertialPanningY -= 1 / this.panningSensibility;
camera.pendingPanningY -= 1 / this.panningSensibility;
} else if (this._altPressed && this.useAltToZoom) {
camera.inertialRadiusOffset -= 1 / this.zoomingSensibility;
camera.pendingRadiusOffset -= 1 / this.zoomingSensibility;
} else {
camera.inertialBetaOffset += this.angularSpeed;
camera.pendingBetaOffset += this.angularSpeed;
}
} else if (this.keysReset.indexOf(keyCode) !== -1) {
if (camera.useInputToRestoreState) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam

this._zoomToMouse(delta);
} else {
this.camera.inertialRadiusOffset += delta;
this.camera.pendingRadiusOffset += delta;
}
}

Expand Down Expand Up @@ -165,7 +165,13 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam
}

const camera = this.camera;
const motion = 0.0 + camera.inertialAlphaOffset + camera.inertialBetaOffset + camera.inertialRadiusOffset;
const motion =
camera.inertialAlphaOffset !== 0 ||
camera.inertialBetaOffset !== 0 ||
camera.inertialRadiusOffset !== 0 ||
camera.pendingAlphaOffset !== 0 ||
camera.pendingBetaOffset !== 0 ||
camera.pendingRadiusOffset !== 0;
if (motion) {
// if zooming is still happening as a result of inertia, then we also need to update
// the hit plane.
Expand Down Expand Up @@ -236,14 +242,14 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam
const inertiaComp = 1 - camera.inertia;
if (camera.lowerRadiusLimit) {
const lowerLimit = camera.lowerRadiusLimit ?? 0;
if (camera.radius - (camera.inertialRadiusOffset + delta) / inertiaComp < lowerLimit) {
delta = (camera.radius - lowerLimit) * inertiaComp - camera.inertialRadiusOffset;
if (camera.radius - (camera.inertialRadiusOffset + camera.pendingRadiusOffset + delta) / inertiaComp < lowerLimit) {
delta = (camera.radius - lowerLimit) * inertiaComp - camera.inertialRadiusOffset - camera.pendingRadiusOffset;
}
}
if (camera.upperRadiusLimit) {
const upperLimit = camera.upperRadiusLimit ?? 0;
if (camera.radius - (camera.inertialRadiusOffset + delta) / inertiaComp > upperLimit) {
delta = (camera.radius - upperLimit) * inertiaComp - camera.inertialRadiusOffset;
if (camera.radius - (camera.inertialRadiusOffset + camera.pendingRadiusOffset + delta) / inertiaComp > upperLimit) {
delta = (camera.radius - upperLimit) * inertiaComp - camera.inertialRadiusOffset - camera.pendingRadiusOffset;
}
}

Expand All @@ -260,7 +266,7 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam
directionToZoomLocation.scaleInPlace(inertiaComp);
this._inertialPanning.addInPlace(directionToZoomLocation);

camera.inertialRadiusOffset += delta;
camera.pendingRadiusOffset += delta;
}

// Sets x y or z of passed in vector to zero if less than Epsilon.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
if (this.panningSensibility !== 0 && previousMultiTouchPanPosition && multiTouchPanPosition) {
const moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;
const moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;
this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility;
this.camera.inertialPanningY += moveDeltaY / this.panningSensibility;
this.camera.pendingPanningX += -moveDeltaX / this.panningSensibility;
this.camera.pendingPanningY += moveDeltaY / this.panningSensibility;
}
}

Expand All @@ -131,9 +131,9 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
if (this.useNaturalPinchZoom) {
this.camera.radius = (radius * Math.sqrt(previousPinchSquaredDistance)) / Math.sqrt(pinchSquaredDistance);
} else if (this.pinchDeltaPercentage) {
this.camera.inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 * radius * this.pinchDeltaPercentage;
this.camera.pendingRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 * radius * this.pinchDeltaPercentage;
} else {
this.camera.inertialRadiusOffset +=
this.camera.pendingRadiusOffset +=
(pinchSquaredDistance - previousPinchSquaredDistance) /
((this.pinchPrecision * (this.pinchInwards ? 1 : -1) * (this.angularSensibilityX + this.angularSensibilityY)) / 2);
}
Expand All @@ -147,11 +147,11 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
*/
public onTouch(point: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {
if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) {
this.camera.inertialPanningX += -offsetX / this.panningSensibility;
this.camera.inertialPanningY += offsetY / this.panningSensibility;
this.camera.pendingPanningX += -offsetX / this.panningSensibility;
this.camera.pendingPanningY += offsetY / this.panningSensibility;
} else {
this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX;
this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY;
this.camera.pendingAlphaOffset -= offsetX / this.angularSensibilityX;
this.camera.pendingBetaOffset -= offsetY / this.angularSensibilityY;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ export class FlyCameraKeyboardInput implements ICameraInput<FlyCamera> {

camera.getViewMatrix().invertToRef(camera._cameraTransformMatrix);
Vector3.TransformNormalToRef(camera._localDirection, camera._cameraTransformMatrix, camera._transformedDirection);
camera.cameraDirection.addInPlace(camera._transformedDirection);
camera.pendingCameraDirection.addInPlace(camera._transformedDirection);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ export class FreeCameraGamepadInput implements ICameraInput<FreeCamera> {
this._vector3.copyFromFloats(lsValues.x * speed, 0, -lsValues.y * speed);

Vector3.TransformCoordinatesToRef(this._vector3, this._cameraTransform, this._deltaTransform);
camera.cameraDirection.addInPlace(this._deltaTransform);
camera.pendingCameraDirection.addInPlace(this._deltaTransform);
this._vector2.copyFromFloats(rsValues.y, rsValues.x);
camera.cameraRotation.addInPlace(this._vector2);
camera.pendingCameraRotation.addInPlace(this._vector2);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,16 +205,16 @@ export class FreeCameraKeyboardMoveInput implements ICameraInput<FreeCamera> {
camera._localDirection.copyFromFloats(0, -speed, 0);
} else if (this.keysRotateLeft.indexOf(keyCode) !== -1) {
camera._localDirection.copyFromFloats(0, 0, 0);
camera.cameraRotation.y -= this._getLocalRotation();
camera.pendingCameraRotation.y -= this._getLocalRotation();
} else if (this.keysRotateRight.indexOf(keyCode) !== -1) {
camera._localDirection.copyFromFloats(0, 0, 0);
camera.cameraRotation.y += this._getLocalRotation();
camera.pendingCameraRotation.y += this._getLocalRotation();
} else if (this.keysRotateUp.indexOf(keyCode) !== -1) {
camera._localDirection.copyFromFloats(0, 0, 0);
camera.cameraRotation.x -= this._getLocalRotation();
camera.pendingCameraRotation.x -= this._getLocalRotation();
} else if (this.keysRotateDown.indexOf(keyCode) !== -1) {
camera._localDirection.copyFromFloats(0, 0, 0);
camera.cameraRotation.x += this._getLocalRotation();
camera.pendingCameraRotation.x += this._getLocalRotation();
}

if (camera.getScene().useRightHandedSystem) {
Expand All @@ -223,7 +223,7 @@ export class FreeCameraKeyboardMoveInput implements ICameraInput<FreeCamera> {

camera.getViewMatrix().invertToRef(camera._cameraTransformMatrix);
Vector3.TransformNormalToRef(camera._localDirection, camera._cameraTransformMatrix, camera._transformedDirection);
camera.cameraDirection.addInPlace(camera._transformedDirection);
camera.pendingCameraDirection.addInPlace(camera._transformedDirection);
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions packages/dev/core/src/Cameras/Inputs/freeCameraMouseInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ export class FreeCameraMouseInput implements ICameraInput<FreeCamera> {
const offsetY = evt.clientY - this._previousPosition.y;

if (this._allowCameraRotation) {
this.camera.cameraRotation.y += offsetX / this.angularSensibility;
this.camera.cameraRotation.x += offsetY / this.angularSensibility;
this.camera.pendingCameraRotation.y += offsetX / this.angularSensibility;
this.camera.pendingCameraRotation.x += offsetY / this.angularSensibility;
}
this.onPointerMovedObservable.notifyObservers({ offsetX: offsetX, offsetY: offsetY });

Expand All @@ -172,10 +172,10 @@ export class FreeCameraMouseInput implements ICameraInput<FreeCamera> {
const handednessMultiplier = this.camera._calculateHandednessMultiplier();
const offsetX = evt.movementX * handednessMultiplier;

this.camera.cameraRotation.y += offsetX / this.angularSensibility;
this.camera.pendingCameraRotation.y += offsetX / this.angularSensibility;

const offsetY = evt.movementY;
this.camera.cameraRotation.x += offsetY / this.angularSensibility;
this.camera.pendingCameraRotation.x += offsetY / this.angularSensibility;

this._previousPosition = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,10 @@ export class FreeCameraMouseWheelInput extends BaseCameraMouseWheelInput {
Vector3.TransformNormalToRef(this._moveRelative, cameraTransformMatrix, transformedDirection);

// Apply updates to camera position.
this.camera.cameraRotation.x += this._rotateRelative.x / 200;
this.camera.cameraRotation.y += this._rotateRelative.y / 200;
this.camera.cameraDirection.addInPlace(transformedDirection);
this.camera.cameraDirection.addInPlace(this._moveScene);
this.camera.pendingCameraRotation.x += this._rotateRelative.x / 200;
this.camera.pendingCameraRotation.y += this._rotateRelative.y / 200;
this.camera.pendingCameraDirection.addInPlace(transformedDirection);
this.camera.pendingCameraDirection.addInPlace(this._moveScene);

// Call the base class implementation to handle observers and do cleanup.
super.checkInputs();
Expand Down
6 changes: 3 additions & 3 deletions packages/dev/core/src/Cameras/Inputs/freeCameraTouchInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,18 +186,18 @@ export class FreeCameraTouchInput implements ICameraInput<FreeCamera> {

const camera = this.camera;
const handednessMultiplier = camera._calculateHandednessMultiplier();
camera.cameraRotation.y = (handednessMultiplier * this._offsetX) / this.touchAngularSensibility;
camera.pendingCameraRotation.y = (handednessMultiplier * this._offsetX) / this.touchAngularSensibility;

const rotateCamera = (this.singleFingerRotate && this._pointerPressed.length === 1) || (!this.singleFingerRotate && this._pointerPressed.length > 1);

if (rotateCamera) {
camera.cameraRotation.x = -this._offsetY / this.touchAngularSensibility;
camera.pendingCameraRotation.x = -this._offsetY / this.touchAngularSensibility;
} else {
const speed = camera._computeLocalCameraSpeed();
const direction = new Vector3(0, 0, this.touchMoveSensibility !== 0 ? (speed * this._offsetY) / this.touchMoveSensibility : 0);

Matrix.RotationYawPitchRollToRef(camera.rotation.y, camera.rotation.x, 0, camera._cameraRotationMatrix);
camera.cameraDirection.addInPlace(Vector3.TransformCoordinates(direction, camera._cameraRotationMatrix));
camera.pendingCameraDirection.addInPlace(Vector3.TransformCoordinates(direction, camera._cameraRotationMatrix));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ export class FreeCameraVirtualJoystickInput implements ICameraInput<FreeCamera>
new Vector3(this._leftjoystick.deltaPosition.x * speed, this._leftjoystick.deltaPosition.y * speed, this._leftjoystick.deltaPosition.z * speed),
cameraTransform
);
camera.cameraDirection = camera.cameraDirection.add(deltaTransform);
camera.cameraRotation = camera.cameraRotation.addVector3(this._rightjoystick.deltaPosition);
camera.pendingCameraDirection = camera.pendingCameraDirection.add(deltaTransform);
camera.pendingCameraRotation = camera.pendingCameraRotation.addVector3(this._rightjoystick.deltaPosition);

if (!this._leftjoystick.pressed) {
this._leftjoystick.deltaPosition = this._leftjoystick.deltaPosition.scale(0.9);
Expand Down