Skip to content

Instantly share code, notes, and snippets.

@neftaly
Created June 13, 2025 22:53
Show Gist options
  • Save neftaly/5e7bebda2ef4a613f6e95c82dbff5f42 to your computer and use it in GitHub Desktop.
Save neftaly/5e7bebda2ef4a613f6e95c82dbff5f42 to your computer and use it in GitHub Desktop.

Revisions

  1. neftaly created this gist Jun 13, 2025.
    38 changes: 38 additions & 0 deletions wheel.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    addEventListener("wheel", (event) => { })

    export const handleWheel = (event: PointerEvent, cameraConfig: Object) => (state) => {
    // TODO: Add support for Safari touchpad gesture events
    const {
    altKey,
    ctrlKey // `true` on trackpads when pinch-zooming (or ctrl key is pressed)
    } = event

    // Move camera (origin) when alt+wheeling
    if (altKey) {
    // Swap deltaX/deltaY if user is holding the ctrl key,
    // so that 1-directional mouse scrollwheels can be used to move both forward/back and left/right
    const [deltaX, deltaY] = ctrlKey
    ? [event.deltaY, event.deltaX]
    : [event.deltaX, event.deltaY]
    const {
    origin: [x, y, z]
    } = state
    const scaling = 50
    const origin = [x - deltaX / scaling, y, z - deltaY / scaling]
    return { origin }
    }

    // Rotate camera (coords)
    const {
    coords: [r, theta, phi]
    } = state
    // Swap deltaY/deltaZ if user is pinching (or ctrl+wheeling)
    const [deltaY, deltaZ] = ctrlKey
    ? [event.deltaZ, event.deltaY]
    : [event.deltaY, event.deltaZ]
    return [
    r + deltaY / (500 / r), // Dolly faster as we move out further
    theta - deltaZ / 100,
    phi + event.deltaX / 200
    ]
    }