Files
Kimi Agent ab3546ae4b
All checks were successful
Tests / lint (push) Successful in 4s
Tests / test (push) Successful in 1m1s
feat: Workshop Phase 2 — Scene MVP (Three.js room) (#401)
Co-authored-by: Kimi Agent <kimi@timmy.local>
Co-committed-by: Kimi Agent <kimi@timmy.local>
2026-03-19 02:14:09 -04:00

51 lines
1.3 KiB
JavaScript

/**
* Camera + touch controls for the Workshop scene.
*
* Uses Three.js OrbitControls with constrained range — the visitor
* can look around the room but not leave it.
*/
import { OrbitControls } from "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/controls/OrbitControls.js";
/**
* Set up camera controls.
* @param {THREE.PerspectiveCamera} camera
* @param {HTMLCanvasElement} domElement
* @returns {OrbitControls}
*/
export function setupControls(camera, domElement) {
const controls = new OrbitControls(camera, domElement);
// Smooth damping
controls.enableDamping = true;
controls.dampingFactor = 0.08;
// Limit zoom range
controls.minDistance = 3;
controls.maxDistance = 12;
// Limit vertical angle (don't look below floor or straight up)
controls.minPolarAngle = Math.PI * 0.2;
controls.maxPolarAngle = Math.PI * 0.6;
// Limit horizontal rotation range (stay facing the desk area)
controls.minAzimuthAngle = -Math.PI * 0.4;
controls.maxAzimuthAngle = Math.PI * 0.4;
// Target: roughly the desk area
controls.target.set(0, 1.2, 0);
// Touch settings
controls.touches = {
ONE: 0, // ROTATE
TWO: 2, // DOLLY
};
// Disable panning (visitor stays in place)
controls.enablePan = false;
controls.update();
return controls;
}