3d-scene-creator
Version:
A simple utility to create and manage 3D scenes
178 lines (165 loc) • 5.39 kB
text/typescript
import * as THREE from 'three';
/**
* Configuration options for initializing SceneCreator
*/
export interface SceneCreatorOptions {
/** HTML container element to attach renderer to */
container?: HTMLElement;
/** Scale factor for the scene (default: 1) */
scale?: number;
/** Initial camera position (default: 10, 10, 10) */
camPos?: THREE.Vector3;
/** Initial camera target position (default: 0, 0, 0) */
targetPos?: THREE.Vector3;
}
/**
* A single directional light spec (color, intensity, position).
*/
export interface DirectionalLightSpec {
color?: THREE.ColorRepresentation;
intensity?: number;
position?: THREE.Vector3;
}
/**
* Options for {@link SceneCreator.addLighting}.
*/
export interface LightingOptions {
/** Sky/ground ambient fill. Set to false to omit. */
hemisphere?:
| false
| {
sky?: THREE.ColorRepresentation;
ground?: THREE.ColorRepresentation;
intensity?: number;
};
/** Main directional light (casts shadows when `shadows` is on). */
key?: DirectionalLightSpec;
/** Opposite-side fill light to soften shadows. Set to false to omit. */
fill?: false | DirectionalLightSpec;
/** Enable shadow mapping on the renderer and the key light (default: true). */
shadows?: boolean;
/** Half-size of the key light's orthographic shadow frustum (default: 16). */
shadowArea?: number;
/** Shadow map resolution (default: 2048). */
shadowMapSize?: number;
/** Apply ACES Filmic tone mapping (default: true). */
toneMapping?: boolean;
/** Tone mapping exposure (default: 1.05). */
exposure?: number;
}
/**
* Configuration overrides for OrbitControls
*/
export interface OrbitControlsConfig {
enabled?: boolean;
enableDamping?: boolean;
dampingFactor?: number;
maxPolarAngle?: number;
maxDistance?: number;
minDistance?: number;
rotateSpeed?: number;
enableZoom?: boolean;
enablePan?: boolean;
[key: string]: any;
}
/**
* Animation configuration for model animations
*/
export interface AnimationConfig {
/** Animation duration in seconds */
duration?: number;
/** Easing function for animation */
easing?: string;
/** Callback on animation completion */
onComplete?: () => void;
}
/**
* Options for {@link SceneCreator.loadAnimatedModel}.
*/
export interface AnimatedModelOptions {
/** Add the loaded model to the scene graph (default: true). */
add?: boolean;
/** Flag every mesh as a shadow caster/receiver (default: true). */
shadows?: boolean;
/** Name of the clip to start playing immediately (default: first clip). */
autoplay?: string | false;
}
/**
* Options for {@link AnimatedModel.play}.
*/
export interface PlayAnimationOptions {
/** Cross-fade duration from the current clip, in seconds (default: 0.3). */
fade?: number;
/** Loop the clip (default: true). When false the clip plays once. */
loop?: boolean;
/** Hold the final frame when a non-looping clip finishes (default: true). */
clampWhenFinished?: boolean;
}
/**
* Handle returned by {@link SceneCreator.loadAnimatedModel} for controlling a
* loaded, rigged glTF model and its animation clips.
*/
export interface AnimatedModel {
/** The loaded model root (added to the scene unless `add: false`). */
model: THREE.Group;
/** The model's animation clips, as parsed from the glTF. */
animations: THREE.AnimationClip[];
/** Names of every available clip. */
names: string[];
/** The AnimationMixer driving this model (already wired into the render loop). */
mixer: THREE.AnimationMixer;
/** Ready-to-use actions, keyed by clip name. */
actions: Record<string, THREE.AnimationAction>;
/** Cross-fade to a clip by name. Returns the action, or null if not found. */
play(name: string, options?: PlayAnimationOptions): THREE.AnimationAction | null;
/** Fade the current clip out (default duration: 0.3s). */
stop(fade?: number): void;
}
/**
* Options for {@link SceneCreator.enablePhysics}.
*/
export interface PhysicsOptions {
/** World gravity, as a Vector3 or [x, y, z] (default: [0, -9.82, 0]). */
gravity?: THREE.Vector3 | [number, number, number];
/** Default bounciness for all contacts, 0 to 1 (default: 0.3). */
restitution?: number;
/** Default friction for all contacts (default: 0.4). */
friction?: number;
/** Let resting bodies fall asleep to save CPU (default: true). */
allowSleep?: boolean;
}
/**
* Options for {@link SceneCreator.addBody}.
*/
export interface PhysicsBodyOptions {
/** Body mass in kg. Use 0 for a static (immovable) body (default: 1). */
mass?: number;
/** Collision shape derived from the mesh (default: "box"). */
shape?: "box" | "sphere";
/** Linear movement damping, 0 to 1 (default: 0.01). */
linearDamping?: number;
/** Angular (spin) damping, 0 to 1 (default: 0.01). */
angularDamping?: number;
}
/**
* Result from raycasting/picking an object
*/
export interface PickingResult {
/** The intersected 3D object */
object: THREE.Object3D;
/** Distance from camera to intersection point */
distance: number;
/** Intersection point in 3D space */
point: THREE.Vector3;
/** Normal vector at intersection point */
normal: THREE.Vector3;
/** UV coordinates if available */
uv?: THREE.Vector2;
}
/**
* Mouse position in normalized coordinates (-1 to 1)
*/
export interface MouseNormalized {
x: number;
y: number;
}