方向矢量的旋转矩阵

时间:2008-10-19 11:19:24

标签: java math vector

我已经在互联网上玩了一些算法一段时间,我似乎无法让它们工作,所以我在这里抛出问题;

我试图从一个点渲染速度矢量线。绘制线条并不困难:只需在图形中插入长度为velocity.length的线条即可。这使得线以y轴方向上的点为中心。我们现在需要正确的轮换和翻译。

平移向量不难计算:它是速度向量的一半。然而,旋转矩阵对我来说是非常难以捉摸的。给定方向向量<x, y, z>,我需要什么矩阵?

编辑1:看;如果你不明白这个问题,你可能无法给我一个答案。

以下是我目前的情况:

                    Vector3f translation = new Vector3f();
                    translation.scale(1f/2f, body.velocity);

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

                    Vector3f vec_y; // reference vector, will correct later
                    if (vec_z.x == 0 && vec_z.z == 0) {
                        vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized
                    } else {
                        vec_y = new 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 rotation = new 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(rotation, translation, 1f);

基于this article。是的,我已经尝试过标准旋转矩阵(vec_x.x,vec_y.x等)并且它不起作用。我一直在旋转列和行,看看是否有任何影响。

编辑2:

对我评论的粗鲁措辞表示道歉。

所以看起来有两个错误的组合;其中一个House MD指出(变量的命名非常糟糕:vec_z实际上是vec_y,依此类推),另一个是我需要在将矩阵传递给渲染之前将其反转引擎(转置很接近!)。所以修改后的代码是:

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

                    Vector3f vec_x; // reference vector, will correct later
                    if (vec_y.x == 0 && vec_y.z == 0) {
                        vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized
                    } else {
                        vec_x = new 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 rotation = new 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
                    );
                    rotation.invert();

2 个答案:

答案 0 :(得分:1)

你应该

This

答案 1 :(得分:0)

Dupe.

  

那里的问题涉及到某个轴的旋转,而我关心的是获得一个旋转矩阵。

哎呀,我想知道你是否可以转convert one to the other

顺便说一句,你当前选择任意y轴然后重新正交化的解决方案应该可以正常工作;它虽然看起来很麻烦,或者至少写得不好。 'z_vec'不是y轴的良好变量名。无论如何,“z,x,y”排序是什么?

如果它仍然不起作用,尝试进行随机更改,直到它完成 - 转置矩阵,否定向量,直到你有偶数个符号错误,这类事情。

考虑到你要求陌生人花时间帮助你,你的语气也会变得粗鲁无礼。