0

私が正しければ:Object3Dは一方の側にプロパティのセット(position, scale, rotation)[*] を持ち、もう一方の側にmatrix- これは後で本質的に同じ情報を含み、他のものから計算さObject3D.updateMatrix()れ、レンダラーの計算によって実際に内部的に使用されるものです. 代わりに、セット(position, scale, rotation)は通常プログラマーによって操作されるものです (翻訳、回転...)。

ただし、 を直接操作したり、 を設定して忘れたりmatrixする代わりに、プロパティを同期させたい場合があります。これを達成するために実装された/効率的な/推奨される手順はありますか?matrixAutoUpdate=false(position, scale, rotation)Object3D.updateMatrix()

[*] 注意: 1)の代わりに が使用されuseQuaternion=trueている場合 2)は 3)で補完されています。quaternionrotationrotationeulerOrderup

4

2 に答える 2

1

applyMatrix(matrix)3Dオブジェクトでメソッドを呼び出すことができます。それが何をするかを見るには、ここを見てください。

また:

1)単位行列をフィードするか、または

2)関数の機能をコピーできます。

this.scale.getScaleFromMatrix( this.matrix );
var mat = new THREE.Matrix4().extractRotation( this.matrix );
this.rotation.setEulerFromRotationMatrix( mat, this.eulerOrder );
this.position.getPositionFromMatrix( this.matrix );

上記を実行した場合、クォータニオンがどのように関連するかはわかりません。useQuaternionフラグがtrueに設定されている状況はわかりません。しかし、Object3Dオブジェクトでは、デフォルトではfalseです。ジンバルロックを避けるために、特定の回転を計算するときにのみクォータニオンを使用しているように感じます。

lookAt()メソッドから取得した次のコードは、クォータニオンを更新すると思います。

this.quaternion.copy( this.matrix.decompose()[ 1 ] );
于 2013-02-26T01:28:37.000 に答える
1

ルーチン

Matrix4.decompose( position, quaternion, scale ) // revision 57dev

行列からpositionquaternion、およびベクトルを計算します。scale

(r.56 では、残念ながら引数の名前が間違っていました。これは r.57dev で修正されています。)

代わりにベクトルが必要な場合rotationは、次のように計算されたばかりから計算する必要がありますquaternion

rotation.setEulerFromQuaternion( quaternion, eulerOrder );

upベクトルはあなたの質問には関係ありません。

于 2013-02-26T01:38:31.857 に答える