You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

81 lines
2.2 KiB

/**
* Controls System
*
* Provides camera orbit controls for the 3D world visualization.
* Wraps Three.js OrbitControls with additional configuration and
* safety features.
*
* @file Controls.ts
* @author Matthew Raymer
* @created 2023-06-29
* @version 1.0.0
*/
import { OrbitControls } from "three-orbitcontrols-ts";
import { MathUtils, PerspectiveCamera } from "three";
/**
* Controls class for managing camera orbit controls in the 3D world.
*
* This class provides a wrapper around Three.js OrbitControls with
* additional configuration options and safety features. It handles
* camera movement, rotation limits, and smooth damping for better
* user experience.
*
* @class Controls
* @author Matthew Raymer
*/
class Controls {
/** The underlying OrbitControls instance */
private controls: OrbitControls;
/**
* Creates a new Controls instance with configured orbit controls.
*
* @param camera - The perspective camera to control
* @param canvas - The HTML element to attach controls to
*
* @example
* ```typescript
* const controls = new Controls(camera, canvas);
* const orbitControls = controls.getControls();
* ```
*/
constructor(camera: PerspectiveCamera, canvas: HTMLElement) {
this.controls = new OrbitControls(camera, canvas);
// Enable controls
this.controls.enabled = true;
this.controls.autoRotate = false;
// Control limits for better user experience
this.controls.minPolarAngle = MathUtils.degToRad(40); // Default
this.controls.maxPolarAngle = MathUtils.degToRad(75);
// Smooth camera movement with damping
this.controls.enableDamping = true;
// Set maximum distance to prevent zooming too far out
this.controls.maxDistance = 250;
// Update function for animation loop
this.controls.tick = () => this.controls.update();
}
/**
* Gets the underlying OrbitControls instance.
*
* @returns The OrbitControls instance for direct manipulation
*
* @example
* ```typescript
* const orbitControls = controls.getControls();
* orbitControls.enablePan = false; // Disable panning
* ```
*/
public getControls(): OrbitControls {
return this.controls;
}
}
export { Controls };