three.js 矩陣變換

2023-02-16 17:24 更新

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

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

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

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

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

    object.matrixAutoUpdate = false;

    更改任何屬性后,手動(dòng)更新矩陣:

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

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

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

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

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

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)