quaternions - 我通过反复试验得出的结果,你能解释一下为什么吗?

标签 quaternions glm-math bulletphysics euler-angles

首先,我不确定这里是否欢迎这个问题,我检查了 FAQ并发现“我希望其他人解释”问题是。

主要问题是我需要在我的应用程序中存储所有对象的旋转两次。那是因为一方面是物理模拟,我在这里使用 Bullet Physics因为,存储其表示。另一方面,我自己存储所有对象的旋转,无论它们是否在物理模拟中,如灯光、任务目标等。除了物理库,我还使用了 GLM数学图书馆。

我必须同步两个表示。顺便说一句,位置和比例不会产生任何问题。困难在于物理模拟任何我自己的表示都是不同的,所以我不能只是复制值。我还没有发现所有这些差异,但它可能与左手与右手坐标系、度与弧度以及 Y 坐标向上与 Z 向上有关。

我自己的表示只是将欧拉角存储在 glm::vec3 中向量。由于我使用OpenGL进行绘图,因此我猜空间是右手。对于欧拉角,顺序很重要。我计算旋转矩阵的方法是首先创建每个分量的矩阵,然后将 X * Y * Z 中的那些相乘。命令。此外,在我自己的表示中,正 Y 坐标指向上方。

物理模拟使用四元数来存储旋转。经过一些研究,我读到了这个库中空间是左手的假设。我没有关于哪个坐标向上或以何种顺序返回欧拉角的信息。

这是将旋转从物理模拟转换为我自己的表示的代码,反之亦然。

#include <GLM/glm.hpp>
#include <GLM/gtc/quaternion.hpp>
#include <BULLET/btBulletDynamicsCommon.h>

/*******************************************************************
 * euler angles "glm::vec3 input" from my own representation
 * to quaternion "btQuaternion output" of physics simulation
 *******************************************************************/
glm::quat quaternion(glm::vec3(input.x, input.z, input.y) * 3.14159f / 180.f);
btQuaternion output(quaternion.x, quaternion.y, quaternion.z, quaternion.w);

/*******************************************************************
 * quaternion "btQuaternion input" from physics simulation
 * to euler angles "glm::vec3 output" of my own representation
 *******************************************************************/
glm::quat quaternion(input.getW(), -input.getX(), -input.getY(), -input.getZ());
glm::vec3 angles = glm::eulerAngles(quaternion);
glm::vec3 output(-angles.x, -angles.y, -angles.z);

我通过反复试验发现了这个脏代码并且它有效。但是正如您所看到的,通过不同的四元数类型存在否定、组件混合和类型转换。我想其中许多是不必要的,并且可以更简单地执行任务。

你能解释一下为什么我的转换有效以及如何简化它们吗?顺便说一句,如果转换不起作用,我想看看它的外观,这里是 screenshot ...

最佳答案

显然,Euler angles 有很多不同的定义。 ,并且您的两个库使用不同的约定。

来自 GLM's source他们使用 Pitch, Yaw, Roll :

template <typename T> 
GLM_FUNC_QUALIFIER detail::tvec3<T> eulerAngles
(
    detail::tquat<T> const & x
)
{
    return detail::tvec3<T>(pitch(x), yaw(x), roll(x));
}

...虽然在 Bullet's documentation他们使用偏航、俯仰、滚动。

我没有检查过,但组合旋转绝对不是可交换的,这可以解释取某些坐标的负值——与取逆旋转相同。

关于quaternions - 我通过反复试验得出的结果,你能解释一下为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16296021/

相关文章:

bulletphysics - 在 PyBullet 中将对象移向目标

java - JMonkeyEngine 旋转和四元数有什么区别?

c++ - 四元数3轴旋转

quaternions - 寻找更好的方法来进行四元数微分

c++ - 鼠标悬停时 GLSL 高亮网格

collision-detection - 没有初始速度的两个加速球体之间的碰撞检测?

java - 子弹物理,纹理球体不滚动

accelerometer - LSM9DS0 上的 Madgwick 传感器融合

c++ - 编辑开源库

c++ - 由于某种原因,我的 C++ glm::vec3 数组似乎被重置为 null