c++ - 四元数和翻译

标签 c++ c opengl math quaternions

我创建了一个可以在空间中旋转 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/

相关文章:

c++ - 如何应用位置变换

c++ - 来自 SWIG PyObject_Call 段错误的 Python 回调

c++ - 在不同的 VBO 中存储不同的顶点属性

c++ - 为什么 std::move 使用 std::remove_reference?

c++ - 为什么全局变量会给函数调用中的编译器优化带来麻烦?

c - 读取 AU 文件的 header - C

c - 在 UNIX 上打印目录代码出错

c++ - 动态 3D 阵列上的 OpenGL glDrawPixels

c++ - Visual C++,在文件夹中组织 .h 和 .cpp 文件

c++ - 哪种算法用于计算 GNU C++ 标准库的指数函数?