Java 方向向量的旋转矩阵

Java 方向向量的旋转矩阵,java,math,vector,Java,Math,Vector,我在互联网上玩一些算法已经有一段时间了,但我似乎无法让它们工作,所以我把问题抛在这里 我试图从一个点渲染一条速度矢量线。画线并不困难:只需在图中插入一条长度velocity.length的线即可。这将使线位于y轴方向上的点的中心。我们现在需要在适当的旋转和平移中得到这个 平动矢量不难计算:它是速度矢量的一半。然而,旋转矩阵对我来说是非常难以捉摸的。给定一个方向向量,我需要什么矩阵 编辑1:外观;如果你不明白这个问题,你可能无法给我答案 以下是我目前拥有的: Vector3f translatio

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

我试图从一个点渲染一条速度矢量线。画线并不困难:只需在图中插入一条长度
velocity.length
的线即可。这将使线位于y轴方向上的点的中心。我们现在需要在适当的旋转和平移中得到这个

平动矢量不难计算:它是速度矢量的一半。然而,旋转矩阵对我来说是非常难以捉摸的。给定一个方向向量,我需要什么矩阵

编辑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); 你应该做什么


这里的问题涉及到旋转到某个轴,而我关心的是旋转矩阵

哎呀,我不知道你能不能转身

顺便说一句,您当前的解决方案是拾取任意y轴,然后重新进行正交化,这应该很好;不过它看起来有窃听器,或者至少写得不好
z_-vec
“不是y轴的好变量名。“z,x,y”的顺序到底是怎么回事

如果它仍然不起作用,尝试进行随机更改,直到它起作用-转置矩阵,对向量求反,直到出现偶数个符号错误,诸如此类的事情


另外,你的语气让人觉得有点粗鲁,因为你要求陌生人花时间帮助你。

这不管用,因为我没有角度;只有所需的方向向量。你可以计算出角度使用基本三角。。。SOH CAH TOA如果你不知道你的基本三角,你就不应该用向量来赚钱……我知道我可以算出角度,但这是非常低效的。应该可以只用叉积算出矩阵。如果你不会拼写“monkeying”,那么你就不应该用英语胡闹。你的问题几乎是不可能理解的,特别是关于“速度向量的一半”的部分。你为什么要叫vec_z.normalize两次,这是什么?这是原始代码中的一个输入错误。它实际上对最终的解决方案没有什么影响,但它会使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();