4

私はしばらくの間、インターネット上でいくつかのアルゴリズムをいじっていましたが、それらを機能させることができないようです。そのため、ここで質問を投げかけます。

ポイントから速度ベクトル ラインをレンダリングしようとしています。線を引くのは難しくありません。長さのある線をvelocity.lengthグラフに挿入するだけです。これにより、y 軸方向の点を中心に線が配置されます。これを適切な回転と平行移動で取得する必要があります。

並進ベクトルの計算は難しくありません。速度ベクトルの半分です。しかし、回転行列は私には非常にとらえどころのないものです。方向ベクトルが与えられた場合、<x, y, z>必要な行列は何ですか?

編集1:見てください。質問を理解していないと、おそらく答えられないでしょう。

これが私が現在持っているものです:

                    Vector3f 変換 = 新しい Vector3f();
                    translation.scale(1f/2f, body.velocity);

                    Vector3f vec_z = (Vector3f) body.velocity.clone();
                    vec_z.normalize();

                    Vector3f vec_y; // 参照ベクトル、後で修正します
                    もし (vec_z.x == 0 && vec_z.z == 0) {
                        vec_y = new Vector3f(-vec_z.y, 0f, 0f); // 最適化できます
                    } そうしないと {
                        vec_y = 新しい Vector3f(0f, 1f, 0f);
                    }
                    Vector3f vec_x = new Vector3f();
                    vec_x.cross(vec_y, vec_z);
                    vec_z.normalize();

                    vec_y.cross(vec_x, vec_z);
                    vec_y.normalize();
                    vec_y.negate();

                    Matrix3f 回転 = 新しい Matrix3f(
                        vec_z.z、vec_z.x、vec_z.y、
                        vec_x.z、vec_x.x、vec_x.y、
                        vec_y.z、vec_y.x、vec_y.y
                    );

                    arrowTransform3D.set(回転、平行移動、1f);

この記事に基づいています。はい、標準の回転行列 (vec_x.x、vec_y.x など) を試しましたが、うまくいきませんでした。列と行を回転させて、効果があるかどうかを確認しました。

編集2:

私のコメントの失礼な言葉遣いについてお詫び申し上げます。

つまり、2 つのエラーが組み合わさったようです。そのうちの 1 つは House MD が指摘したこと (変数の名前付けが本当に悪い: vec_zwas reallyvec_yなど) であり、もう 1 つは、マトリックスをレンダリング エンジンに渡す前に反転する必要があることでした (転置は近い!)。したがって、変更されたコードは次のとおりです。

                    Vector3f vec_y = (Vector3f) body.velocity.clone();
                    vec_y.normalize();

                    Vector3f vec_x; // 参照ベクトル、後で修正します
                    if (vec_y.x == 0 && vec_y.z == 0) {
                        vec_x = new Vector3f(-vec_y.y, 0f, 0f); // 最適化できます
                    } そうしないと {
                        vec_x = 新しい Vector3f(0f, 1f, 0f);
                    }

                    Vector3f vec_z = new Vector3f();
                    vec_z.cross(vec_x, vec_y);
                    vec_z.normalize();

                    vec_x.cross(vec_z, vec_y);
                    vec_x.normalize();
                    vec_x.negate();

                    Matrix3f 回転 = 新しい Matrix3f(
                        vec_x.x、vec_x.y、vec_x.z、
                        vec_y.x、vec_y.y、vec_y.z、
                        vec_z.x、vec_z.y、vec_z.z
                    );
                    回転.反転();
4

2 に答える 2

1

これはあなたをする必要があります

于 2008-10-19T11:25:05.487 に答える
0

だまされます。

そこでの質問には、特定の軸への回転を取得することが含まれますが、私は回転行列を取得することに関心があります。

ええと、一方をもう一方に変換できますか?

ところで、任意の y 軸を選択してから再直交化する現在のソリューションは正常に機能するはずです。ただし、バグがあるか、少なくとも書き方が悪いようです。' z_vec' は y 軸の適切な変数名ではありません。とにかく、「z、x、y」の順序とは何ですか?

それでもうまくいかない場合は、うまくいくまでランダムな変更を加えてみてください - 行列を転置し、偶数の符号エラーが発生するまでベクトルを否定します。

また、見知らぬ人に時間を割いて助けてくれるように頼んでいることを考えると、あなたの声のトーンは一種の失礼に見えます.

于 2008-10-19T11:52:20.707 に答える