OpenGL,GLM四元数旋转

时间:2013-03-23 20:47:36

标签: c++ opengl quaternions glm-math

我正在更新一个旧的OpenGL项目,我正在为矩阵和四元数切换所有(已弃用的) glMatrix()函数,而且我无法轮换工作。

我的绘图如下:

//these two are supposedly working
mat4 mProjection = perspective(FOV, aspectRatio, near, far);
mat4 mView = lookAt(cameraPosition, cameraCenter, headsUp);

mat4 mModel = mat4(1.0f);
mat4 mMVP = mProjection * mView * mModel;

我现在要做的是将旋转应用于特定点周围的对象(如对象的中心)。 我试过了:

mat4 mModelRotation = rotate(mModel, object->RotationY(), vec3(0.0, 1.0, 0.0)); //RotationY being an angle in degrees
mat4 mMVP = mProjection * mView * mModel * mModelRotation;

但是这会导致物体绕其中一个边缘旋转,而不是它的中心。

我想知道如何应用四元数来围绕我作为参数传递的任何点旋转对象。

我对矩阵没有经验,因为我之前没有使用过它,因为我之前可以使用 glMatrix()函数,所以我对空间位置和它们之间的关系不太了解,试图将它们更新为Quaternions看起来更加复杂。

我已经阅读了Quaternions的逻辑以及如何在技术上使用它们,但我不明白它们的价值来自哪里。

例如:

//axis is a unit vector
local_rotation.w  = cosf( fAngle/2)
local_rotation.x = axis.x * sinf( fAngle/2 )
local_rotation.y = axis.y * sinf( fAngle/2 )
local_rotation.z = axis.z * sinf( fAngle/2 )
total = local_rotation * total

我读过这篇文章,我不知道这些价值是什么。轴是一个单位向量......是什么? fAngle 我认为它是我想要旋转的角度,但由于Quaternions使用任意轴,我如何获取每个XYZ轴的值,以及如何在Quaternion中指定它? / p>

所以,我正在寻找Quaternion的任何实际示例/教程,所以我可以理解发生了什么。

当我想要旋转对象时,我所拥有的唯一信息是我想要旋转的轴(x,y或z,不是所有这些,而是​​在最终结果中它们的组合),以及以度为单位的值。 我不是一个数学人,所以任何不使用快捷方式的教程都非常感谢。

1 个答案:

答案 0 :(得分:2)

好的,假设你有一个模型ML(一组模型的点)和一个点P来旋转ML

所有旋转都被引用到原点,因此您需要移动以ML点为原点的点P组,使所有点旋转然后移动它回来。

如何做到这一点?,简单,对于你所做的每个点ML(k)(集合中的一个点):

ML(k)-P --> with this you move the points, using the P point as origin

然后旋转:

ROT * (ML(k)-P)

最后,你把它移回去了:

ROT(ML(k)-P) + P

作为四元数,您可以用q-q

替换矩阵mult
q * (ML(k)-p) * -q + p

这应该有效。