四元数和翻译

Quaternions and translations

我创建了一个可以在 space 中旋转 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) 有关。我想翻译我的四元数的旋转轴。

我如何平移四元数的旋转轴以围绕其自己的轴而不是世界原点旋转对象?

实现您想要的效果的最简单方法是首先在世界原点旋转一个对象,然后将其移动到所需位置。所以只需交换旋转和位置矩阵。

首先,这里真的没有必要用到四元数。如果你想要的只是创建一个围绕给定轴旋转给定角度的矩阵,那么you can just do that。无论如何,您实际上已经在这样做了,只是绕过在中间使用四元数的弯路……

四元数只能表示旋转。可以使用 dual quaternions 以统一的方式处理旋转和平移。然而,这在这里似乎有点矫枉过正。要获得绕通过非原点的轴旋转的矩阵,您可以先平移坐标系,使您希望旋转轴通过的点成为原点。然后你应用旋转。然后你把所有的东西都翻译回来。因此,如果 p 是您希望旋转轴经过的点的坐标向量,您首先将所有内容平移 -p,然后您旋转,然后你通过 p

翻译回去