Matrix transformations
在three.js之中我們以矩陣(matrices)達成變換(transformations):
- 移動
- 旋轉
- 縮放
所有Object3D之instance 都有個矩陣儲存物件的位置(position), 旋轉(rotation), 及比例(scale)。
Convenience properties and matrixAutoUpdate
以下有兩種方式更新物件的transformations:
- 修改物件的位置(position),四元數(quaternion),及比例(scale)屬性,再讓three.js重新計算物件的矩陣。
在預設的情況下object.position.copy(start_position); object.quaternion.copy(quaternion);
matrixAutoUpdate
的屬性是設定為true
的,這樣矩陣會自動進行重複的計算。若物件是靜態的或你期望手動來控制計算的發生,你可以將此一屬性設為false
:
並在更改任何屬性後手動更新矩陣:object.matrixAutoUpdate = false;
2.直接修改物件的矩陣。在Matrix4類別中提供了多種方法來達到此目的:object.updateMatrix();
在這個情況之下object.matrix.setRotationFromQuaternion(quaternion); object.matrix.setPosition(start_position); object.matrixAutoUpdate = false;
matrixAutoUpdate
屬性必須設定為false
,且你必須確定不會呼叫到updateMatris()
。因為updateMatris()
會依照前述提到過的屬性來計算矩陣。
Object and world matrices
一個物件的矩陣所記錄的變換(transformation)是相對於父物件的,若是要得到此物件對應於世界座標的變換,你必須使用此物件的Object3D.matrixWorld
。
當父物件或子物件之變換改變時,你可以呼叫updateMatrixWorld()
來更新子物件的matrixWorld
屬性。
Rotation and Quaternion
three.js提供了兩種方式來表示3d的旋轉:歐拉角(Euler angles)以及四元數(Quaternions),並也提供了在兩者間轉換的方法。而歐拉角有個主要的問題稱作”gimbal lock”在某些結構下會缺少了一個自由度。因此,物件的旋轉將儲存在物件的四元數中。可參考gimbal lock
在前述的程式庫中包涵useQuaternion
這一屬性,當設置為false時,物件的矩陣將以歐拉角來計算。在實踐中這是不建議的,你反而該以setRotationFromEuler
方法來去更新四元數。
參考資料
http://threejs.org/docs/#Manual/Introduction/Creating_a_scene
四元數:
http://blog.roodo.com/sayaku/archives/19544672.html
https://ccjou.wordpress.com/2014/04/21/%E5%9B%9B%E5%85%83%E6%95%B8/
https://ccjou.wordpress.com/2014/04/23/%E5%9B%9B%E5%85%83%E6%95%B8%E8%88%87%E4%B8%89%E7%B6%AD%E7%A9%BA%E9%96%93%E6%97%8B%E8%BD%89/
https://www.ptt.cc/bbs/Flash/M.1282360275.A.6B7.html
旋轉:
https://ccjou.wordpress.com/2014/04/29/%E4%B8%89%E7%B6%AD%E7%A9%BA%E9%96%93%E7%9A%84%E6%97%8B%E8%BD%89%E7%9F%A9%E9%99%A3/
http://s.epb.idv.tw/han-shi-ku/unity/005unity3dxuanzhuanzhongdeshuxuezhishijigegehanshushuomingquaternion