1. 程式人生 > >three.js 原始碼註釋(二十二)Core/Object3D.js

three.js 原始碼註釋(二十二)Core/Object3D.js


俺也是剛開始學,好多地兒肯定不對還請見諒.

以下程式碼是THREE.JS 原始碼檔案中Core/Object3D.js檔案的註釋.


/**
 * @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.' );
		//返回尤拉角的軸順序
		return this.rotation.order;

	},

	/*
	///set eulerOrder 方法用來設定尤拉角的軸順序
	///NOTE: set eulerOrder()的用法是Quaternion.prototype.eulerOrder,這種用法在除ie瀏覽器以外的瀏覽器上可以使用.
	///NOTE: .eulerOrder方法已經被刪除了, 現在使用.rotation.order.這裡保留這個方法,為了向下相容.
	*/
	///<summary>set eulerOrder</summary>
	///<returns type="number">返回新的尤拉角的軸順序</returns>
	set eulerOrder ( value ) {
		//.eulerOrder方法已經被刪除了.這裡保留這個方法, 現在使用.rotation.order.為了向下相容.
		console.warn( 'THREE.Object3D: .eulerOrder has been moved to .rotation.order.' );
		//返回新的尤拉角的軸順序
		this.rotation.order = value;

	},

	/*
	///get useQuaternion 方法用來獲得useQuaternion屬性是否被設定為true
	///NOTE: get useQuaternion()的用法是Quaternion.prototype.eulerOrder,這種用法在除ie瀏覽器以外的瀏覽器上可以使用.
	///NOTE: .useQuaternion方法已經被刪除了, 現在預設使用quaternions.
	*/
	///<summary>get useQuaternion</summary>
	///<returns type="Boolean">返回useQuaternion屬性是否被設定為true</returns>
	get useQuaternion () {
		///提示使用者.useQuaternion方法已經被刪除了, 現在預設使用quaternions.
		console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );

	},

	/*
	///set useQuaternion 方法用來獲得useQuaternion屬性是否被設定為true
	///NOTE: set useQuaternion()的用法是Quaternion.prototype.eulerOrder,這種用法在除ie瀏覽器以外的瀏覽器上可以使用.
	///NOTE: .useQuaternion方法已經被刪除了, 現在預設使用quaternions.
	*/
	///<summary>set useQuaternion</summary>
	set useQuaternion ( value ) {
		///提示使用者.useQuaternion方法已經被刪除了, 現在預設使用quaternions.
		console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );

	},

	/*
	///applyMatrix方法對物件的matrix屬性應用矩陣變換.達到旋轉,縮放,移動的目的.
	*/
	///<summary>applyMatrix</summary>
	///<param name ="m" type="Matrix4">仿射矩陣</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	applyMatrix: function ( matrix ) {
		//multiply方法用來將矩陣a,b相乘,並返回新的Matrix4(4x4矩陣).
		this.matrix.multiplyMatrices( matrix, this.matrix );
		//decompose方法和compose()方法對應.將轉換矩陣的平移、旋轉和縮放設定作為由三個 Vector3 物件組成的向量返回。第一個 Vector3 物件容納平移元素。第二個 Vector3 物件容納旋轉元素。第三個 Vector3 物件容納縮放元素。 
		this.matrix.decompose( this.position, this.quaternion, this.scale );	

	},

	/*
	///setRotationFromAxisAngle方法通過四元數的方式旋轉任意座標軸(引數axis)旋轉角度(引數angle),最後將結果返回到this.quternion屬性中.
	/// NOTE:引數axis必須是單位向量,通過呼叫.normalize()得到單位向量.
	*/
	///<summary>setRotationFromAxisAngle</summary>
	///<param name ="axis" type="Vector3">三維向量</param>
	///<param name ="angle" type="float">角度</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	setRotationFromAxisAngle: function ( axis, angle ) {

		// assumes axis is normalized
		// 確保座標軸是單位向量

		this.quaternion.setFromAxisAngle( axis, angle );	//呼叫quaternion.setFromAxisAngle方法,繞任意軸設定旋轉四元數

	},

	/*
	///setRotationFromEuler方法通過一次尤拉旋轉(引數euler)設定四元數旋轉,最後將結果返回到this.quternion屬性中.
	*/
	///<summary>setRotationFromEuler</summary>
	///<param name ="euler" type="THREE.Euler">THREE.Euler物件,尤拉物件</param>
	///<param name ="update" type="bool">true 或者 false,如果不等於false,Quaternion物件呼叫onChangeCallback函式</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	setRotationFromEuler: function ( euler ) {

		this.quaternion.setFromEuler( euler, true );	//呼叫quaternion.setFromEuler方法,applyEuler方法通過一次尤拉旋轉(引數euler)設定四元數旋轉

	},

	/*
	///setRotationFromMatrix方法利用一個引數m(旋轉矩陣),達到旋轉變換的目的吧,最後將結果返回到this.quternion屬性中.
	/// NOTE:m是一個旋轉矩陣,更多公式:http://en.wikipedia.org/wiki/Transformation_matrix
	///	
	/// 樣例:

		這個樣例是z軸旋轉30度.

					/----------------------------------------------------\
					|cos(heading) = 0.866	| sin(heading) = 0.5   | 0	 |
					|-----------------------|----------------------------|
		matrix =	|-sin(heading) = -0.5   |cos(heading) = 0.866  | 0   |
					|-----------------------|----------------------|-----|
					|     0                 |     0                | 1   |
					\----------------------------------------------------/

		angle = acos ( ( m00 + m11 + m22 - 1)/2)

		angle = acos ( ( 0.866 + 0.866 + 1 - 1)/2)

		angle = acos ( 0.866 )

		angle = 30 degrees

		x = (m21 - m12) = 0 - 0 =0
		y = (m02 - m20) = 0 - 0 =0
		z = (m10 - m01) = -0.5 - 0.5 = -1

	*/
	///<summary>setRotationFromMatrix</summary>
	///<param name ="m" type="Matrix3">3x3矩陣(旋轉矩陣)</param>
	///<param name ="order" type="String">order(旋轉順序) 預設順序是'XYZ' 取值範圍是['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	setRotationFromMatrix: function ( m ) {

		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
		// 確保引數m是一個3x3的旋轉矩陣.

		this.quaternion.setFromRotationMatrix( m );	//呼叫quaternion.setFromRotationMatrix方法,setFromRotationMatrix方法通過引數m(旋轉矩陣)設定旋轉四元數

	},

	/*
	///setRotationFromQuaternion方法通過規範化的旋轉四元數直接應用旋轉
	*/
	///<summary>setRotationFromQuaternion</summary>
	///<param name ="q" type="Quaternion">四元數</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	setRotationFromQuaternion: function ( q ) {

		// assumes q is normalized
		// 確保引數q是規範化的

		this.quaternion.copy( q );	//呼叫quaternion.copy方法,copy方法通過直接將規範化的旋轉四元數設定給this.quternion屬性

	},

	/*
	///rotateOnAxis方法繞任意座標軸(引數axis)旋轉角度(引數angle)
	*/
	///<summary>rotateOnAxis</summary>
	///<param name ="axis" type="Vector3">三維向量</param>
	///<param name ="angle" type="float">角度</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	rotateOnAxis: function () {

		// rotate object on axis in object space
		// 在指定的座標軸上旋轉物件.
		// axis is assumed to be normalized
		// 保證引數axis是規範化的

		var q1 = new THREE.Quaternion();

		return function ( axis, angle ) {

			q1.setFromAxisAngle( axis, angle );	//呼叫setFromAxisAngle()方法,繞座標軸旋轉指定角度.

			this.quaternion.multiply( q1 );	

			return this;	//返回新的Object3D物件

		}

	}(),

	/*
	///rotateX方法旋轉繞x軸旋轉角度(引數angle)
	*/
	///<summary>rotateX</summary>
	///<param name ="angle" type="float">角度</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	rotateX: function () {

		var v1 = new THREE.Vector3( 1, 0, 0 );

		return function ( angle ) {

			return this.rotateOnAxis( v1, angle );	//呼叫rotateOnAxis()方法,繞x軸旋轉指定角度.

		};

	}(),

	/*
	///rotateY方法旋轉繞x軸旋轉角度(引數angle)
	*/
	///<summary>rotateY</summary>
	///<param name ="angle" type="float">角度</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	rotateY: function () {

		var v1 = new THREE.Vector3( 0, 1, 0 );

		return function ( angle ) {

			return this.rotateOnAxis( v1, angle );	//呼叫rotateOnAxis()方法,繞Y軸旋轉指定角度.

		};

	}(),

	/*
	///rotateZ方法旋轉繞x軸旋轉角度(引數angle)
	*/
	///<summary>rotateZ</summary>
	///<param name ="angle" type="float">角度</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	rotateZ: function () {

		var v1 = new THREE.Vector3( 0, 0, 1 );

		return function ( angle ) {

			return this.rotateOnAxis( v1, angle );	//呼叫rotateOnAxis()方法,繞Z軸旋轉指定角度.

		};

	}(),

	/*
	///translateOnAxis方法沿任意座標軸(引數axis)移動指定距離(引數distance)
	*/
	///<summary>translateOnAxis</summary>
	///<param name ="axis" type="Vector3">三維向量</param>
	///<param name ="distance" type="float">距離</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	translateOnAxis: function () {

		// translate object by distance along axis in object space
		// 在指定軸上移動物件
		// axis is assumed to be normalized
		// 引數axis必須是規範化的.

		var v1 = new THREE.Vector3();

		return function ( axis, distance ) {

			v1.copy( axis ).applyQuaternion( this.quaternion );	//呼叫applyQuaternion()方法,沿任意座標軸(引數axis)移動指定距離(引數distance)

			this.position.add( v1.multiplyScalar( distance ) );

			return this;	//返回新的Object3D物件

		}

	}(),

	/*
	///translate方法沿任意座標軸(引數axis)移動指定距離(引數distance)
	/// NOTE:translate方法已經被刪除,被translateOnAxis替代.這裡保留,為了向下相容
	*/
	///<summary>translate</summary>
	///<param name ="distance" type="float">距離</param>
	///<param name ="axis" type="Vector3">三維向量</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	translate: function ( distance, axis ) {
		//提示使用者translate方法已經被刪除,被translateOnAxis替代.
		console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
		return this.translateOnAxis( axis, distance );	//呼叫translateOnAxis()方法,移動物件,返回新的Object3D物件

	},

	/*
	///translateX方法沿任意x軸移動指定距離(引數distance)
	*/
	///<summary>translateX</summary>
	///<param name ="distance" type="float">距離</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	translateX: function () {

		var v1 = new THREE.Vector3( 1, 0, 0 );

		return function ( distance ) {

			return this.translateOnAxis( v1, distance );	//呼叫translateOnAxis()方法,繞X軸旋轉指定角度.

		};

	}(),

	/*
	///translateY方法沿任意Y軸移動指定距離(引數distance)
	*/
	///<summary>translateY</summary>
	///<param name ="distance" type="float">距離</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	translateY: function () {

		var v1 = new THREE.Vector3( 0, 1, 0 );

		return function ( distance ) {

			return this.translateOnAxis( v1, distance );	//呼叫translateOnAxis()方法,繞Y軸旋轉指定角度.

		};

	}(),

	/*
	///translateZ方法沿任意Z軸移動指定距離(引數distance)
	*/
	///<summary>translateZ</summary>
	///<param name ="distance" type="float">距離</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	translateZ: function () {

		var v1 = new THREE.Vector3( 0, 0, 1 );

		return function ( distance ) {

			return this.translateOnAxis( v1, distance );	//呼叫translateOnAxis()方法,繞Z軸旋轉指定角度.

		};

	}(),

	/*
	///localToWorld方法與worldToLocal方法相對應,將引數vector,從物件座標空間變換成世界座標空間
	*/
	///<summary>localToWorld</summary>
	///<param name ="vector" type="Vector">Vector3物件</param>
	///<returns type="Object3D">返回世界座標空間的Vector3物件.</returns>
	localToWorld: function ( vector ) {

		return vector.applyMatrix4( this.matrixWorld );	//返回世界座標空間的Vector3物件.

	},

	/*
	///worldToLocal方法與localToWorld方法相對應,將引數vector,從世界座標空間變換成物件座標空間
	*/
	///<summary>worldToLocal</summary>
	///<param name ="vector" type="Vector">Vector3物件</param>
	///<returns type="Object3D">返回物件座標空間的Vector3物件.</returns>
	worldToLocal: function () {

		var m1 = new THREE.Matrix4();

		return function ( vector ) {

			return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );	//返回物件座標空間的Vector3物件.

		};

	}(),

	/*
	///lookAt方法用來旋轉物件,並將物件面對空間中的點(引數vector)
	*/
	///<summary>lookAt</summary>
	///<param name ="vector" type="Vector">Vector3物件</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	lookAt: function () {

		// This routine does not support objects with rotated and/or translated parent(s)
		// lookat不支援巢狀物件的旋轉,變換

		var m1 = new THREE.Matrix4();

		return function ( vector ) {

			m1.lookAt( vector, this.position, this.up );	//呼叫THREE.Matrix4.lookAt()方法.

			this.quaternion.setFromRotationMatrix( m1 );	//返回新的Object3D物件

		};

	}(),

	/*
	///add方法用來將物件(引數object),設定為當前物件的子物件
	/// NOTE:引數是多個Object3D物件.
	*/
	///<summary>add</summary>
	///<param name ="object" type="Object3D">Object3D物件</param>
	///<returns type="Object3D">返回包含Object3D物件的Object3D物件.</returns>
	add: function ( object ) {

		if ( arguments.length > 1 ) {

			for ( var i = 0; i < arguments.length; i++ ) {

				this.add( arguments[ i ] );

			}

			return this;	//返回包含Object3D物件的Object3D物件.

		};

		if ( object === this ) {
			//提示使用者,自己不能新增自己.
			console.error( "THREE.Object3D.add:", object, "can't be added as a child of itself." );
			return this;

		}

		if ( object instanceof THREE.Object3D ) {

			if ( object.parent !== undefined ) {

				object.parent.remove( object );

			}

			object.parent = this;
			object.dispatchEvent( { type: 'added' } );

			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.__addObject( object );

			}

		} else {
		
			console.error( "THREE.Object3D.add:", object, "is not an instance of THREE.Object3D." );
		
		}

		return this;	//返回包含Object3D物件的Object3D物件.

	},

	/*
	///remove方法用來將當前物件的子物件(引數object)刪除
	/// NOTE:引數是多個Object3D物件.
	*/
	///<summary>remove</summary>
	///<param name ="object" type="Object3D">當前物件的子物件,Object3D物件</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	remove: function ( object ) {

		if ( arguments.length > 1 ) {

			for ( var i = 0; i < arguments.length; i++ ) {

				this.remove( arguments[ i ] );

			}

		};

		var index = this.children.indexOf( object );

		if ( index !== - 1 ) {

			object.parent = undefined;
			object.dispatchEvent( { type: 'removed' } );

			this.children.splice( index, 1 );

			// remove from scene
			// 從場景中刪除物件.

			var scene = this;

			while ( scene.parent !== undefined ) {

				scene = scene.parent;

			}

			if ( scene !== undefined && scene instanceof THREE.Scene ) {

				scene.__removeObject( object );

			}

		}

	},

	raycast: function () {},	//光線跟蹤

	/*
	///traverse方法遍歷當前物件以及子物件並且應用callback方法.
	*/
	///<summary>traverse</summary>
	///<param name ="callback" type="Function">要應用的方法</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	traverse: function ( callback ) {

		callback( this );	//應用callback方法.

		for ( var i = 0, l = this.children.length; i < l; i ++ ) {		//遍歷所有子物件,遞迴呼叫traverse方法,應用callback方法.

			this.children[ i ].traverse( callback );

		}

	},

	/*
	///traverse方法遍歷當前物件以及子物件並且當物件的Visible屬性為true,應用callback方法.
	*/
	///<summary>traverse</summary>
	///<param name ="callback" type="Function">要應用的方法</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>
	traverseVisible: function ( callback ) {

		if ( this.visible === false ) return;

		callback( this );

		for ( var i = 0, l = this.children.length; i < l; i ++ ) {		//遍歷所有子物件,遞迴呼叫traverseVisible方法,應用callback方法.

			this.children[ i ].traverseVisible( callback );

		}

	},

	/*
	///getObjectById方法通過id獲得子物件.recursive預設為false,表示不才查詢子物件的子物件.
	*/
	///<summary>getObjectById</summary>
	///<param name ="id" type="String">要應用的方法</param>
	///<param name ="recursive" type="Boolean">可選引數,true或者false</param>
	///<returns type="Object3D">返回id等於id的Object3D物件,沒找到返回undefined</returns>
	getObjectById: function ( id, recursive ) {

		for ( var i = 0, l = this.children.length; i < l; i ++ ) {

			var child = this.children[ i ];

			if ( child.id === id ) {

				return child;	//返回id等於id的Object3D物件

			}

			if ( recursive === true ) {

				child = child.getObjectById( id, recursive );

				if ( child !== undefined ) {

					return child;	//返回id等於id的Object3D物件

				}

			}

		}

		return undefined;	//沒找到返回undefined.

	},

	/*
	///getObjectById方法通過name獲得子物件.recursive預設為false,表示不才查詢子物件的子物件.
	*/
	///<summary>getObjectById</summary>
	///<param name ="name" type="String">要應用的方法</param>
	///<param name ="recursive" type="Boolean">可選引數,true或者false</param>
	///<returns type="Object3D">返回name等於name的Object3D物件,沒找到返回undefined</returns>
	getObjectByName: function ( name, recursive ) {

		for ( var i = 0, l = this.children.length; i < l; i ++ ) {

			var child = this.children[ i ];

			if ( child.name === name ) {

				return child;	//返回name等於name的Object3D物件

			}

			if ( recursive === true ) {

				child = child.getObjectByName( name, recursive );

				if ( child !== undefined ) {

					return child;	//返回name等於name的Object3D物件

				}

			}

		}

		return undefined;	///沒找到返回undefined

	},

	/*
	///getChildByName方法通過name獲得子物件.recursive預設為false,表示不才查詢子物件的子物件.
	///NOTE:getChildByName方法已經被getObjectByName方法替換,這裡保留為了向後相容.
	*/
	///<summary>getChildByName</summary>
	///<param name ="name" type="String">要應用的方法</param>
	///<param name ="recursive" type="Boolean">可選引數,true或者false</param>
	///<returns type="Object3D">返回name等於name的Object3D物件,沒找到返回undefined</returns>
	getChildByName: function ( name, recursive ) {
		//提示使用者getChildByName方法已經被getObjectByName方法替換,這裡保留為了向後相容.
		console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
		return this.getObjectByName( name, recursive );	//呼叫getObjectByName()方法.

	},

	/*
	///updateMatrix方法對當前物件的matrix屬性應用位移,旋轉,縮放變換.
	*/
	///<summary>updateMatrix</summary>
	///<returns type="Object3D">返回新的Object3D物件</returns>	
	updateMatrix: function () {

		this.matrix.compose( this.position, this.quaternion, this.scale );	//對當前物件的matrix屬性應用位移,旋轉,縮放變換.

		this.matrixWorldNeedsUpdate = true;	//設定matrixWorldNeedsUpdate為true

	},

	/*
	///updateMatrixWorld方法對當前物件及其子物件的matrix屬性應用全域性位移,旋轉,縮放變換.
	///NOTE: 在updateMatrixWorld方法中如果引數force為true,將對其子物件應用同樣的全域性變換.
	*/
	///<summary>updateMatrixWorld</summary>
	///<param name ="force" type="Boolean">true或者false</param>
	///<returns type="Object3D">返回新的Object3D物件</returns>		
	updateMatrixWorld: function ( force ) {

		if ( this.matrixAutoUpdate === true ) this.updateMatrix();

		if ( this.matrixWorldNeedsUpdate === true || force === true ) {

			if ( this.parent === undefined ) {

				this.matrixWorld.copy( this.matrix );

			} else {

				this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );

			}

			this.matrixWorldNeedsUpdate = false;

			force = true;

		}

		// update children
		// 更新子物件.

		for ( var i = 0, l = this.children.length; i < l; i ++ ) {

			this.children[ i ].updateMatrixWorld( force );	//呼叫updateMatrixWorld方法,對子物件應用變換

		}

	},

	/*clone方法
	///clone方法克隆Object3D物件,如果引數force為true,克隆其子物件,否則只克隆當前物件,預設為true.
	///NOTE: 在clone方法中如果引數force為true,將對其子物件應用同樣的全域性變換,預設為true.
	*/
	///<summary>clone</summary>
	///<returns type="Object3D">返回克隆的Object3D物件</returns>	
	clone: function ( object, recursive ) {

		if ( object === undefined ) object = new THREE.Object3D();
		if ( recursive === undefined ) recursive = true;

		object.name = this.name;

		object.up.copy( this.up );

		object.position.copy( this.position );
		object.quaternion.copy( this.quaternion );
		object.scale.copy( this.scale );

		object.renderDepth = this.renderDepth;

		object.rotationAutoUpdate = this.rotationAutoUpdate;

		object.matrix.copy( this.matrix );
		object.matrixWorld.copy( this.matrixWorld );

		object.matrixAutoUpdate = this.matrixAutoUpdate;
		object.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate;

		object.visible = this.visible;

		object.castShadow = this.castShadow;
		object.receiveShadow = this.receiveShadow;

		object.frustumCulled = this.frustumCulled;

		object.userData = JSON.parse( JSON.stringify( this.userData ) );

		if ( recursive === true ) {		//對子物件一一進行克隆.

			for ( var i = 0; i < this.children.length; i ++ ) {

				var child = this.children[ i ];
				object.add( child.clone() );

			}

		}

		return object;	//返回克隆的Object3D物件

	}

};
///EventDispatcher方法應用到當前Object3D物件.
THREE.EventDispatcher.prototype.apply( THREE.Object3D.prototype );
///設定全域性的Object3D物件計數器.
THREE.Object3DIdCount = 0;



以下程式碼是THREE.JS 原始碼檔案中Core/Object3D.js檔案的註釋.