2016-12-07 10 views
0

私のアプリケーションでは、ユーザはワークプレーン上の3つのオブジェクトを選択して、すべての変換をグループ化してすべての子に適用する「変換」コンテナ、つまりObject3Dを使用してこれらの要素を拡大、子要素の選択を解除すると、親コンテナの変換はすべての子に移され、変換コンテナから削除され、メインのシーンオブジェクトに追加されます。子要素に同じ順序で親変換を適用する方法はありますか?

しかし、子要素は、コンテナに変換が適用され、要素自体ではなく、変換コンテナに適用されるときに、別の方法で変換されます。ローカル回転を持つ子を持つコンテナにスケール変換を適用すると、ローカル回転が最初に適用され、その後コンテナのスケール変換が適用されるように見えます。
child.applyMatrix(parent.matrixWorld)のすべての子に親の変換を適用し、その子をシーンコンテナに戻すと、変換の順序が逆になります。

  1. コンテナ[規模] {子[回転]} - >順序:回転、スケール
  2. child.applyMatrix(parent.matrixWorld)
  3. 子[スケール、回転] {} - >順序:スケール、回転

同じ変換順序と外観結果を得るには、子要素と何が関係がありますか?

アップデート:私は正しく子供に親の変換を適用する方法を考え出し

child.matrix.multiplyMatrices(parent_old.matrixWorld, child.matrix);をもchild.matrixAutoUpdate = false;を設定し、そのため、matrixAutoUpdate = trueは動作しません

child.matrix.decompose(child.position, child.quaternion, child.scale);を左:私はObject3D.applyMatrix()から同じコードを使用していました。 Matrix4.decompose()何らかの形でpositionscalequaternionを設定する前に行列の値を変更します。したがって、私の例では、親のスケール変換によって適用された内側の子のシャーリング変換がリセットされます。

ネストされたオブジェクト変換が使用されている場合、このような種類の変換が許可されて表示されるため、これは私には矛盾して見えます。さらに、child.applyMatrix(parent.matrixWorld)を使用して子オブジェクトに親トランスフォームを適用すると(私はその目的のための解決策としてよく読んでいる)正しいものではありません。これがthree.jsの意図された動作であるかどうかはわかりません。もしそうなら、誰かが理由を説明することができますか?

+0

(1)この問題を示すために、簡単なライブサンプルを表示することをお勧めします。私はあなたの問題が何かを推測しています...(2)[this three.js post](https://github.com/mrdoob/three.js/issues/3845)を参照してください。 (3)また、[このSOの回答](http://stackoverflow.com/questions/35364409/three-js-add-an-object-to-a-group-but-keep-global-position-rotation- scale-as-it/35365349#35365349)。 – WestLangley

+0

多くのありがとう@WestLangleyこれはまさに問題です。明らかに、私は、あなたがあなたの投稿(2)で言及したこの不均一な規模のケースを見つけました。私の使用事例では、この不均一なスケールが必要です。手動で行列を設定する( 'matrixAutoUpdate = false')に切り替えるときに私のコンセプトを使い続けることはできますか? – tomacco

+0

はい、位置、四元数、または位取りを直接設定するメソッドは機能しません。 – WestLangley

答えて

0

@WestLangleyと提供されたTHREE.js postSO answerのおかげで私は解決策を見つけました。私が経験した問題は、入れ

単に

representing an object's transform with a position, quaternion/rotation, and scale -- applied in the order S-R-T.

のTHREE.js'デザインコンセプトにある、オブジェクトの親に不均一なスケールを適用する場合、この順序が変更され、からマッピングすることはできません便利なposition,scaleおよびquaternionのプロパティにオブジェクトの変換行列を戻します。

私のソリューションは、represent the object transform with a matrix only.

に私は私の3Dオブジェクトの matrixAutoUpdate = falseを設定し、もう言及した位置、規模、四元プロパティを使用しないことを意味することにあります。代わりに、 THREE.Matrix4メソッドのみを使用して、オブジェクトの行列に直接変換を設定します。

関連する問題