四元数和翻译

时间:2019-01-03 18:55:39

标签: c++ c opengl math quaternions

我创建了一个可以在空间中旋转3D对象的小程序。

为了快速总结,我创建了一个使用四元数执行矩阵旋转的函数:

void        matrix_rotate(float matrix[][4], float angle, t_vec4 rotation_axis)
{
    float   rotate[4][4];
    t_vec4  quat;

    quat = quaternion_create(angle, rotation_axis); // Create a quaternion from an axis-angle representation
    quaternion_to_matrix(rotate, quat);             // Convert the quaternion to a rotation matrix
    matrix_multiply(matrix, rotate);                // Multiply the rotation matrix
}

例如,我可以在y轴上对模型矩阵进行90度旋转(t_vec4是一个4D向量,由4个浮点数x,y,z,w组成):

matrix_rotate(model, 90.0, (t_vec4){0.0, 1.0, 0.0, 0.0});

到目前为止有效。但是旋转与我的世界起源有关(0、0、0)。我想平移四元数的旋转轴。

如何转换四元数的旋转轴以使对象绕其自身轴而不是世界原点旋转?

2 个答案:

答案 0 :(得分:1)

实现所需目标的最简单方法是,首先旋转世界原点的对象,然后将其移动到所需位置。因此,只需交换旋转和位置矩阵。

答案 1 :(得分:1)

首先,在这里确实不需要使用四元数。如果只需要创建一个矩阵,该矩阵绕给定轴旋转给定角度,则you can just do that。无论如何,您实际上已经在执行此操作,只是绕了在中间使用四元数的时间……

四元数只能表示旋转。可以使用dual quaternions以统一的方式处理旋转和平移。但是,这似乎在很大程度上是过大的。要获得围绕绕过非原点的轴旋转的矩阵,只需先平移坐标系,使您希望旋转轴通过的点成为原点即可。然后,您应用旋转。然后,您将所有内容转换回去。因此,如果 p 是您希望旋转轴经过的点的坐标矢量,则首先通过 -p 转换所有内容,然后旋转,然后进行转换由 p

返回