我正在更新一个旧的 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
我读了这个,我不知道这些值是什么。轴是单位向量...什么?fAngle我假设它是我想要旋转的角度,但是由于四元数使用任意轴,我如何获得每个 XYZ 轴的值,以及如何在四元数中指定它?
所以,我正在寻找四元数的任何实际示例/教程,所以我可以理解发生了什么。
当我想旋转一个对象时,我拥有的唯一信息是我想旋转的轴(x、y 或 z,不是全部,而是它们在最终结果中的组合),以及一个以度为单位的值。我不是一个数学人,所以任何不使用快捷方式的教程都受到高度赞赏。