|
|
@@ -28,24 +28,88 @@ const _removedEvent = { type: 'removed' };
|
|
|
const _childaddedEvent = { type: 'childadded', child: null };
|
|
|
const _childremovedEvent = { type: 'childremoved', child: null };
|
|
|
|
|
|
+/**
|
|
|
+ * 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.
|
|
|
+ *
|
|
|
+ * Note that this can be used for grouping objects via the `add()` method which
|
|
|
+ * adds the object as a child, however it is better to use {@link Group} for this.
|
|
|
+ *
|
|
|
+ * @augments EventDispatcher
|
|
|
+ */
|
|
|
class Object3D extends EventDispatcher {
|
|
|
|
|
|
+ /**
|
|
|
+ * Constructs a new 3D object.
|
|
|
+ */
|
|
|
constructor() {
|
|
|
|
|
|
super();
|
|
|
|
|
|
+ /**
|
|
|
+ * This flag can be used for type testing.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @readonly
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
this.isObject3D = true;
|
|
|
|
|
|
+ /**
|
|
|
+ * The ID of the 3D object.
|
|
|
+ *
|
|
|
+ * @type {number}
|
|
|
+ * @readonly
|
|
|
+ */
|
|
|
Object.defineProperty( this, 'id', { value: _object3DId ++ } );
|
|
|
|
|
|
+ /**
|
|
|
+ * The UUID of the 3D object.
|
|
|
+ *
|
|
|
+ * @type {string}
|
|
|
+ * @readonly
|
|
|
+ */
|
|
|
this.uuid = generateUUID();
|
|
|
|
|
|
+ /**
|
|
|
+ * The name of the 3D object.
|
|
|
+ *
|
|
|
+ * @type {string}
|
|
|
+ */
|
|
|
this.name = '';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The type property is used for detecting the object type
|
|
|
+ * in context of serialization/deserialization.
|
|
|
+ *
|
|
|
+ * @type {string}
|
|
|
+ * @readonly
|
|
|
+ */
|
|
|
this.type = 'Object3D';
|
|
|
|
|
|
+ /**
|
|
|
+ * A reference to the parent object.
|
|
|
+ *
|
|
|
+ * @type {?Object3D}
|
|
|
+ * @default null
|
|
|
+ */
|
|
|
this.parent = null;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * An array holding the child 3D objects of this instance.
|
|
|
+ *
|
|
|
+ * @type {Array<Object3D>}
|
|
|
+ */
|
|
|
this.children = [];
|
|
|
|
|
|
+ /**
|
|
|
+ * Defines the `up` direction of the 3D object which influences
|
|
|
+ * the orientation via methods like {@link Object3D#lookAt}.
|
|
|
+ *
|
|
|
+ * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.
|
|
|
+ *
|
|
|
+ * @type {Vector3}
|
|
|
+ */
|
|
|
this.up = Object3D.DEFAULT_UP.clone();
|
|
|
|
|
|
const position = new Vector3();
|
|
|
@@ -69,65 +133,245 @@ class Object3D extends EventDispatcher {
|
|
|
quaternion._onChange( onQuaternionChange );
|
|
|
|
|
|
Object.defineProperties( this, {
|
|
|
+ /**
|
|
|
+ * Represents the object's local position.
|
|
|
+ *
|
|
|
+ * @name Object3D#position
|
|
|
+ * @type {Vector3}
|
|
|
+ * @default (0,0,0)
|
|
|
+ */
|
|
|
position: {
|
|
|
configurable: true,
|
|
|
enumerable: true,
|
|
|
value: position
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Represents the object's local rotation as Euler angles, in radians.
|
|
|
+ *
|
|
|
+ * @name Object3D#rotation
|
|
|
+ * @type {Euler}
|
|
|
+ * @default (0,0,0)
|
|
|
+ */
|
|
|
rotation: {
|
|
|
configurable: true,
|
|
|
enumerable: true,
|
|
|
value: rotation
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Represents the object's local rotation as Quaterions.
|
|
|
+ *
|
|
|
+ * @name Object3D#quaternion
|
|
|
+ * @type {Quaternion}
|
|
|
+ */
|
|
|
quaternion: {
|
|
|
configurable: true,
|
|
|
enumerable: true,
|
|
|
value: quaternion
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Represents the object's local scale.
|
|
|
+ *
|
|
|
+ * @name Object3D#scale
|
|
|
+ * @type {Vector3}
|
|
|
+ * @default (1,1,1)
|
|
|
+ */
|
|
|
scale: {
|
|
|
configurable: true,
|
|
|
enumerable: true,
|
|
|
value: scale
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Represents the object's model-view matrix.
|
|
|
+ *
|
|
|
+ * @name Object3D#modelViewMatrix
|
|
|
+ * @type {Matrix4}
|
|
|
+ */
|
|
|
modelViewMatrix: {
|
|
|
value: new Matrix4()
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Represents the object's normal matrix.
|
|
|
+ *
|
|
|
+ * @name Object3D#normalMatrix
|
|
|
+ * @type {Matrix3}
|
|
|
+ */
|
|
|
normalMatrix: {
|
|
|
value: new Matrix3()
|
|
|
}
|
|
|
} );
|
|
|
|
|
|
+ /**
|
|
|
+ * Represents the object's transformation matrix in local space.
|
|
|
+ *
|
|
|
+ * @type {Matrix4}
|
|
|
+ */
|
|
|
this.matrix = new Matrix4();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Represents the object's transformation matrix in world space.
|
|
|
+ * If the 3D object has no parent, then it's identical to the local transformation matrix
|
|
|
+ *
|
|
|
+ * @type {Matrix4}
|
|
|
+ */
|
|
|
this.matrixWorld = new Matrix4();
|
|
|
|
|
|
+ /**
|
|
|
+ * When set to `true`, the engine automatically computes the local matrix from position,
|
|
|
+ * rotation and scale every frame.
|
|
|
+ *
|
|
|
+ * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;
|
|
|
|
|
|
+ /**
|
|
|
+ * When set to `true`, the engine automatically computes the world matrix from the current local
|
|
|
+ * matrix and the object's transformation hierarchy.
|
|
|
+ *
|
|
|
+ * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer
|
|
|
+
|
|
|
+ /**
|
|
|
+ * When set to `true`, it calculates the world matrix in that frame and resets this property
|
|
|
+ * to `false`.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default false
|
|
|
+ */
|
|
|
this.matrixWorldNeedsUpdate = false;
|
|
|
|
|
|
+ /**
|
|
|
+ * The layer membership of the 3D object. The 3D object is only visible if it has
|
|
|
+ * at least one layer in common with the camera in use. This property can also be
|
|
|
+ * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.
|
|
|
+ *
|
|
|
+ * @type {Layers}
|
|
|
+ */
|
|
|
this.layers = new Layers();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * When set to `true`, the 3D object gets rendered.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
this.visible = true;
|
|
|
|
|
|
+ /**
|
|
|
+ * When set to `true`, the 3D object gets rendered into shadow maps.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default false
|
|
|
+ */
|
|
|
this.castShadow = false;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * When set to `true`, the 3D object is affected by shadows in the scene.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default false
|
|
|
+ */
|
|
|
this.receiveShadow = false;
|
|
|
|
|
|
+ /**
|
|
|
+ * When set to `true`, the 3D object is honored by view frustum culling.
|
|
|
+ *
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
this.frustumCulled = true;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * This value allows the default rendering order of scene graph objects to be
|
|
|
+ * overridden although opaque and transparent objects remain sorted independently.
|
|
|
+ * When this property is set for an instance of {@link Group},all descendants
|
|
|
+ * objects will be sorted and rendered together. Sorting is from lowest to highest
|
|
|
+ * render order.
|
|
|
+ *
|
|
|
+ * @type {number}
|
|
|
+ * @default 0
|
|
|
+ */
|
|
|
this.renderOrder = 0;
|
|
|
|
|
|
+ /**
|
|
|
+ * An array holding the animation clips of the 3D object.
|
|
|
+ *
|
|
|
+ * @type {Array<AnimationClip>}
|
|
|
+ */
|
|
|
this.animations = [];
|
|
|
|
|
|
+ /**
|
|
|
+ * An object that can be used to store custom data about the 3D object. It
|
|
|
+ * should not hold references to functions as these will not be cloned.
|
|
|
+ *
|
|
|
+ * @type {Object}
|
|
|
+ */
|
|
|
this.userData = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * A callback that is executed immediately before a 3D object is rendered to a shadow map.
|
|
|
+ *
|
|
|
+ * @param {Renderer|WebGLRenderer} renderer - The renderer.
|
|
|
+ * @param {Object3D} object - The 3D object.
|
|
|
+ * @param {Camera} camera - The camera that is used to render the scene.
|
|
|
+ * @param {Camera} shadowCamera - The shadow camera.
|
|
|
+ * @param {BufferGeometry} geometry - The 3D object's geometry.
|
|
|
+ * @param {Material} depthMaterial - The depth material.
|
|
|
+ * @param {Object} group - The geometry group data.
|
|
|
+ */
|
|
|
onBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}
|
|
|
|
|
|
+ /**
|
|
|
+ * A callback that is executed immediately after a 3D object is rendered to a shadow map.
|
|
|
+ *
|
|
|
+ * @param {Renderer|WebGLRenderer} renderer - The renderer.
|
|
|
+ * @param {Object3D} object - The 3D object.
|
|
|
+ * @param {Camera} camera - The camera that is used to render the scene.
|
|
|
+ * @param {Camera} shadowCamera - The shadow camera.
|
|
|
+ * @param {BufferGeometry} geometry - The 3D object's geometry.
|
|
|
+ * @param {Material} depthMaterial - The depth material.
|
|
|
+ * @param {Object} group - The geometry group data.
|
|
|
+ */
|
|
|
onAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}
|
|
|
|
|
|
+ /**
|
|
|
+ * A callback that is executed immediately before a 3D object is rendered.
|
|
|
+ *
|
|
|
+ * @param {Renderer|WebGLRenderer} renderer - The renderer.
|
|
|
+ * @param {Object3D} object - The 3D object.
|
|
|
+ * @param {Camera} camera - The camera that is used to render the scene.
|
|
|
+ * @param {BufferGeometry} geometry - The 3D object's geometry.
|
|
|
+ * @param {Material} material - The 3D object's material.
|
|
|
+ * @param {Object} group - The geometry group data.
|
|
|
+ */
|
|
|
onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}
|
|
|
|
|
|
+ /**
|
|
|
+ * A callback that is executed immediately after a 3D object is rendered.
|
|
|
+ *
|
|
|
+ * @param {Renderer|WebGLRenderer} renderer - The renderer.
|
|
|
+ * @param {Object3D} object - The 3D object.
|
|
|
+ * @param {Camera} camera - The camera that is used to render the scene.
|
|
|
+ * @param {BufferGeometry} geometry - The 3D object's geometry.
|
|
|
+ * @param {Material} material - The 3D object's material.
|
|
|
+ * @param {Object} group - The geometry group data.
|
|
|
+ */
|
|
|
onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}
|
|
|
|
|
|
+ /**
|
|
|
+ * Applies the given transformation matrix to the object and updates the object's position,
|
|
|
+ * rotation and scale.
|
|
|
+ *
|
|
|
+ * @param {Matrix4} matrix - The transformation matrix.
|
|
|
+ */
|
|
|
applyMatrix4( matrix ) {
|
|
|
|
|
|
if ( this.matrixAutoUpdate ) this.updateMatrix();
|
|
|
@@ -138,6 +382,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Applies a rotation represented by given the quaternion to the 3D object.
|
|
|
+ *
|
|
|
+ * @param {Quaternion} q - The quaterion.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
applyQuaternion( q ) {
|
|
|
|
|
|
this.quaternion.premultiply( q );
|
|
|
@@ -146,6 +396,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Sets the given rotation represented as an axis/angle couple to the 3D object.
|
|
|
+ *
|
|
|
+ * @param {Vector3} axis - The (normalized) axis vector.
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ */
|
|
|
setRotationFromAxisAngle( axis, angle ) {
|
|
|
|
|
|
// assumes axis is normalized
|
|
|
@@ -154,12 +410,23 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Sets the given rotation represented as Euler angles to the 3D object.
|
|
|
+ *
|
|
|
+ * @param {Euler} euler - The Euler angles.
|
|
|
+ */
|
|
|
setRotationFromEuler( euler ) {
|
|
|
|
|
|
this.quaternion.setFromEuler( euler, true );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Sets the given rotation represented as rotation matrix to the 3D object.
|
|
|
+ *
|
|
|
+ * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be
|
|
|
+ * a pure rotation matrix (i.e, unscaled).
|
|
|
+ */
|
|
|
setRotationFromMatrix( m ) {
|
|
|
|
|
|
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
|
@@ -168,6 +435,11 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Sets the given rotation represented as a Quanterion to the 3D object.
|
|
|
+ *
|
|
|
+ * @param {Quaternion} q - The Quanterion
|
|
|
+ */
|
|
|
setRotationFromQuaternion( q ) {
|
|
|
|
|
|
// assumes q is normalized
|
|
|
@@ -176,6 +448,13 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the 3D object along an axis in local space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} axis - The (normalized) axis vector.
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
rotateOnAxis( axis, angle ) {
|
|
|
|
|
|
// rotate object on axis in object space
|
|
|
@@ -189,6 +468,13 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the 3D object along an axis in world space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} axis - The (normalized) axis vector.
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
rotateOnWorldAxis( axis, angle ) {
|
|
|
|
|
|
// rotate object on axis in world space
|
|
|
@@ -203,24 +489,49 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the 3D object around its X axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
rotateX( angle ) {
|
|
|
|
|
|
return this.rotateOnAxis( _xAxis, angle );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the 3D object around its Y axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
rotateY( angle ) {
|
|
|
|
|
|
return this.rotateOnAxis( _yAxis, angle );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the 3D object around its Z axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} angle - The angle in radians.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
rotateZ( angle ) {
|
|
|
|
|
|
return this.rotateOnAxis( _zAxis, angle );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Translate the 3D object by a distance along the given axis in local space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} axis - The (normalized) axis vector.
|
|
|
+ * @param {number} distance - The distance in world units.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
translateOnAxis( axis, distance ) {
|
|
|
|
|
|
// translate object by distance along axis in object space
|
|
|
@@ -234,24 +545,48 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Translate the 3D object by a distance along its X-axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} distance - The distance in world units.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
translateX( distance ) {
|
|
|
|
|
|
return this.translateOnAxis( _xAxis, distance );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Translate the 3D object by a distance along its Y-axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} distance - The distance in world units.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
translateY( distance ) {
|
|
|
|
|
|
return this.translateOnAxis( _yAxis, distance );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Translate the 3D object by a distance along its Z-axis in local space.
|
|
|
+ *
|
|
|
+ * @param {number} distance - The distance in world units.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
translateZ( distance ) {
|
|
|
|
|
|
return this.translateOnAxis( _zAxis, distance );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Converts the given vector from this 3D object's local space to world space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} vector - The vector to convert.
|
|
|
+ * @return {Vector3} The converted vector.
|
|
|
+ */
|
|
|
localToWorld( vector ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -260,6 +595,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Converts the given vector from this 3D object's word space to local space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} vector - The vector to convert.
|
|
|
+ * @return {Vector3} The converted vector.
|
|
|
+ */
|
|
|
worldToLocal( vector ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -268,6 +609,15 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Rotates the object to face a point in world space.
|
|
|
+ *
|
|
|
+ * This method does not support objects having non-uniformly-scaled parent(s).
|
|
|
+ *
|
|
|
+ * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space
|
|
|
+ * @param {number} y - The y coordinate in world space.
|
|
|
+ * @param {number} z - The z coordinate in world space.
|
|
|
+ */
|
|
|
lookAt( x, y, z ) {
|
|
|
|
|
|
// This method does not support objects having non-uniformly-scaled parent(s)
|
|
|
@@ -310,6 +660,14 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Adds the given 3D object as a child to this 3D object. An arbitrary number of
|
|
|
+ * objects may be added. Any current parent on an object passed in here will be
|
|
|
+ * removed, since an object can have at most one parent.
|
|
|
+ *
|
|
|
+ * @param {Object3D} object - The 3D object to add.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
add( object ) {
|
|
|
|
|
|
if ( arguments.length > 1 ) {
|
|
|
@@ -353,6 +711,13 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Removes the given 3D object as child from this 3D object.
|
|
|
+ * An arbitrary number of objects may be removed.
|
|
|
+ *
|
|
|
+ * @param {Object3D} object - The 3D object to remove.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
remove( object ) {
|
|
|
|
|
|
if ( arguments.length > 1 ) {
|
|
|
@@ -386,6 +751,11 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Removes this 3D object from its current parent.
|
|
|
+ *
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
removeFromParent() {
|
|
|
|
|
|
const parent = this.parent;
|
|
|
@@ -400,12 +770,24 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Removes all child objects.
|
|
|
+ *
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
clear() {
|
|
|
|
|
|
return this.remove( ... this.children );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Adds the given 3D object as a child of this 3D object, while maintaining the object's world
|
|
|
+ * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).
|
|
|
+ *
|
|
|
+ * @param {Object3D} object - The 3D object to attach.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
attach( object ) {
|
|
|
|
|
|
// adds object as a child of this, while maintaining the object's world transform
|
|
|
@@ -442,18 +824,40 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Searches through the 3D object and its children, starting with the 3D object
|
|
|
+ * itself, and returns the first with a matching ID.
|
|
|
+ *
|
|
|
+ * @param {number} id - The id.
|
|
|
+ * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.
|
|
|
+ */
|
|
|
getObjectById( id ) {
|
|
|
|
|
|
return this.getObjectByProperty( 'id', id );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Searches through the 3D object and its children, starting with the 3D object
|
|
|
+ * itself, and returns the first with a matching name.
|
|
|
+ *
|
|
|
+ * @param {string} name - The name.
|
|
|
+ * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.
|
|
|
+ */
|
|
|
getObjectByName( name ) {
|
|
|
|
|
|
return this.getObjectByProperty( 'name', name );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Searches through the 3D object and its children, starting with the 3D object
|
|
|
+ * itself, and returns the first with a matching property value.
|
|
|
+ *
|
|
|
+ * @param {string} name - The name of the property.
|
|
|
+ * @param {any} value - The value.
|
|
|
+ * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.
|
|
|
+ */
|
|
|
getObjectByProperty( name, value ) {
|
|
|
|
|
|
if ( this[ name ] === value ) return this;
|
|
|
@@ -475,6 +879,15 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Searches through the 3D object and its children, starting with the 3D object
|
|
|
+ * itself, and returns all 3D objects with a matching property value.
|
|
|
+ *
|
|
|
+ * @param {string} name - The name of the property.
|
|
|
+ * @param {any} value - The value.
|
|
|
+ * @param {Array<Object3D>} result - The method stores the result in this array.
|
|
|
+ * @return {Array<Object3D>} The found 3D objects.
|
|
|
+ */
|
|
|
getObjectsByProperty( name, value, result = [] ) {
|
|
|
|
|
|
if ( this[ name ] === value ) result.push( this );
|
|
|
@@ -491,6 +904,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns a vector representing the position of the 3D object in world space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} target - The target vector the result is stored to.
|
|
|
+ * @return {Vector3} The 3D object's position in world space.
|
|
|
+ */
|
|
|
getWorldPosition( target ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -499,6 +918,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns a Quaternion representing the position of the 3D object in world space.
|
|
|
+ *
|
|
|
+ * @param {Quaternion} target - The target Quaternion the result is stored to.
|
|
|
+ * @return {Quaternion} The 3D object's rotation in world space.
|
|
|
+ */
|
|
|
getWorldQuaternion( target ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -509,6 +934,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns a vector representing the scale of the 3D object in world space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} target - The target vector the result is stored to.
|
|
|
+ * @return {Vector3} The 3D object's scale in world space.
|
|
|
+ */
|
|
|
getWorldScale( target ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -519,6 +950,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns a vector representing the ("look") direction of the 3D object in world space.
|
|
|
+ *
|
|
|
+ * @param {Vector3} target - The target vector the result is stored to.
|
|
|
+ * @return {Vector3} The 3D object's direction in world space.
|
|
|
+ */
|
|
|
getWorldDirection( target ) {
|
|
|
|
|
|
this.updateWorldMatrix( true, false );
|
|
|
@@ -529,6 +966,15 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Abstract method to get intersections between a casted ray and this
|
|
|
+ * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}
|
|
|
+ * implement this method in order to use raycasting.
|
|
|
+ *
|
|
|
+ * @abstract
|
|
|
+ * @param {Raycaster} raycaster - The raycaster.
|
|
|
+ * @param {Array<Object>} intersects - An array holding the result of the method.
|
|
|
+ */
|
|
|
raycast( /* raycaster, intersects */ ) {}
|
|
|
|
|
|
traverse( callback ) {
|
|
|
@@ -575,6 +1021,10 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Updates the transformation matrix in local space by computing it from the current
|
|
|
+ * positon, rotation and scale values.
|
|
|
+ */
|
|
|
updateMatrix() {
|
|
|
|
|
|
this.matrix.compose( this.position, this.quaternion, this.scale );
|
|
|
@@ -583,6 +1033,17 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Updates the transformation matrix in world space of this 3D objects and its descendants.
|
|
|
+ *
|
|
|
+ * To ensure correct results, this method also recomputes the 3D object's transformation matrix in
|
|
|
+ * local space. The computation of the local and world matrix can be controlled with the
|
|
|
+ * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both
|
|
|
+ * `true` by default. Set these flags to `false` if you need more control over the update matrix process.
|
|
|
+ *
|
|
|
+ * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even
|
|
|
+ * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.
|
|
|
+ */
|
|
|
updateMatrixWorld( force ) {
|
|
|
|
|
|
if ( this.matrixAutoUpdate ) this.updateMatrix();
|
|
|
@@ -623,6 +1084,13 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the
|
|
|
+ * update of ancestor and descendant nodes.
|
|
|
+ *
|
|
|
+ * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.
|
|
|
+ * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.
|
|
|
+ */
|
|
|
updateWorldMatrix( updateParents, updateChildren ) {
|
|
|
|
|
|
const parent = this.parent;
|
|
|
@@ -667,6 +1135,12 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Serializes the 3D object into JSON.
|
|
|
+ *
|
|
|
+ * @param {?(Object|String)} meta - An optional value holding meta information about the serialization.
|
|
|
+ * @return {Object} The JSON.
|
|
|
+ */
|
|
|
toJSON( meta ) {
|
|
|
|
|
|
// meta is a string when called from JSON.stringify
|
|
|
@@ -962,12 +1436,25 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns a new 3D object with copied values from this instance.
|
|
|
+ *
|
|
|
+ * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.
|
|
|
+ * @return {Object3D} A clone of this instance.
|
|
|
+ */
|
|
|
clone( recursive ) {
|
|
|
|
|
|
return new this.constructor().copy( this, recursive );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Copies the values of the given 3D object to this instance.
|
|
|
+ *
|
|
|
+ * @param {Object3D} source - The 3D object to copy.
|
|
|
+ * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.
|
|
|
+ * @return {Object3D} A reference to this instance.
|
|
|
+ */
|
|
|
copy( source, recursive = true ) {
|
|
|
|
|
|
this.name = source.name;
|
|
|
@@ -1017,8 +1504,34 @@ class Object3D extends EventDispatcher {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * The default up direction for objects, also used as the default
|
|
|
+ * position for {@link DirectionalLight} and {@link HemisphereLight}.
|
|
|
+ *
|
|
|
+ * @static
|
|
|
+ * @type {Vector3}
|
|
|
+ * @default (0,1,0)
|
|
|
+ */
|
|
|
Object3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );
|
|
|
+
|
|
|
+/**
|
|
|
+ * The default setting for {@link Object3D#matrixAutoUpdate} for
|
|
|
+ * newly created 3D objects.
|
|
|
+ *
|
|
|
+ * @static
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true;
|
|
|
+
|
|
|
+/**
|
|
|
+ * The default setting for {@link Object3D#matrixWorldAutoUpdate} for
|
|
|
+ * newly created 3D objects.
|
|
|
+ *
|
|
|
+ * @static
|
|
|
+ * @type {boolean}
|
|
|
+ * @default true
|
|
|
+ */
|
|
|
Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;
|
|
|
|
|
|
export { Object3D };
|