Matrix transformations

在three.js之中我們以矩陣(matrices)達成變換(transformations):

  1. 移動
  2. 旋轉
  3. 縮放

所有Object3D之instance 都有個矩陣儲存物件的位置(position), 旋轉(rotation), 及比例(scale)。

Convenience properties and matrixAutoUpdate

以下有兩種方式更新物件的transformations:

  1. 修改物件的位置(position),四元數(quaternion),及比例(scale)屬性,再讓three.js重新計算物件的矩陣。
     object.position.copy(start_position);
     object.quaternion.copy(quaternion);
    
    在預設的情況下matrixAutoUpdate的屬性是設定為true的,這樣矩陣會自動進行重複的計算。若物件是靜態的或你期望手動來控制計算的發生,你可以將此一屬性設為false
     object.matrixAutoUpdate = false;
    
    並在更改任何屬性後手動更新矩陣:
     object.updateMatrix();
    
    2.直接修改物件的矩陣。在Matrix4類別中提供了多種方法來達到此目的:
     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

results matching ""

    No results matching ""