我已经在网上玩了一段时间了,我似乎无法让它们工作,所以我把这个问题抛到了一边;
我试图从一个点绘制一条速度矢量线。画这条线并不难:只要插入一条有长度的线
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);
基于关闭
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();