C++ 四元数旋转未按预期工作

Posted

技术标签:

【中文标题】C++ 四元数旋转未按预期工作【英文标题】:C++ Quaternion rotation not working as intended 【发布时间】:2016-11-27 00:42:29 【问题描述】:

我正在尝试使用四元数围绕其中一个轴旋转模型 例如 Y。 我正在使用这个算法,非常简单 轴 = (0,1,0) 角度+= 0.01f(辐射)

quat.w = cos(angle);
quat.x = axis.x* sin(angle / 2.0);
quat.y = axis.y* sin(angle / 2.0);
quat.z = axis.z* sin(angle / 2.0);

它可能适用于前 60 度(编辑:说实话可能是 90 度),而不是模型只是表现得奇怪并在其中心伸展。我正在使用 GLUT 和 c++

这是我用来再次将其转换为矩阵的方法,而不是在模型视图透视矩阵中使用它。 我做了一些调试,数学看起来还不错,我可能遗漏了一些明显的东西(四元数的新手)

void Quaternion::QuatToMatrix(Quaternion& a, GLfloat* matrix)

// First row
matrix[0] = 1.0f - 2.0f * (a.y * a.y + a.z * a.z);
matrix[1] = 2.0f * (a.x * a.y - a.w * a.z);
matrix[2] = 2.0f * (a.x * a.z + a.w * a.y);
matrix[3] = 0.0f;
// Second row
matrix[4] = 2.0f * (a.x * a.y + a.w * a.z);
matrix[5] = 1.0f - 2.0f * (a.x * a.x + a.z * a.z);
matrix[6] = 2.0f * (a.y * a.z - a.w * a.x);
matrix[7] = 0.0f;

// Third row
matrix[8] = 2.0f * (a.x * a.z - a.w * a.y);
matrix[9] = 2.0f * (a.y * a.z + a.w * a.x);
matrix[10] = 1.0f - 2.0f * (a.x * a.x + a.y * a.y);
matrix[11] = 0.0f;

// Fourth row
matrix[12] = 0;
matrix[13] = 0;
matrix[14] = 0;
matrix[15] = 1.0f;

希望你能帮助我,如果这是一个愚蠢的问题,对不起 提前致谢。

【问题讨论】:

如何使用矩阵?你是否使用glMultMatrixf() 以及如何使用? 【参考方案1】:

四元数的实部也应该用半角:

quat.w = cos(angle / 2.0);

【讨论】:

以上是关于C++ 四元数旋转未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

c++ 四元数澄清

FBXSDK,使用四元数设置旋转键?

四元数运动学笔记旋转的雅克比矩阵

glm 在 Y 轴上旋转四元数使物体变形

四元数绕轴旋转的分量

四元数法