使用方向向量和变换矩阵的OpenGL对象旋转

时间:2014-12-09 02:02:05

标签: opengl

我有一个物理模拟器,它有一个方向向量,我需要计算对象的旋转以跟随它。

     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的工作原理有关吗?

1 个答案:

答案 0 :(得分:2)

这看起来并不正确。您有名为crossproduct的变量,但您并未在任何地方计算交叉产品。我认为如果你用名称表明它们应该的交叉产品替换你的矢量操作,这可以从根本上起作用。

此外,您似乎部分没有使用正确的变量名称。例如,有up_vectordirection_vector分配的值,但计算使用updirection

使用您的初始命名,这将成为:

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);
}