【问题标题】:Quaternions and translations四元数和翻译
【发布时间】:2019-05-30 09:25:04
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c opengl math quaternions


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我正在使用四元数,因为我使用鼠标围绕 XYZ 旋转对象,我想避免云台锁定。使用三个组合欧拉矩阵中的旋转矩阵是否真正避免了万向节锁定?
      • 另外,为什么四元数会围绕 (0, 0) 旋转?
      • @Prion 您的示例并未显示您正在将新的旋转与现有的旋转相结合,这是四元数有用的地方。它仅显示您从不需要四元数的轴和角度创建单个旋转矩阵。
      • 与流行的看法相反,万向节锁定与矩阵无关,四元数也不能神奇地防止万向节锁定。万向节锁定是欧拉角旋转序列的问题。将旋转表示为矩阵还是四元数都没有关系。如果你使用欧拉角,你可以得到云台锁定。为避免云台锁定,请避免使用欧拉角……
      • 如果我没记错的话,以欧拉方式使用四元数进行三个后续旋转并不涉及万向节锁定。
      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2012-01-10
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多