オブジェクトを回転/平行移動 (z 軸のみの回転と xy 平面のみの平行移動) するために、グローバル センター (デバイスの中心) に対してだけでなく、他の任意の点に対しても正しいアルゴリズムを作成しました (私が話し合ったコーダーはそれが正しいと考えています)、実装で望ましくない翻訳を削除するには多くの時間がかかります (アルゴリズムは 8 月 4 日に作成され、同じ日に実装されました。それ以来、コードは 15 回改訂されています。 )。
ここに実装があります http://www.pixdip.com/opengles/transform.php#ALGO1
望ましくない翻訳を生成しているコード行は次のとおりです。
private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
および以下にリストされています。
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
objX = GLES20Renderer._uBodyCentreMatrix[0];
objY = GLES20Renderer._uBodyCentreMatrix[1];
次の変更を行っても、+Y に沿った望ましくない移動は持続します。
objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];
zAngle = 0;
ds = 0;
Renderer クラスの次のフィールドにより、 を呼び出すたびに値-0.545867f
が Y 座標に追加されます。onDrawFrame()
private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};
protected static float[] _uBodyCentreMatrix = new float[4];
http://www.pixdip.com/opengles/transform.php#FIELDSで
望ましくない変換が発生する理由、変換の正確な問題、または間違っているのはアルゴリズムであるかを理解するための助けが必要です。
ここでジンバルロックが問題になることはありますか?
グローバル z 軸を中心とした回転/平行移動用の Renderer クラスを用意したので、より単純な例を実行/実践するように私に依頼しないでください。私が興味を持っているこの新しいタスクは、updateModel()
(目的の回転は z 軸のみであり、移動は xy 平面のみであることに注意してください)
[API 10->15]
実際の Renderer クラスには、タンク turret(nozzle) と tank body の 2 つのオブジェクトがあります。一方、turret(nozzle) には望ましくない前方移動があり、ボディには望ましくない後方移動があります。
デバイス センターに関する翻訳/回転用の APK (opengles 2.0 で簡単に作成できます): http://www.pixdip.com/opengles/global.php
任意のポイントに関する移動/回転用の APK (+Y に沿って望ましくない移動がある): http://www.pixdip.com/opengles/local.php
updateModel() が 4 回だけ呼び出される任意のポイントに関する変換/回転用の APK: http://www.pixdip.com/opengles/limited.php および必要なコード (これで十分なはずです) は次のとおりです: http:// www.pixdip.com/opengles/code.php
オブジェクトのパーツ (ノズル/タレット、ボディ) は現在、オブジェクトの中心 (_playerCentre) ではなく、独自の中心を中心に回転しています。後で修正します。
私はロジックを実証しようとしましたhttp://www.pixdip.com/opengles/images.php