我创建了一个可以在空间中旋转 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 vector ,由 4 个 float 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 是您希望旋转轴经过的点的坐标 vector ,则首先通过 -p 平移所有内容,然后旋转,然后平移p…
返回关于c++ - 四元数和翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54028215/