四元数和翻译

Quaternions and translations

本文关键字:翻译 四元数      更新时间:2023-10-16

我创建了一个小程序,可以在空间中旋转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)有关。我想平移四元数的旋转轴。

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

首先,这里真的没有必要使用四元数。如果你只想创建一个围绕给定轴旋转给定角度的矩阵,那么你就可以这样做了。无论如何,你已经有效地做到了,只需通过在中间使用四元数的迂回…

四元数只能表示旋转。可以使用对偶四元数以统一的方式处理旋转和平移。然而,这在这里似乎是大材小用。要获得一个围绕穿过非原点点的轴旋转的矩阵,只需首先平移坐标系,使旋转轴穿过的点成为原点。然后应用旋转。然后你把所有的东西都翻译回来。因此,如果p是你希望旋转轴经过的点的坐标向量,你首先通过-p平移所有东西,然后旋转,然后通过p&hellip平移回来;

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