@openhps/core
Version:
Open Hybrid Positioning System - Core component
627 lines (543 loc) • 24.5 kB
TypeScript
import { AnimationClip } from "../animation/AnimationClip.js";
import { Camera } from "../cameras/Camera.js";
import { Material } from "../materials/Material.js";
import { Euler } from "../math/Euler.js";
import { Matrix3 } from "../math/Matrix3.js";
import { Matrix4 } from "../math/Matrix4.js";
import { Quaternion } from "../math/Quaternion.js";
import { Vector3 } from "../math/Vector3.js";
import { Group } from "../objects/Group.js";
import { WebGLRenderer } from "../renderers/WebGLRenderer.js";
import { Scene } from "../scenes/Scene.js";
import { BufferGeometry } from "./BufferGeometry.js";
import { EventDispatcher } from "./EventDispatcher.js";
import { Layers } from "./Layers.js";
import { Intersection, Raycaster } from "./Raycaster.js";
export interface Object3DEventMap {
/**
* Fires when the object has been added to its parent object.
*/
added: {};
/**
* Fires when the object has been removed from its parent object.
*/
removed: {};
/**
* Fires when a new child object has been added.
*/
childadded: { child: Object3D };
/**
* Fires when a new child object has been removed.
*/
childremoved: { child: Object3D };
}
/**
* This is the base class for most objects in three.js and provides a set of properties and methods for manipulating objects in 3D space.
* @remarks Note that this can be used for grouping objects via the {@link THREE.Object3D.add | .add()} method which adds the object as a child,
* however it is better to use {@link THREE.Group | Group} for this.
* @see {@link https://threejs.org/docs/index.html#api/en/core/Object3D | Official Documentation}
* @see {@link https://github.com/mrdoob/three.js/blob/master/src/core/Object3D.js | Source}
*/
export class Object3D<TEventMap extends Object3DEventMap = Object3DEventMap> extends EventDispatcher<TEventMap> {
/**
* This creates a new {@link Object3D} object.
*/
constructor();
/**
* Flag to check if a given object is of type {@link Object3D}.
* @remarks This is a _constant_ value
* @defaultValue `true`
*/
readonly isObject3D: true;
/**
* Unique number for this {@link Object3D} instance.
* @remarks Note that ids are assigned in chronological order: 1, 2, 3, ..., incrementing by one for each new object.
* Expects a `Integer`
*/
readonly id: number;
/**
* {@link http://en.wikipedia.org/wiki/Universally_unique_identifier | UUID} of this object instance.
* @remarks This gets automatically assigned and shouldn't be edited.
*/
uuid: string;
/**
* Optional name of the object
* @remarks _(doesn't need to be unique)_.
* @defaultValue `""`
*/
name: string;
/**
* A Read-only _string_ to check `this` object type.
* @remarks This can be used to find a specific type of Object3D in a scene.
* Sub-classes will update this value.
* @defaultValue `Object3D`
*/
readonly type: string | "Object3D";
/**
* Object's parent in the {@link https://en.wikipedia.org/wiki/Scene_graph | scene graph}.
* @remarks An object can have at most one parent.
* @defaultValue `null`
*/
parent: Object3D | null;
/**
* Array with object's children.
* @see {@link THREE.Object3DGroup | Group} for info on manually grouping objects.
* @defaultValue `[]`
*/
children: Object3D[];
/**
* This is used by the {@link lookAt | lookAt} method, for example, to determine the orientation of the result.
* @defaultValue {@link DEFAULT_UP | Object3D.DEFAULT_UP} - that is `(0, 1, 0)`.
*/
up: Vector3;
/**
* Object's local position.
* @defaultValue `new THREE.Vector3()` - that is `(0, 0, 0)`.
*/
readonly position: Vector3;
/**
* Object's local rotation ({@link https://en.wikipedia.org/wiki/Euler_angles | Euler angles}), in radians.
* @defaultValue `new THREE.Euler()` - that is `(0, 0, 0, Euler.DEFAULT_ORDER)`.
*/
readonly rotation: Euler;
/**
* Object's local rotation as a {@link THREE.Quaternion | Quaternion}.
* @defaultValue `new THREE.Quaternion()` - that is `(0, 0, 0, 1)`.
*/
readonly quaternion: Quaternion;
/**
* The object's local scale.
* @defaultValue `new THREE.Vector3( 1, 1, 1 )`
*/
readonly scale: Vector3;
/**
* @defaultValue `new THREE.Matrix4()`
*/
readonly modelViewMatrix: Matrix4;
/**
* @defaultValue `new THREE.Matrix3()`
*/
readonly normalMatrix: Matrix3;
/**
* The local transform matrix.
* @defaultValue `new THREE.Matrix4()`
*/
matrix: Matrix4;
/**
* The global transform of the object.
* @remarks If the {@link Object3D} has no parent, then it's identical to the local transform {@link THREE.Object3D.matrix | .matrix}.
* @defaultValue `new THREE.Matrix4()`
*/
matrixWorld: Matrix4;
/**
* When this is set, it calculates the matrix of position, (rotation or quaternion) and
* scale every frame and also recalculates the matrixWorld property.
* @defaultValue {@link DEFAULT_MATRIX_AUTO_UPDATE} - that is `(true)`.
*/
matrixAutoUpdate: boolean;
/**
* If set, then the renderer checks every frame if the object and its children need matrix updates.
* When it isn't, then you have to maintain all matrices in the object and its children yourself.
* @defaultValue {@link DEFAULT_MATRIX_WORLD_AUTO_UPDATE} - that is `(true)`.
*/
matrixWorldAutoUpdate: boolean;
/**
* When this is set, it calculates the matrixWorld in that frame and resets this property to false.
* @defaultValue `false`
*/
matrixWorldNeedsUpdate: boolean;
/**
* The layer membership of the object.
* @remarks The object is only visible if it has at least one layer in common with the {@link THREE.Object3DCamera | Camera} in use.
* This property can also be used to filter out unwanted objects in ray-intersection tests when using {@link THREE.Raycaster | Raycaster}.
* @defaultValue `new THREE.Layers()`
*/
layers: Layers;
/**
* Object gets rendered if `true`.
* @defaultValue `true`
*/
visible: boolean;
/**
* Whether the object gets rendered into shadow map.
* @defaultValue `false`
*/
castShadow: boolean;
/**
* Whether the material receives shadows.
* @defaultValue `false`
*/
receiveShadow: boolean;
/**
* When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object.
* If set to `false` the object gets rendered every frame even if it is not in the frustum of the camera.
* @defaultValue `true`
*/
frustumCulled: boolean;
/**
* This value allows the default rendering order of {@link https://en.wikipedia.org/wiki/Scene_graph | scene graph}
* objects to be overridden although opaque and transparent objects remain sorted independently.
* @remarks When this property is set for an instance of {@link Group | Group}, all descendants objects will be sorted and rendered together.
* Sorting is from lowest to highest renderOrder.
* @defaultValue `0`
*/
renderOrder: number;
/**
* Array with object's animation clips.
* @defaultValue `[]`
*/
animations: AnimationClip[];
/**
* An object that can be used to store custom data about the {@link Object3D}.
* @remarks It should not hold references to _functions_ as these **will not** be cloned.
* @default `{}`
*/
userData: Record<string, any>;
/**
* Custom depth material to be used when rendering to the depth map.
* @remarks Can only be used in context of meshes.
* When shadow-casting with a {@link THREE.DirectionalLight | DirectionalLight} or {@link THREE.SpotLight | SpotLight},
* if you are modifying vertex positions in the vertex shader you must specify a customDepthMaterial for proper shadows.
* @defaultValue `undefined`
*/
customDepthMaterial?: Material | undefined;
/**
* Same as {@link customDepthMaterial}, but used with {@link THREE.Object3DPointLight | PointLight}.
* @defaultValue `undefined`
*/
customDistanceMaterial?: Material | undefined;
/**
* An optional callback that is executed immediately before a 3D object is rendered to a shadow map.
* @remarks This function is called with the following parameters: renderer, scene, camera, shadowCamera, geometry,
* depthMaterial, group.
* Please notice that this callback is only executed for `renderable` 3D objects. Meaning 3D objects which
* define their visual appearance with geometries and materials like instances of {@link Mesh}, {@link Line},
* {@link Points} or {@link Sprite}. Instances of {@link Object3D}, {@link Group} or {@link Bone} are not renderable
* and thus this callback is not executed for such objects.
*/
onBeforeShadow(
renderer: WebGLRenderer,
scene: Scene,
shadowCamera: Camera,
geometry: BufferGeometry,
depthMaterial: Material,
group: Group,
): void;
/**
* An optional callback that is executed immediately after a 3D object is rendered to a shadow map.
* @remarks This function is called with the following parameters: renderer, scene, camera, shadowCamera, geometry,
* depthMaterial, group.
* Please notice that this callback is only executed for `renderable` 3D objects. Meaning 3D objects which
* define their visual appearance with geometries and materials like instances of {@link Mesh}, {@link Line},
* {@link Points} or {@link Sprite}. Instances of {@link Object3D}, {@link Group} or {@link Bone} are not renderable
* and thus this callback is not executed for such objects.
*/
onAfterShadow(
renderer: WebGLRenderer,
scene: Scene,
shadowCamera: Camera,
geometry: BufferGeometry,
depthMaterial: Material,
group: Group,
): void;
/**
* An optional callback that is executed immediately before a 3D object is rendered.
* @remarks This function is called with the following parameters: renderer, scene, camera, geometry, material, group.
* Please notice that this callback is only executed for `renderable` 3D objects. Meaning 3D objects which
* define their visual appearance with geometries and materials like instances of {@link Mesh}, {@link Line},
* {@link Points} or {@link Sprite}. Instances of {@link Object3D}, {@link Group} or {@link Bone} are not renderable
* and thus this callback is not executed for such objects.
*/
onBeforeRender(
renderer: WebGLRenderer,
scene: Scene,
camera: Camera,
geometry: BufferGeometry,
material: Material,
group: Group,
): void;
/**
* An optional callback that is executed immediately after a 3D object is rendered.
* @remarks This function is called with the following parameters: renderer, scene, camera, geometry, material, group.
* Please notice that this callback is only executed for `renderable` 3D objects. Meaning 3D objects which
* define their visual appearance with geometries and materials like instances of {@link Mesh}, {@link Line},
* {@link Points} or {@link Sprite}. Instances of {@link Object3D}, {@link Group} or {@link Bone} are not renderable
* and thus this callback is not executed for such objects.
*/
onAfterRender(
renderer: WebGLRenderer,
scene: Scene,
camera: Camera,
geometry: BufferGeometry,
material: Material,
group: Group,
): void;
/**
* The default {@link up} direction for objects, also used as the default position for {@link THREE.DirectionalLight | DirectionalLight},
* {@link THREE.HemisphereLight | HemisphereLight} and {@link THREE.Spotlight | Spotlight} (which creates lights shining from the top down).
* @defaultValue `new THREE.Vector3( 0, 1, 0)`
*/
static DEFAULT_UP: Vector3;
/**
* The default setting for {@link matrixAutoUpdate} for newly created Object3Ds.
* @defaultValue `true`
*/
static DEFAULT_MATRIX_AUTO_UPDATE: boolean;
/**
* The default setting for {@link matrixWorldAutoUpdate} for newly created Object3Ds.
* @defaultValue `true`
*/
static DEFAULT_MATRIX_WORLD_AUTO_UPDATE: boolean;
/**
* Applies the matrix transform to the object and updates the object's position, rotation and scale.
* @param matrix
*/
applyMatrix4(matrix: Matrix4): void;
/**
* Applies the rotation represented by the quaternion to the object.
* @param quaternion
*/
applyQuaternion(quaternion: Quaternion): this;
/**
* Calls {@link THREE.Quaternion.setFromAxisAngle | setFromAxisAngle}({@link axis}, {@link angle}) on the {@link quaternion | .quaternion}.
* @param axis A normalized vector in object space.
* @param angle Angle in radians. Expects a `Float`
*/
setRotationFromAxisAngle(axis: Vector3, angle: number): void;
/**
* Calls {@link THREE.Quaternion.setFromEuler | setFromEuler}({@link euler}) on the {@link quaternion | .quaternion}.
* @param euler Euler angle specifying rotation amount.
*/
setRotationFromEuler(euler: Euler): void;
/**
* Calls {@link THREE.Quaternion.setFromRotationMatrix | setFromRotationMatrix}({@link m}) on the {@link quaternion | .quaternion}.
* @remarks Note that this assumes that the upper 3x3 of m is a pure rotation matrix (i.e, unscaled).
* @param m Rotate the quaternion by the rotation component of the matrix.
*/
setRotationFromMatrix(m: Matrix4): void;
/**
* Copy the given {@link THREE.Quaternion | Quaternion} into {@link quaternion | .quaternion}.
* @param q Normalized Quaternion.
*/
setRotationFromQuaternion(q: Quaternion): void;
/**
* Rotate an object along an axis in object space.
* @remarks The axis is assumed to be normalized.
* @param axis A normalized vector in object space.
* @param angle The angle in radians. Expects a `Float`
*/
rotateOnAxis(axis: Vector3, angle: number): this;
/**
* Rotate an object along an axis in world space.
* @remarks The axis is assumed to be normalized
* Method Assumes no rotated parent.
* @param axis A normalized vector in world space.
* @param angle The angle in radians. Expects a `Float`
*/
rotateOnWorldAxis(axis: Vector3, angle: number): this;
/**
* Rotates the object around _x_ axis in local space.
* @param rad The angle to rotate in radians. Expects a `Float`
*/
rotateX(angle: number): this;
/**
* Rotates the object around _y_ axis in local space.
* @param rad The angle to rotate in radians. Expects a `Float`
*/
rotateY(angle: number): this;
/**
* Rotates the object around _z_ axis in local space.
* @param rad The angle to rotate in radians. Expects a `Float`
*/
rotateZ(angle: number): this;
/**
* Translate an object by distance along an axis in object space
* @remarks The axis is assumed to be normalized.
* @param axis A normalized vector in object space.
* @param distance The distance to translate. Expects a `Float`
*/
translateOnAxis(axis: Vector3, distance: number): this;
/**
* Translates object along x axis in object space by {@link distance} units.
* @param distance Expects a `Float`
*/
translateX(distance: number): this;
/**
* Translates object along _y_ axis in object space by {@link distance} units.
* @param distance Expects a `Float`
*/
translateY(distance: number): this;
/**
* Translates object along _z_ axis in object space by {@link distance} units.
* @param distance Expects a `Float`
*/
translateZ(distance: number): this;
/**
* Converts the vector from this object's local space to world space.
* @param vector A vector representing a position in this object's local space.
*/
localToWorld(vector: Vector3): Vector3;
/**
* Converts the vector from world space to this object's local space.
* @param vector A vector representing a position in world space.
*/
worldToLocal(vector: Vector3): Vector3;
/**
* Rotates the object to face a point in world space.
* @remarks This method does not support objects having non-uniformly-scaled parent(s).
* @param vector A vector representing a position in world space to look at.
*/
lookAt(vector: Vector3): void;
/**
* Rotates the object to face a point in world space.
* @remarks This method does not support objects having non-uniformly-scaled parent(s).
* @param x Expects a `Float`
* @param y Expects a `Float`
* @param z Expects a `Float`
*/
lookAt(x: number, y: number, z: number): void;
/**
* Adds another {@link Object3D} as child of this {@link Object3D}.
* @remarks An arbitrary number of objects may be added
* Any current parent on an {@link object} passed in here will be removed, since an {@link Object3D} can have at most one parent.
* @see {@link attach}
* @see {@link THREE.Group | Group} for info on manually grouping objects.
* @param object
*/
add(...object: Object3D[]): this;
/**
* Removes a {@link Object3D} as child of this {@link Object3D}.
* @remarks An arbitrary number of objects may be removed.
* @see {@link THREE.Group | Group} for info on manually grouping objects.
* @param object
*/
remove(...object: Object3D[]): this;
/**
* Removes this object from its current parent.
*/
removeFromParent(): this;
/**
* Removes all child objects.
*/
clear(): this;
/**
* Adds a {@link Object3D} as a child of this, while maintaining the object's world transform.
* @remarks Note: This method does not support scene graphs having non-uniformly-scaled nodes(s).
* @see {@link add}
* @param object
*/
attach(object: Object3D): this;
/**
* Searches through an object and its children, starting with the object itself, and returns the first with a matching id.
* @remarks Note that ids are assigned in chronological order: 1, 2, 3, ..., incrementing by one for each new object.
* @see {@link id}
* @param id Unique number of the object instance. Expects a `Integer`
*/
getObjectById(id: number): Object3D | undefined;
/**
* Searches through an object and its children, starting with the object itself, and returns the first with a matching name.
* @remarks Note that for most objects the name is an empty string by default
* You will have to set it manually to make use of this method.
* @param name String to match to the children's Object3D.name property.
*/
getObjectByName(name: string): Object3D | undefined;
/**
* Searches through an object and its children, starting with the object itself,
* and returns the first with a property that matches the value given.
*
* @param name - the property name to search for.
* @param value - value of the given property.
*/
getObjectByProperty(name: string, value: any): Object3D | undefined;
/**
* Searches through an object and its children, starting with the object itself,
* and returns the first with a property that matches the value given.
* @param name The property name to search for.
* @param value Value of the given property.
* @param optionalTarget target to set the result. Otherwise a new Array is instantiated. If set, you must clear
* this array prior to each call (i.e., array.length = 0;).
*/
getObjectsByProperty(name: string, value: any, optionalTarget?: Object3D[]): Object3D[];
/**
* Returns a vector representing the position of the object in world space.
* @param target The result will be copied into this Vector3.
*/
getWorldPosition(target: Vector3): Vector3;
/**
* Returns a quaternion representing the rotation of the object in world space.
* @param target The result will be copied into this Quaternion.
*/
getWorldQuaternion(target: Quaternion): Quaternion;
/**
* Returns a vector of the scaling factors applied to the object for each axis in world space.
* @param target The result will be copied into this Vector3.
*/
getWorldScale(target: Vector3): Vector3;
/**
* Returns a vector representing the direction of object's positive z-axis in world space.
* @param target The result will be copied into this Vector3.
*/
getWorldDirection(target: Vector3): Vector3;
/**
* Abstract (empty) method to get intersections between a casted ray and this object
* @remarks Subclasses such as {@link THREE.Mesh | Mesh}, {@link THREE.Line | Line}, and {@link THREE.Points | Points} implement this method in order to use raycasting.
* @see {@link THREE.Raycaster | Raycaster}
* @param raycaster
* @param intersects
* @defaultValue `() => {}`
*/
raycast(raycaster: Raycaster, intersects: Intersection[]): void;
/**
* Executes the callback on this object and all descendants.
* @remarks Note: Modifying the scene graph inside the callback is discouraged.
* @param callback A function with as first argument an {@link Object3D} object.
*/
traverse(callback: (object: Object3D) => any): void;
/**
* Like traverse, but the callback will only be executed for visible objects
* @remarks Descendants of invisible objects are not traversed.
* Note: Modifying the scene graph inside the callback is discouraged.
* @param callback A function with as first argument an {@link Object3D} object.
*/
traverseVisible(callback: (object: Object3D) => any): void;
/**
* Executes the callback on all ancestors.
* @remarks Note: Modifying the scene graph inside the callback is discouraged.
* @param callback A function with as first argument an {@link Object3D} object.
*/
traverseAncestors(callback: (object: Object3D) => any): void;
/**
* Updates local transform.
*/
updateMatrix(): void;
/**
* Updates the global transform of the object.
* And will update the object descendants if {@link matrixWorldNeedsUpdate | .matrixWorldNeedsUpdate} is set to true or if the {@link force} parameter is set to `true`.
* @param force A boolean that can be used to bypass {@link matrixWorldAutoUpdate | .matrixWorldAutoUpdate}, to recalculate the world matrix of the object and descendants on the current frame.
* Useful if you cannot wait for the renderer to update it on the next frame, assuming {@link matrixWorldAutoUpdate | .matrixWorldAutoUpdate} set to `true`.
*/
updateMatrixWorld(force?: boolean): void;
/**
* Updates the global transform of the object.
* @param updateParents Recursively updates global transform of ancestors.
* @param updateChildren Recursively updates global transform of descendants.
*/
updateWorldMatrix(updateParents: boolean, updateChildren: boolean): void;
/**
* Convert the object to three.js {@link https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 | JSON Object/Scene format}.
* @param meta Object containing metadata such as materials, textures or images for the object.
*/
toJSON(meta?: { geometries: any; materials: any; textures: any; images: any }): any;
/**
* Returns a clone of `this` object and optionally all descendants.
* @param recursive If true, descendants of the object are also cloned. Default `true`
*/
clone(recursive?: boolean): this;
/**
* Copy the given object into this object
* @remarks Note: event listeners and user-defined callbacks ({@link onAfterRender | .onAfterRender} and {@link onBeforeRender | .onBeforeRender}) are not copied.
* @param source
* @param recursive If true, descendants of the object are also copied. Default `true`
*/
copy(source: this, recursive?: boolean): this;
}