我创建了一个可以在空间中旋转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)。我想平移四元数的旋转轴。
如何转换四元数的旋转轴以使对象绕其自身轴而不是世界原点旋转?
答案 0 :(得分:1)
实现所需目标的最简单方法是,首先旋转世界原点的对象,然后将其移动到所需位置。因此,只需交换旋转和位置矩阵。
答案 1 :(得分:1)
首先,在这里确实不需要使用四元数。如果只需要创建一个矩阵,该矩阵绕给定轴旋转给定角度,则you can just do that。无论如何,您实际上已经在执行此操作,只是绕了在中间使用四元数的时间……
四元数只能表示旋转。可以使用dual quaternions以统一的方式处理旋转和平移。但是,这似乎在很大程度上是过大的。要获得围绕绕过非原点的轴旋转的矩阵,只需先平移坐标系,使您希望旋转轴通过的点成为原点即可。然后,您应用旋转。然后,您将所有内容转换回去。因此,如果 p 是您希望旋转轴经过的点的坐标矢量,则首先通过 -p 转换所有内容,然后旋转,然后进行转换由 p …
返回