我有一个物理模拟器,它有一个方向向量,我需要计算对象的旋转以跟随它。
Vec3f up_vector = Vec3f(0,1,0);
Vec3f direction_vector = directionVector(position, previous_position);
Vec3f crossproduct = normaliseVector(Vec3f(up[0] * direction[0], up[1] * direction[1], up[2] * direction[2]));
Vec3f crossproduct2 = normaliseVector(Vec3f(crossproduct[0] * direction_vector[0], crossproduct[1] * direction_vector[1], crossproduct[2] * direction_vector[2]));
rotation = Matrix44f(
{ crossproduct[0], crossproduct[1], crossproduct[2], 0 },
{ crossproduct2[0], crossproduct2[1], crossproduct2[2], 0 },
{ direction_vector[0], direction_vector[1], direction_vector[2], 0 },
{ 0, 0, 0, 1 });
glMultMatrixf(rotation);
对象似乎向右旋转但仅在一个轴上绘制(看起来像2D对象,在原点时无法从x轴看到)。我不知道这是否与OpenGL的工作原理有关吗?
答案 0 :(得分:2)
这看起来并不正确。您有名为crossproduct
的变量,但您并未在任何地方计算交叉产品。我认为如果你用名称表明它们应该的交叉产品替换你的矢量操作,这可以从根本上起作用。
此外,您似乎部分没有使用正确的变量名称。例如,有up_vector
和direction_vector
分配的值,但计算使用up
和direction
。
使用您的初始命名,这将成为:
Vec3f up_vector = Vec3f(0,1,0);
Vec3f direction_vector = directionVector(position, previous_position);
// Assuming that directionVector() returns a normalized vector.
Vec3f crossproduct = normaliseVector(crossProduct(up_vector, direction_vector));
Vec3f crossproduct2 = crossProduct(direction_vector, crossproduct);
然后像以前一样使用这些向量构建矩阵。当然,如果direction_vector
指向与up_vector
完全相同的方向,则会出错。为了使所有方向都具有这种强大功能,您必须具备特殊情况。
在上文中,crossProduct()
是标准的交叉产品:
Vec3f crossProduct(const Vec3f& v1, const Vec3f& v2) {
return Vec3f(v1.y * v2.z - v1.z * v2.y,
v1.z * v2.x - v1.x * v2.z,
v1.x * v2.y - v1.y * v2.x);
}