GLM四元数逆转了偏航

问题描述 投票:0回答:1

我正在使用OpenGL和GLM构建玩具3D引擎。我的轴系统是右撇子,X向右,Y向上和Z向后。

实体的变换由3D矢量和GLM四元数之一组成。物理模拟是2D,因此实体的速度是2D矢量(Y上没有速度,仅在XZ,地平面上)。类似地,角速度仅在Y轴(偏航)附近。

// Properly integrate the change in velocities
auto deltaPos = (physics->velocity + physics->lastVelocity) * 0.5f * deltaTime;
auto deltaYaw = (physics->yawVelocity + physics->lastYawVelocity) * 0.5f * deltaTime;
// Apply the velocities
transform->position += glm::vec3 {deltaPos.x, 0, deltaPos.y} * transform->orientation
transform->orientation = glm::quat(glm::vec3 {0, deltaYaw, 0}) * transform->orientation;

我用自上而下的相机渲染世界,将方向转换为4x4矩阵,将其(按照正确的顺序)乘以比例和平移矩阵:

glm::mat4x4 transformMat =
        glm::translate(transform->position) *
        glm::mat4x4(transform->orientation) *
        glm::scale(glm::vec3 {size.x, 1.0f, size.y});

..并将其发送到着色器,在那里它与点坐标以及投影和视图矩阵相乘:

// projView is projection * view
gl_Position = projView * transform * vec4(vertPosition.xyz, 1.0);

然而,虽然这段代码看起来很简单,但对象的偏航似乎有时会被翻转。当一个物体向左转时,它开始在世界中向左移动(position += deltaPosition * orientation线正常工作),但它呈现为向右旋转,但向左移动。这是一个示例图像:

yaw problem example

似乎四元数的表示,或者至少它的四元数 - 矩阵转换,否定了旋转的偏航“分量”,就像Y一样,而不是向上。然而,当一个向量被该四元数旋转时,它似乎正常运行,就像Y向上一样。有趣的是,代码的另一部分(处理车辆的转弯)似乎只有在四元数通过-yaw而不是偏航旋转时才能正常工作。 (渲染问题仍然存在)。

解决这个问题的任何解释或方法?

opengl game-engine quaternions glm-math
1个回答
1
投票

事实证明我错误地应用了四元数:在这一行:

transform->position += glm::vec3 {deltaPos.x, 0, deltaPos.y} * transform->orientation

GLM中的乘法定义实际上是通过四元数的倒数来旋转矢量。正确的路线是:

transform->position += transform->orientation * glm::vec3 {deltaPos.x, 0, deltaPos.y};

感谢Nico Schertler将我的注意力引向了正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.