下面是object3D对象的构造方法,在该方法下我们可以清楚的看到一个object3D对象的构造过程。
接下来按源码顺序具体解释一下每个属性和对象方法:
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
uuid是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。
name可以自己指定,默认为空。
type类型即为object3D。
children为其子对象。
THREE.Object3D.DefaultUp将此对象的up方向设置为默认的物体的up方向,同时也作为DirectionalLight、HemisphereLight和Spotlight(自顶向下创建的灯光)的默认方向。 默认设为( 0, 1, 0 )。
scope范围
position中心点的位置
rotation转动角度
quaternion四元数,这个现在我还没有搞懂
scale设置缩小或者放大倍数
onRotationChange用来更新转向
onQuaternionChange用来更新四元数
rotation.onChange转向改变就调用更新转向函数
quaternion.onChange四元数改变就调用更新四元数函数
Object.defineProperties见第一个
renderDepth渲染程度
rotationAutoUpdate设置转向自动更新
matrix这是关于矩阵的,之后再进行研究。
visible对象是否可见
castShadow光照是否有阴影
receiveShadow是否接收阴影
frustumCulled默认true,设置后在每一帧渲染时检查对象在相机的截头体(四棱台)。如果设定为真,那么在相机视界之外的会被踢出。
userDataObject 存储用户自定义数据的对象
源码如下所示:
THREE.Object3D = function () {
Object.defineProperty( this, 'id', { value: THREE.Object3DIdCount ++ } );
this.uuid = THREE.Math.generateUUID();
this.name = '';
this.type = 'Object3D';
this.parent = undefined;
this.children = [];
this.up = THREE.Object3D.DefaultUp.clone();
var scope = this;
var position = new THREE.Vector3();
var rotation = new THREE.Euler();
var quaternion = new THREE.Quaternion();
var scale = new THREE.Vector3( 1, 1, 1 );
var onRotationChange = function () {
quaternion.setFromEuler( rotation, false );
};
var onQuaternionChange = function () {
rotation.setFromQuaternion( quaternion, undefined, false );
};
rotation.onChange( onRotationChange );
quaternion.onChange( onQuaternionChange );
Object.defineProperties( this, {
position: {
enumerable: true,
value: position
},
rotation: {
enumerable: true,
value: rotation
},
quaternion: {
enumerable: true,
value: quaternion
},
scale: {
enumerable: true,
value: scale
},
} );
this.renderDepth = null;
this.rotationAutoUpdate = true;
this.matrix = new THREE.Matrix4();
this.matrixWorld = new THREE.Matrix4();
this.matrixAutoUpdate = true;
this.matrixWorldNeedsUpdate = false;
this.visible = true;
this.castShadow = false;
this.receiveShadow = false;
this.frustumCulled = true;
this.userData = {};
};