three.js 矩陣變換

2023-02-16 17:24 更新

Three.js使用matrix編碼3D變換 —— 平移(位置),旋轉(zhuǎn)和縮放。 Object3D的每個實例都有一個matrix,用于存儲該對象的位置,旋轉(zhuǎn)和比例。本頁介紹如何更新對象的變換。

便利的屬性和matrixAutoUpdate(Convenience properties and matrixAutoUpdate)

有兩種方法可以更新對象的轉(zhuǎn)換:

  1. 修改對象的position,quaternionscale屬性,讓three.js重新計算來自這些屬性的對象矩陣:
  2. object.position.copy( start_position );
    object.quaternion.copy( quaternion );

    默認情況下,matrixAutoUpdate屬性設(shè)置為true,并且將自動重新計算矩陣。 如果對象是靜態(tài)的,或者您希望在重新計算時手動控制,則可以通過將屬性設(shè)置為false來獲得更好的性能:

    object.matrixAutoUpdate = false;

    更改任何屬性后,手動更新矩陣:

    object.updateMatrix();
  3. 直接修改對象的矩陣。 Matrix4類有各種修改矩陣的方法:
  4. object.matrix.setRotationFromQuaternion( quaternion );
    object.matrix.setPosition( start_position );
    object.matrixAutoUpdate = false;

    請注意,在這種情況下,matrixAutoUpdate 必須 設(shè)置為false,并且您應(yīng)該確保 不 調(diào)用updateMatrix。 調(diào)用updateMatrix將破壞對矩陣所做的手動更改,從positionscale重新計算矩陣,依此類推。

對象和世界矩陣(Object and world matrices)

一個對象的matrix存儲了該對象 相對于 其Object3D.parent(父節(jié)點)的變換。要在 世界 坐標系中獲取對象的轉(zhuǎn)換,您必須訪問該對象的Object3D.matrixWorld

當父對象或子對象的變換發(fā)生更改時,可以通過調(diào)用[page:Object3D.updateMatrixWorld updateMatrixWorld()]來請求更新子對象的matrixWorld。

旋轉(zhuǎn)和四元數(shù)(Rotation and Quaternion)

Three.js提供了兩種表示3D旋轉(zhuǎn)的方式:Euler angles(歐拉角)和Quaternions(四元數(shù)),以及兩者之間的轉(zhuǎn)換方法。 歐拉角有稱為“萬向節(jié)鎖定”的問題,其中某些配置可能失去一定程度的自由度(防止物體繞一個軸旋轉(zhuǎn))。 因此,對象旋轉(zhuǎn) 始終 存儲在對象的quaternion中。

該庫的早期版本包含useQuaternion屬性,當設(shè)置為false時,將導致對象的matrix從歐拉角計算。這種做法已被棄用 - 作為代替,您應(yīng)該使用setRotationFromEuler方法,該方法將更新四元數(shù)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號