API

Class CameraMovement

Base class for camera movement systems that convert raw input into framerate-independent camera deltas.

This class handles the physics layer: velocity tracking, inertial decay, speed multipliers, and per-frame delta computation. Input mapping (which physical inputs trigger which interactions) is handled by an InputMapper instance composed on each movement subclass as input.

Speed and inertia — Properties on this class that control how accumulated pixel deltas are converted to framerate-independent camera deltas via computeCurrentFrameDeltas():

  • panSpeed, rotationXSpeed, rotationYSpeed, zoomSpeed — units of movement per pixel
  • panInertia, rotationInertia, zoomInertia — velocity decay factor when input stops (0 = instant stop, 0.9 = smooth glide)

Hierarchy (View Summary)

Index
activeInput: boolean = false

Should be set by input classes to indicate whether there is active input this frame. This helps differentiate between 0 pixel delta due to no input vs user actively holding still.

panAccumulatedPixels: Vector3 = ...

Accumulated pixel delta (by input classes) for panning this frame Read by computeCurrentFrameDeltas() function and converted into panDeltaCurrentFrame (taking speed into account) Reset to zero after each frame

panDeltaCurrentFrame: Vector3 = ...

Pan delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from panPixelDelta (taking speed into account)

panInertia: number = 0.9

Inertia applied to the panning velocity when there is no user input. Higher inertia === slower decay, velocity retains more of its value each frame.

Note: ArcRotateCamera overrides this from camera.panningInertia (which defaults to camera.inertia).

panSpeed: number = 1

Desired coordinate unit movement per input pixel when panning

referenceFrameRate: number = DefaultReferenceFrameRate

Framerate (Hz) at which inertia values are calibrated. Default 60 matches legacy camera feel at any actual refresh rate. Override to 120, 144, etc. only if your app was tuned on that specific refresh rate under the legacy (framerate-dependent) camera math and you want to preserve that exact decay characteristic. Most applications should leave this at 60.

rotationAccumulatedPixels: Vector3 = ...

Accumulated pixel delta (by input classes) for rotation this frame Read by computeCurrentFrameDeltas() function and converted into rotationDeltaCurrentFrame (taking speed into account) Reset to zero after each frame

rotationDeltaCurrentFrame: Vector3 = ...

Rotation delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from rotationPixelDelta (taking speed into account)

rotationInertia: number = 0.9

Inertia applied to the rotation velocity when there is no user input. Higher inertia === slower decay, velocity retains more of its value each frame.

Note: ArcRotateCamera syncs this from camera.inertia via an accessor on the camera class. To tune independently, override inside scene.onBeforeRenderObservable after camera.inertia is read.

rotationXSpeed: number = 1

Desired radians movement per input pixel when rotating along x axis

rotationYSpeed: number = 1

Desired radians movement per input pixel when rotating along y axis

speed: number = 1

Global speed multiplier applied to all movement (pan, rotation, zoom). Acts as a master scale factor on top of the individual speed properties.

zoomAccumulatedPixels: number = 0

Accumulated pixel delta (by input classes) for zoom this frame Read by computeCurrentFrameDeltas() function and converted into zoomDeltaCurrentFrame (taking speed into account) Reset to zero after each frame

zoomDeltaCurrentFrame: number = 0

Zoom delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from zoomPixelDelta (taking speed into account)

zoomInertia: number = 0.9

Inertia applied to the zoom velocity when there is no user input. Higher inertia === slower decay, velocity retains more of its value each frame.

Note: ArcRotateCamera syncs this from camera.inertia via an accessor on the camera class. To tune independently, override inside scene.onBeforeRenderObservable after camera.inertia is read.

zoomSpeed: number = 1

Desired coordinate unit movement per input pixel when zooming

  • get isInterpolating(): boolean

    Returns true when the camera is playing an interpolating (fly-to) animation. Useful for suppressing user-input movement while a programmatic animation is active.

    Returns boolean

  • When called, will take the accumulated pixel deltas set by input classes and convert them into current frame deltas, stored in currentFrameMovementDelta properties Takes speed, scaling, inertia, and framerate into account to ensure smooth movement Zeros out pixelDeltas before returning

    Returns void

  • Returns the per-frame decay factor for a given inertia, adjusted to this frame's dt. At the reference frame rate, returns inertia unchanged (matches legacy per-frame *= inertia). Use this when implementing custom decaying accumulators (e.g. zoom-to-cursor coupled pan) that need framerate-independent glide duration.

    Parameters

    • inertia: number

      The inertia value (0-1) whose per-frame decay factor is needed.

    Returns number

    The decay factor to multiply a value by this frame.

  • Returns the input-scale factor to apply to an impulse injected into a decaying accumulator so that the integrated total is framerate-independent and matches legacy at 60fps. At the reference frame rate, returns 1 (no-op). At high fps, scales the impulse down so the sum over the decay tail stays equal to impulse / (1 - inertia) — the legacy total.

    Parameters

    • inertia: number

      The inertia value (0-1) used by the accumulator.

    Returns number

    The scaling factor to multiply an impulse by before adding it to the accumulator.

  • Resets the rotation velocity and accumulated pixels, stopping any in-progress rotation inertia. Called when inertialAlphaOffset or inertialBetaOffset are explicitly zeroed (backward compat).

    Returns void

  • Resets the zoom velocity and accumulated pixels, stopping any in-progress zoom inertia. Called when inertialRadiusOffset is explicitly zeroed out (backward compat).

    Returns void