商域无疆 (http://blog.youkuaiyun.com/omni360/)
本文遵循“署名-非商业用途-保持一致”创作公用协议
转载请保留此句:商域无疆 - 本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
俺也是刚开始学,好多地儿肯定不对还请见谅.
以下代码是THREE.JS 源码文件中Core/Object3D.js文件的注释.
更多更新在 : https://github.com/omni360/three.js.sourcecode
/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
*/
/*
///Object3D是场景中图形对象的基类.Object3D对象的功能函数采用定义构造的函数原型对象来实现.
*/
///<summary>Object3D</summary>
THREE.Object3D = function () {
/****************************************
****下面是Object3D对象的属性定义
****************************************/
this.id = THREE.Object3DIdCount ++; //Object3D对象id属性.
this.uuid = THREE.Math.generateUUID(); //调用THREE.Math.generateUUID()方法,Object3D对象uuid(通用唯一识别码)属性,
this.name = ''; //Object3D对象name属性,可以为当前对象定义一个名称,初始化为''
this.parent = undefined; //Object3D对象parent属性,初始化为undefined.
this.children = []; //Object3D对象children属性,初始化为[].
this.up = THREE.Object3D.DefaultUp.clone(); ////Object3D对象up属性,当前对象的上方,初始化为THREE.Vector3( 0, 1, 0 )
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 );
rotation.onChange( function () {
quaternion.setFromEuler( rotation, false ); //给对象的rotation属性绑定setFromEuler()方法,当rotation属性值更改,调用setFromEuler()方法
} );
quaternion.onChange( function () {
rotation.setFromQuaternion( quaternion, undefined, false ); //给对象的quaternion属性绑定setFromQuaternion()方法,当rotation属性值更改,调用setFromEuler()方法
} );
Object.defineProperties( this, {
position: { //Object3D对象position属性
enumerable: true,
value: position
},
rotation: { //Object3D对象rotation属性,以弧度为单位
enumerable: true,
value: rotation
},
quaternion: { //Object3D对象quaternion属性,当useQuaternion属性为true,可用.
enumerable: true,
value: quaternion
},
scale: { //Object3D对象scale属性
enumerable: true,
value: scale
},
} );
this.renderDepth = null; //Object3D对象renderDepth属性,初始化为null,如果设置了值将会覆盖渲染深度.
this.rotationAutoUpdate = true; //Object3D对象rotationAutoUpdate属性,初始化为true,表示每帧都会重新计算.
this.matrix = new THREE.Matrix4(); //Object3D对象matrix属性,变换矩阵
this.matrixWorld = new THREE.Matrix4(); //Object3D对象matrixWorld属性,如果当前对象是子对象,matrixWorld属性为上一级对象的变换矩阵,否则是自己的变换矩阵.
this.matrixAutoUpdate = true; //Object3D对象matrixAutoUpdate属性,初始化为true,表示每帧都会重新计算缩放,位置,旋转或四元数矩阵.matrixWorld属性也会重新计算
this.matrixWorldNeedsUpdate = false; //Object3D对象matrixWorldNeedsUpdate属性,初始化为false
this.visible = true; //Object3D对象visible属性,表示当前对象场景中是否可见,初始化为trure
this.castShadow = false; //Object3D对象castShadow属性,初始化为false,表示不产生阴影
this.receiveShadow = false; //Object3D对象receiveShadow属性,初始化为false,表示材质不接受烘焙阴影
this.frustumCulled = true; //Object3D对象frustumCulled属性,初始化为true
this.userData = {}; //Object3D对象userData属性,初始化为{},用户自定义的其它属性,这里的数值不会被clone
};
THREE.Object3D.DefaultUp = new THREE.Vector3( 0, 1, 0 ); //设置Object3D对象的默认上方向.
/****************************************
****下面是Object3D对象提供的功能函数.
****************************************/
THREE.Object3D.prototype = {
constructor: THREE.Object3D, //构造器,返回对创建此对象Object3D函数的引用.
/*
///get eulerOrder 方法用来获得欧拉角的轴顺序
///NOTE: get eulerOrder()的用法是Quaternion.prototype.eulerOrder,这种用法在除ie浏览器以外的浏览器上可以使用.
///NOTE: .eulerOrder方法已经被删除了, 现在使用.rotation.order.这里保留这个方法,为了向下兼容.
*/
///<summary>get eulerOrder</summary>
///<returns type="number">返回欧拉角的轴顺序</returns>
get eulerOrder () {
//.eulerOrder方法已经被删除了.这里保留这个方法, 现在使用.rotation.order.为了向下兼容.
console.warn( 'THREE.Object3D: .eulerOrder has been moved to .rotation.order.' );
//返回欧拉角的轴顺序
retu