我正在更新一个旧的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,不是所有这些,而是在最终结果中它们的组合),以及以度为单位的值。 我不是一个数学人,所以任何不使用快捷方式的教程都非常感谢。
答案 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
q * (ML(k)-p) * -q + p
这应该有效。