私は、回転と位置のデータをエンコードする4x4変換行列を含む配列を持っています(この行列はOctaveの有効な変換を表しています)。この配列の内容を使用するthree.jsオブジェクト(Object3D)のmatrixWorldプロパティを設定します。つまり、変換マトリックスに基づいてオブジェクトの位置と回転を設定します。three.jsオブジェクトのmatrixWorldプロパティを設定する
three.jsドキュメントとここに尋ねた様々な質問(例えば、this oneとthis one)からthis pageによれば、鍵がfalseにnameOfObject.matrixAutoUpdate
を設定することがあるようです。しかし、これを考慮して、nameOfObject.matrixWorld
を設定するさまざまなアプローチを試しましたが、オブジェクトのレンダリング場所を変更するものはありません。matrixWorld
が4x4アイデンティティの場合のように、回転のない原点に残りますマトリックス。ここで
は(render()
が呼び出される前に、このコードは更新方法の中にある)私が試したものです:
// Setting up a three.js matrix
var tempMatrix = new THREE.Matrix4();
tempMatrix.fromArray(arrayContainingTransformationMatrix);
// Values are set as expected
console.log(tempMatrix.elements);
// Note that the approaches below were tried one at a time
// First approach (doesn't work)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.copy(tempMatrix);
// Second approach (also doesn't work)
// Based on the second SO question linked above
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrix.copy(tempMatrix);
nameOfObject.updateMatrixWorld(true);
// Third approach (this doesn't work either, unfortunately)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.fromArray(arrayContainingTransformationMatrix);
// Appears to be set correctly regardless of which approach is used
console.log(sphere1.matrixWorld.elements);
いくつかの注意事項:
- 私はそれが実際には必要ありませんことを期待したいですすべての繰り返しの中で
matrixAutoUpdate
をfalseに設定することができますが、今のところ私はそれを安全に行うために行っています。 matrixWorld
を変更する代わりに、nameOfObject.position
を変換行列の4列目の値に基づいて変更すると、オブジェクトの位置が予期したとおりに変わるため、レンダリングの問題には見えません。position
とrotation
のプロパティに基づいて行列を手動で設定するときには、updateMatrix()
を呼び出さないでください。私はupdateMatrixWorld()
も同様の考慮事項になると思うだろうが、私はそれが何をしているかについて多くの議論をしていない。
ご了承ください。最悪の場合、私はソースを見ていきますが、three.jsはそれまでのところ使いやすいものでした。
オブジェクトの行列のみを設定できます。オブジェクトのワールドマトリックスを設定することはできません。これはあなたの質問ですか? "どのように' object.matrix'を設定して、特定の 'object.matrixWorld'(オブジェクトの親の変換を考慮に入れます)になるように設定できますか? – WestLangley
オブジェクトのワールドマトリックスが読み取り専用の場合、それは私の質問に答えます。私は 'matrixWorld'プロパティが[Object3D docs](http://threejs.org/docs/index.html#Reference/Core/Object3D)の" readonly "とラベル付けされていないため、設定できると仮定しました。他の読み取り専用プロパティ、例えば 'id'は" readonly "で始まります)。 –
読み取り専用ではありません。レンダラーはそれをリセットしています。 – WestLangley