1

我正在更新一个旧的 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,不是全部,而是它们在最终结果中的组合),以及一个以度为单位的值。我不是一个数学人,所以任何不使用快捷方式的教程都受到高度赞赏。

4

1 回答 1

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

作为四元数,您将矩阵 mult 替换为qand-q

q * (ML(k)-p) * -q + p

那应该行得通。

于 2013-03-24T16:36:45.503 回答