c++ - OpenGL、GLM 四元数旋转

标签 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() 函数而避免使用它们,所以我不太了解空间位置与它们之间的关系,并且尝试将它们更新为四元数看起来更加复杂。

我读过四元数的逻辑以及如何从技术上使用它们,但我不明白它们的值从何而来。

例如:

//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/

相关文章:

python - numpy.float128 在 Windows 中不存在,但从 OpenGL 调用

c++ - glDrawArraysInstanced 没有在 OpenGL 中进行多次绘制调用?

c++ - 如何在 C++ 中调用可变参数模板构造函数?

c++ - 条件编译的注意事项

opengl - 如何使用 GLSL 正确解压缩 V210 视频帧?

c++ - 创建 OpenGL 2D View 相机,但使用模型 View 投影相机

c++ - 使用四元数旋转相机

android - Madgwick AHRS算法Android实现

transformation - 计算 2 3D 笛卡尔坐标系之间转换的四元数

c++ - 是否有任何功能可以知道键盘上的某个键是否被按下?