方向向量的旋转矩阵

4

我已经在互联网上尝试了一些算法,但似乎无法使它们正常工作,所以我把问题放在这里;

我正在尝试从一个点渲染速度向量线。绘制线条并不困难:只需将长度为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; // 参考向量,稍后会进行修正 if (vec_z.x == 0 && vec_z.z == 0) { vec_y = new Vector3f(-vec_z.y, 0f, 0f); // 可以优化 } 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);

基于这篇文章。是的,我已经尝试过标准的旋转矩阵(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; // 参考向量,稍后将进行更正 if (vec_y.x == 0 && vec_y.z == 0) { vec_x = new Vector3f(-vec_y.y, 0f, 0f); // 可以进行优化 } 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();

您的问题几乎无法理解,特别是关于“速度向量一半”的部分。 - Account deleted
为什么你要两次调用vec_z.normalize,并且这里的<x,y,z>是什么? - Account deleted
那是原始代码中的一个打字错误。这实际上对最终解决方案没有影响,但它可能会使y缩放有些奇怪。 :-) - Edward Z. Yang
2个回答

1

1
这不起作用,因为我没有角度,只有期望的方向向量。 - Edward Z. Yang
你可以使用基本三角函数来计算角度...正弦、余弦、正切如果你不懂基本的三角函数,就不应该把时间浪费在向量上... - Simon
1
我知道我可以计算出角度,但那非常低效。只使用叉积应该可以找出矩阵。 - Edward Z. Yang
4
如果你拼不出"monkeying"这个词,那么你就不应该在英语方面胡闹。 - House MD

0

Dupe.

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

天哪,我想知道如何将一个转换为另一个

顺便说一下,您目前的解决方案选择任意y轴然后重新正交化应该可以正常工作;不过看起来有点错误或者至少写得很糟糕。'z_vec'不是y轴的好变量名。反正就是'z,x,y'的顺序是怎么回事呢?

如果还不行,请随意更改直到它能够正常工作-转置矩阵,否定向量,直到您有偶数个符号错误为止。

此外,您的语气听起来有点粗鲁,因为您要求陌生人花时间帮助您。


那个问题涉及将旋转变换到某个轴,而我关注的是获取一个旋转矩阵。 - Edward Z. Yang
请查看我对上面答案的评论。是的,我可以这样做,但我想让上面的实现工作起来。 - Edward Z. Yang
抱歉,我已经在这个上面工作了几个小时了,所以现在很沮丧。 - Edward Z. Yang
NP。我相信随机翻转向量就解决了问题?一定要爱图形编程... - House MD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接