我正在更新一个旧的 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() 函数而避免使用它们,所以我不太了解空间位置与它们之间的关系,并且尝试将它们更新为四元数看起来更加复杂。
我读过四元数的逻辑以及如何从技术上使用它们,但我不明白它们的值从何而来。
例如:
//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
我读了这个,但我不知道这些值是什么。轴是一个单位 vector ......什么? fAngle 我假设它是我想要旋转的角度,但由于四元数使用任意轴,我如何获取每个 XYZ 轴的值,以及如何在四元数中指定它?
因此,我正在寻找四元数的任何实际示例/教程,以便我了解发生了什么。
当我想要旋转一个对象时,我唯一拥有的信息是我想要旋转的轴(x、y 或 z,不是全部,而是它们在最终结果中的组合),以及以度为单位的值. 我不太擅长数学,因此非常感谢任何不使用快捷方式的教程。
最佳答案
好的,假设您有一个模型 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
作为四元数,您将矩阵 mult 替换为 q
和 -q
q * (ML(k)-p) * -q + p
这应该有效。
关于c++ - OpenGL、GLM 四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591877/