Skip to content

OrbitCamera

Spherical coordinate camera for 3D scene navigation.

Constructor

typescript
new OrbitCamera(options?: OrbitCameraOptions)

Options

PropertyTypeDefaultDescription
target[x, y, z][0, 0, 0]Point to orbit around
radiusnumber5Distance from target
thetanumber0Horizontal angle (radians)
phinumberπ/4Vertical angle (radians)
fovnumberπ/4Field of view (radians)
nearnumber0.1Near clipping plane
farnumber1000Far clipping plane
minRadiusnumber0.5Minimum zoom distance
maxRadiusnumber100Maximum zoom distance
minPhinumber0.01Minimum vertical angle
maxPhinumberπ - 0.01Maximum vertical angle

Properties

PropertyTypeDescription
target[x, y, z]Current target position
radiusnumberCurrent distance
thetanumberCurrent horizontal angle
phinumberCurrent vertical angle
fovnumberField of view
aspectnumberAspect ratio
nearnumberNear plane
farnumberFar plane

Methods

setAspect(aspect)

Set aspect ratio (width / height).

typescript
camera.setAspect(canvas.width / canvas.height);

rotate(deltaTheta, deltaPhi)

Rotate camera by delta angles.

typescript
camera.rotate(0.1, 0.05); // Rotate right and up

zoom(delta)

Zoom by delta radius (positive = zoom out).

typescript
camera.zoom(1); // Zoom out
camera.zoom(-1); // Zoom in

zoomFactor(factor)

Zoom by factor (1 = no change, <1 = zoom in, >1 = zoom out).

typescript
camera.zoomFactor(0.9); // Zoom in 10%

pan(deltaX, deltaY)

Pan camera target in world space.

typescript
camera.pan(1, 0); // Pan right

setTarget(x, y, z)

Set target position directly.

typescript
camera.setTarget(0, 0, 0);

setSpherical(theta, phi, radius)

Set camera position from spherical coordinates.

typescript
camera.setSpherical(Math.PI / 4, Math.PI / 4, 10);

getViewMatrix()

Get view matrix (Float32Array of 16 elements).

typescript
const view = camera.getViewMatrix();

getProjectionMatrix()

Get projection matrix.

typescript
const proj = camera.getProjectionMatrix();

getViewProjectionMatrix()

Get combined view-projection matrix.

typescript
const viewProj = camera.getViewProjectionMatrix();
gl.uniformMatrix4fv(loc, false, viewProj);

getEyePosition()

Get current eye position in world space.

typescript
const [x, y, z] = camera.getEyePosition();

getForwardDirection()

Get normalized forward direction.

typescript
const [fx, fy, fz] = camera.getForwardDirection();

reset()

Reset camera to default position.

typescript
camera.reset();

fitToBounds(minX, minY, minZ, maxX, maxY, maxZ)

Fit camera to view a bounding box.

typescript
camera.fitToBounds(-5, 0, -5, 5, 10, 5);

OrbitController

Mouse/touch interaction handler for OrbitCamera.

Constructor

typescript
new OrbitController(camera: OrbitCamera, element: HTMLElement, options?: OrbitControllerOptions)

Options

PropertyTypeDefaultDescription
rotateSpeednumber0.005Rotation sensitivity
zoomSpeednumber0.001Zoom sensitivity
panSpeednumber0.01Pan sensitivity
enableRotatebooleantrueEnable rotation
enableZoombooleantrueEnable zoom
enablePanbooleantrueEnable panning
rotateButtonnumber0Mouse button for rotate (0=left)
panButtonnumber2Mouse button for pan (2=right)
dampingFactornumber0.1Momentum damping (0-1)

Methods

onChange(callback)

Set callback for camera changes.

typescript
controller.onChange(() => {
  renderer.requestRender();
});

update()

Update damping (call each frame). Returns true if camera is still moving.

typescript
function animate() {
  const moving = controller.update();
  if (moving) renderer.render();
  requestAnimationFrame(animate);
}

stopMomentum()

Stop all momentum immediately.

typescript
controller.stopMomentum();

detach()

Remove event listeners.

typescript
controller.detach();

destroy()

Clean up all resources.

typescript
controller.destroy();

Interaction Mapping

ActionMouseTouch
RotateLeft click + drag1 finger drag
ZoomScroll wheelPinch 2 fingers
PanRight click + drag

Released under the MIT License.