mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-09 04:56:01 +10:00
* Camera is now a base object. PerspectiveCamera should be used instead. Figured out a way to show a warning when misused. * OrthoCamera is now OrthographicCamera. * Removed `target` from Camera. Misc * Renamed Trident to Axes.
274 lines
4.6 KiB
JavaScript
274 lines
4.6 KiB
JavaScript
/**
|
|
* @author mr.doob / http://mrdoob.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
THREE.Object3D = function() {
|
|
|
|
this.name = '';
|
|
|
|
this.id = THREE.Object3DCount ++;
|
|
|
|
this.parent = undefined;
|
|
this.children = [];
|
|
|
|
this.up = new THREE.Vector3( 0, 1, 0 );
|
|
|
|
this.position = new THREE.Vector3();
|
|
this.rotation = new THREE.Vector3();
|
|
this.eulerOrder = 'XYZ';
|
|
this.scale = new THREE.Vector3( 1, 1, 1 );
|
|
|
|
this.dynamic = false; // when true it retains arrays so they can be updated with __dirty*
|
|
|
|
this.doubleSided = false;
|
|
this.flipSided = false;
|
|
|
|
this.renderDepth = null;
|
|
|
|
this.rotationAutoUpdate = true;
|
|
|
|
this.matrix = new THREE.Matrix4();
|
|
this.matrixWorld = new THREE.Matrix4();
|
|
this.matrixRotationWorld = new THREE.Matrix4();
|
|
|
|
this.matrixAutoUpdate = true;
|
|
this.matrixWorldNeedsUpdate = true;
|
|
|
|
this.quaternion = new THREE.Quaternion();
|
|
this.useQuaternion = false;
|
|
|
|
this.boundRadius = 0.0;
|
|
this.boundRadiusScale = 1.0;
|
|
|
|
this.visible = true;
|
|
|
|
this.castShadow = false;
|
|
this.receiveShadow = false;
|
|
|
|
this.frustumCulled = true;
|
|
|
|
this._vector = new THREE.Vector3();
|
|
|
|
};
|
|
|
|
|
|
THREE.Object3D.prototype = {
|
|
|
|
constructor: THREE.Object3D,
|
|
|
|
translate: function ( distance, axis ) {
|
|
|
|
this.matrix.rotateAxis( axis );
|
|
this.position.addSelf( axis.multiplyScalar( distance ) );
|
|
|
|
},
|
|
|
|
translateX: function ( distance ) {
|
|
|
|
this.translate( distance, this._vector.set( 1, 0, 0 ) );
|
|
|
|
},
|
|
|
|
translateY: function ( distance ) {
|
|
|
|
this.translate( distance, this._vector.set( 0, 1, 0 ) );
|
|
|
|
},
|
|
|
|
translateZ: function ( distance ) {
|
|
|
|
this.translate( distance, this._vector.set( 0, 0, 1 ) );
|
|
|
|
},
|
|
|
|
lookAt: function ( vector ) {
|
|
|
|
// TODO: Add hierarchy support.
|
|
|
|
this.matrix.lookAt( vector, this.position, this.up );
|
|
|
|
if ( this.rotationAutoUpdate ) {
|
|
|
|
this.rotation.setRotationFromMatrix( this.matrix );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
add: function ( object ) {
|
|
|
|
if ( this.children.indexOf( object ) === - 1 ) {
|
|
|
|
if( object.parent !== undefined ) {
|
|
|
|
object.parent.removeChild( object );
|
|
|
|
}
|
|
|
|
object.parent = this;
|
|
this.children.push( object );
|
|
|
|
// add to scene
|
|
|
|
var scene = this;
|
|
|
|
while ( scene.parent !== undefined ) {
|
|
|
|
scene = scene.parent;
|
|
|
|
}
|
|
|
|
if ( scene !== undefined && scene instanceof THREE.Scene ) {
|
|
|
|
scene.addChildRecurse( object );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
remove: function ( object ) {
|
|
|
|
var scene = this;
|
|
|
|
var childIndex = this.children.indexOf( object );
|
|
|
|
if ( childIndex !== - 1 ) {
|
|
|
|
object.parent = undefined;
|
|
this.children.splice( childIndex, 1 );
|
|
|
|
// remove from scene
|
|
|
|
while ( scene.parent !== undefined ) {
|
|
|
|
scene = scene.parent;
|
|
|
|
}
|
|
|
|
if ( scene !== undefined && scene instanceof THREE.Scene ) {
|
|
|
|
scene.removeChildRecurse( object );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getChildByName: function ( name, doRecurse ) {
|
|
|
|
var c, cl, child, recurseResult;
|
|
|
|
for ( c = 0, cl = this.children.length; c < cl; c ++ ) {
|
|
|
|
child = this.children[ c ];
|
|
|
|
if ( child.name === name ) {
|
|
|
|
return child;
|
|
|
|
}
|
|
|
|
if ( doRecurse ) {
|
|
|
|
recurseResult = child.getChildByName( name, doRecurse );
|
|
|
|
if ( recurseResult !== undefined ) {
|
|
|
|
return recurseResult;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return undefined;
|
|
|
|
},
|
|
|
|
updateMatrix: function () {
|
|
|
|
this.matrix.setPosition( this.position );
|
|
|
|
if ( this.useQuaternion ) {
|
|
|
|
this.matrix.setRotationFromQuaternion( this.quaternion );
|
|
|
|
} else {
|
|
|
|
this.matrix.setRotationFromEuler( this.rotation, this.eulerOrder );
|
|
|
|
}
|
|
|
|
if ( this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1 ) {
|
|
|
|
this.matrix.scale( this.scale );
|
|
this.boundRadiusScale = Math.max( this.scale.x, Math.max( this.scale.y, this.scale.z ) );
|
|
|
|
}
|
|
|
|
this.matrixWorldNeedsUpdate = true;
|
|
|
|
},
|
|
|
|
update: function ( parentMatrixWorld, forceUpdate, camera ) {
|
|
|
|
this.matrixAutoUpdate && this.updateMatrix();
|
|
|
|
// update matrixWorld
|
|
|
|
if ( this.matrixWorldNeedsUpdate || forceUpdate ) {
|
|
|
|
if ( parentMatrixWorld ) {
|
|
|
|
this.matrixWorld.multiply( parentMatrixWorld, this.matrix );
|
|
|
|
} else {
|
|
|
|
this.matrixWorld.copy( this.matrix );
|
|
|
|
}
|
|
|
|
this.matrixRotationWorld.extractRotation( this.matrixWorld, this.scale );
|
|
|
|
this.matrixWorldNeedsUpdate = false;
|
|
|
|
forceUpdate = true;
|
|
|
|
}
|
|
|
|
// update children
|
|
|
|
for ( var i = 0, l = this.children.length; i < l; i ++ ) {
|
|
|
|
this.children[ i ].update( this.matrixWorld, forceUpdate, camera );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// DEPRECATED
|
|
|
|
addChild: function ( child ) {
|
|
|
|
console.warn( 'DEPRECATED: Object3D.addChild() is now Object3D.add().' );
|
|
this.add( child );
|
|
|
|
},
|
|
|
|
removeChild: function ( child ) {
|
|
|
|
console.warn( 'DEPRECATED: Object3D.removeChild() is now Object3D.remove().' );
|
|
this.remove( child );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
THREE.Object3DCount = 0;
|