51 lines
1.3 KiB
JavaScript
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;
|
||
|
|
}
|