three.js 原始碼註釋(二十二)Core/Object3D.js
阿新 • • 發佈:2019-01-22
俺也是剛開始學,好多地兒肯定不對還請見諒.
以下程式碼是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檔案的註釋.