Cameraを使用して、キャンバスで 3D 変換を行います。通常、カメラを回転させ、Matrix を取得してから変換します。しかし、Camera にはtranslateメソッドもあります。メソッドを使用した結果は異なります。
私の質問は: Camera.translate と Matrix.preTranslate または Matrix.postTranslate の違いは何ですか?
両方がある理由は、適切な結果を得るには、行列の乗算を特定の順序で実行する必要があるためです(すでにご存知かもしれませんが)。
平行移動/回転/スケールの順序は、入力すると逆の順序で実行されます。
したがって、次のようなことを行う場合:
Camera.rotate(15, 0, 0);
Camera.scale(.5f, .5f, .5f);
Camera.translate(70, 70, 70);
最初に70,70,70を変換し、次にすべての方向に50%スケーリングし、次にX軸を中心に15度回転します。
つまり、Matrixには事前変換と事後変換(すべての事前と事後)があります。これは、実際に最初に15度回転してから変換し、最後にスケーリングする場合があるためです。
だから、それは前と後の翻訳に答えます。カメラがまっすぐに回転して平行移動する理由は、これがすでにどのように機能するかを知っている人のためです(私のように!)。そのため、キャンバス上で直接回転と平行移動を行うことができるので、マトリックスやカメラを使用することはありません。翻訳、拡大縮小、回転が逆の順序で行われることを知っている限り、あなたもそうすることができます。
また、私があなたに言ったことを知っているなら、それはあなたにもっと力を与えます。それぞれの複数のMatrixオブジェクトでそれらを囲むことなく、10個のマトリックスのシーケンスを実行できます(たとえば、遠心力をシミュレートするために、外側にスイングし、中心を中心に回転するスイングモーションを実行したい場合)。これは、複数の回転と平行移動(複数のMatrixオブジェクトが相互に渡されることに囲まれている)で実行する必要がありますが、各平行移動がどのように機能するかを知っている場合は、一連の.translate()、. rotate()、および.scale()。
この情報は、3Dグラフィックスを実行する場合に特に役立ちます。これは、これらのマトリックスが人々に頭痛の種を与える場合だからです。
これがお役に立てば幸いです。
キャンバスに触れずにカメラを 90 度回転させるか、カメラを静止させたままキャンバスを -90 度回転させても、結果は視覚的に同じになります。