Skip to content

Camera ​

Guide to camera control and animation.

Overview ​

The camera determines what part of the 3D scene is visible. Control it programmatically for automated tours, saved views, or responsive layouts.

Camera State ​

The camera state includes position, target, and up vector:

typescript
const state = graph.getCameraState();
// Returns:
// {
//   position: { x: 0, y: 0, z: 100 },
//   target: { x: 0, y: 0, z: 0 },
//   up: { x: 0, y: 1, z: 0 }
// }
  • position: Where the camera is located
  • target: What the camera is looking at
  • up: Which direction is "up" for the camera

Setting Camera Position ​

Direct Position Setting ​

typescript
// Set camera position
graph.setCameraPosition({ x: 0, y: 0, z: 100 });

// Set what the camera looks at
graph.setCameraTarget({ x: 0, y: 0, z: 0 });

Zoom to Fit ​

Automatically frame all nodes:

typescript
graph.zoomToFit();

With padding:

typescript
graph.zoomToFit({ padding: 1.2 }); // 20% extra space

Set Complete State ​

typescript
graph.setCameraState({
  position: { x: 50, y: 50, z: 100 },
  target: { x: 0, y: 0, z: 0 },
  up: { x: 0, y: 1, z: 0 }
});

Camera Animation ​

Animate camera movements for smooth transitions:

typescript
const newState = {
  position: { x: 100, y: 100, z: 200 },
  target: { x: 0, y: 0, z: 0 },
  up: { x: 0, y: 1, z: 0 }
};

graph.setCameraState(newState, {
  animate: true,
  duration: 1000,           // milliseconds
  easing: 'easeInOutQuad'   // easing function
});

Available easing functions:

  • linear
  • easeInQuad, easeOutQuad, easeInOutQuad
  • easeInCubic, easeOutCubic, easeInOutCubic
  • easeInExpo, easeOutExpo, easeInOutExpo

Camera Presets ​

Save and restore camera positions:

typescript
// Save current view
graph.saveCameraPreset('overview');

// Navigate to different part of graph
graph.setCameraPosition({ x: 200, y: 0, z: 50 });

// Restore saved view
graph.loadCameraPreset('overview');

// Restore with animation
graph.loadCameraPreset('overview', {
  animate: true,
  duration: 1000
});

Multiple Presets ​

typescript
// Save multiple presets
graph.saveCameraPreset('top');
graph.setCameraPosition({ x: 0, y: 100, z: 0 });
graph.setCameraTarget({ x: 0, y: 0, z: 0 });

graph.saveCameraPreset('side');
graph.setCameraPosition({ x: 100, y: 0, z: 0 });
graph.setCameraTarget({ x: 0, y: 0, z: 0 });

// Create a tour
const presets = ['overview', 'top', 'side'];
let current = 0;

function nextView() {
  current = (current + 1) % presets.length;
  graph.loadCameraPreset(presets[current], { animate: true });
}

2D vs 3D Camera ​

3D Mode (Default) ​

Full 3D navigation with orbit controls:

  • Mouse drag: Orbit around target
  • Scroll: Zoom in/out
  • Right-drag: Pan

2D Mode ​

Simplified camera for 2D layouts:

html
<graphty-element view-mode="2d"></graphty-element>
typescript
// 2D camera only has x, y position
graph.setCameraPosition({ x: 0, y: 0, z: 100 });

In 2D mode:

  • Mouse drag: Pan
  • Scroll: Zoom
  • No orbit (camera always looks down at the plane)

Coordinate Transforms ​

Convert between world and screen coordinates:

World to Screen ​

typescript
// Convert 3D world position to 2D screen position
const worldPos = { x: 0, y: 0, z: 0 };
const screenPos = graph.worldToScreen(worldPos);
// Returns: { x: 400, y: 300 } (pixels from top-left)

Use case: Position HTML overlays on nodes:

typescript
const node = graph.getNode('node1');
const screenPos = graph.worldToScreen(node.position);

overlay.style.left = `${screenPos.x}px`;
overlay.style.top = `${screenPos.y}px`;

Screen to World ​

typescript
// Convert screen position to world position
const screenPos = { x: 400, y: 300 };
const worldPos = graph.screenToWorld(screenPos);
// Returns: { x: 0, y: 0, z: 0 }

Camera Events ​

Listen to camera changes:

typescript
graph.on('camera-state-changed', ({ state }) => {
  console.log('Camera moved:', state);
});

Focus on Node ​

Animate camera to focus on a specific node:

typescript
async function focusNode(nodeId) {
  const node = graph.getNode(nodeId);
  if (!node) return;

  const position = node.position;

  graph.setCameraState({
    position: {
      x: position.x,
      y: position.y,
      z: position.z + 50  // Back away a bit
    },
    target: position,
    up: { x: 0, y: 1, z: 0 }
  }, {
    animate: true,
    duration: 500
  });
}

Orbit Animation ​

Create a rotating view:

typescript
function startOrbit() {
  let angle = 0;
  const radius = 100;
  const center = { x: 0, y: 0, z: 0 };

  const intervalId = setInterval(() => {
    angle += 0.01;

    graph.setCameraPosition({
      x: center.x + radius * Math.cos(angle),
      y: 20,
      z: center.z + radius * Math.sin(angle)
    });
    graph.setCameraTarget(center);
  }, 16); // ~60fps

  return () => clearInterval(intervalId);
}

const stopOrbit = startOrbit();
// Later: stopOrbit();

Interactive Examples ​