Skip to content

Commit bdfe9e6

Browse files
authored
Fix frame-rate dependent camera rotation and zoom in CameraControls (#8494)
1 parent c0b2021 commit bdfe9e6

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

scripts/esm/camera-controls.mjs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ class CameraControls extends Script {
703703
* @param {number} dt - The time delta.
704704
*/
705705
update(dt) {
706+
dt = Math.min(dt, 0.1);
706707
const { keyCode } = KeyboardMouseSource;
707708

708709
const { key, button, mouse, wheel } = this._desktopInput.read();
@@ -741,14 +742,16 @@ class CameraControls extends Script {
741742
const desktopPan = +(this._state.shift || this._state.mouse[1]);
742743
const mobileJoystick = +(this._flyMobileInput.layout.endsWith('joystick'));
743744

744-
// multipliers
745+
// rate-based multipliers (keyboard, gamepad, virtual joystick)
745746
const moveMult = (this._state.shift ? this.moveFastSpeed : this._state.ctrl ?
746747
this.moveSlowSpeed : this.moveSpeed) * dt;
747-
const zoomMult = this.zoomSpeed * 60 * dt;
748-
const zoomTouchMult = zoomMult * this.zoomPinchSens;
749-
const rotateMult = this.rotateSpeed * 60 * dt;
750748
const rotateJoystickMult = this.rotateSpeed * this.rotateJoystickSens * 60 * dt;
751749

750+
// delta-based multipliers (mouse, touch, wheel)
751+
const rotateDeltaMult = this.rotateSpeed;
752+
const zoomDeltaMult = this.zoomSpeed;
753+
const zoomTouchDeltaMult = this.zoomSpeed * this.zoomPinchSens;
754+
752755
const { deltas } = frame;
753756

754757
// desktop move
@@ -758,13 +761,13 @@ class CameraControls extends Script {
758761
const panMove = screenToWorld(this._camera, mouse[0], mouse[1], this._pose.distance);
759762
v.add(panMove.mulScalar(orbit * desktopPan * +this.enablePan));
760763
const wheelMove = tmpV2.set(0, 0, wheel[0]);
761-
v.add(wheelMove.mulScalar(orbit * zoomMult));
764+
v.add(wheelMove.mulScalar(orbit * zoomDeltaMult));
762765
deltas.move.append([v.x, v.y, v.z]);
763766

764767
// desktop rotate
765768
v.set(0, 0, 0);
766769
const mouseRotate = tmpV2.set(mouse[0], mouse[1], 0);
767-
v.add(mouseRotate.mulScalar((1 - (orbit * desktopPan)) * rotateMult));
770+
v.add(mouseRotate.mulScalar((1 - (orbit * desktopPan)) * rotateDeltaMult));
768771
deltas.rotate.append([v.x, v.y, v.z]);
769772

770773
// mobile move
@@ -774,15 +777,15 @@ class CameraControls extends Script {
774777
const orbitMove = screenToWorld(this._camera, touch[0], touch[1], this._pose.distance);
775778
v.add(orbitMove.mulScalar(orbit * double * +this.enablePan));
776779
const pinchMove = tmpV2.set(0, 0, pinch[0]);
777-
v.add(pinchMove.mulScalar(orbit * double * zoomTouchMult));
780+
v.add(pinchMove.mulScalar(orbit * double * zoomTouchDeltaMult));
778781
deltas.move.append([v.x, v.y, v.z]);
779782

780783
// mobile rotate
781784
v.set(0, 0, 0);
782785
const orbitRotate = tmpV2.set(touch[0], touch[1], 0);
783-
v.add(orbitRotate.mulScalar(orbit * (1 - double) * rotateMult));
786+
v.add(orbitRotate.mulScalar(orbit * (1 - double) * rotateDeltaMult));
784787
const flyRotate = tmpV2.set(rightInput[0], rightInput[1], 0);
785-
v.add(flyRotate.mulScalar(fly * (mobileJoystick ? rotateJoystickMult : rotateMult)));
788+
v.add(flyRotate.mulScalar(fly * (mobileJoystick ? rotateJoystickMult : rotateDeltaMult)));
786789
deltas.rotate.append([v.x, v.y, v.z]);
787790

788791
// gamepad move

0 commit comments

Comments
 (0)