我有一个四元数和一个需要旋转的对象。但该对象不支持四元数旋转。为此,它可以使用 4 x 4 矩阵和/或 vec3。如何将四元数转换为mat4/vec3?我使用 OpenGL 4.6、glm,并且在将信息传递给着色器时,我指定 GL_FALSE 作为第三个参数。
这是一个代码示例:
// из btQuaternion в glm::quat
glm::quat q = glm::quat(btQuat.w(), btQuat.x(), btQuat.y(), btQuat.z());
// пытаюсь вращать
glm::mat4 rotate = glm::mat4(1.0f) * glm::mat4_cast(q);
UPD1:我需要在地面控制人/机器等,飞机订购的版本可能不适合。
UPD2:身体在BulletPhysics物理引擎的世界空间中旋转,并将旋转转换为OpenGL空间(虽然到目前为止不成功,上面描述的代码不起作用;旋转时,身体要么升到地面以上,要么落到地下)。对象矩阵定义如下:
// matModel - результат действий преобразования из bullet в opengl
// translate - позиция тела, rotate - вращение тела, scaling -
// размер тела и всё это тип glm::mat4
matModel = translate * rotate * scale;
// но, дело в том, что если убрать rotate, то тело перестаёт
// подниматься и опускаться
// matModel = translate * scale; // оно движется нормально, только нет поворотов
而且,四元数指定沿子弹使用的轴旋转,并且对象必须沿所有指定的子弹轴旋转。不幸的是,我无法控制它们。

就这样,问题解决了。这是因为 3D 模型的中心点发生了偏移。最开始描述的代码是正确的。