我有一个对象,我想通过键旋转.物体应偏航,俯仰和滚动.在尝试了很多之后,我发现它glRotate有其局限性并且不可能用这个函数实现类似的东西.
我研究了一下,发现了基于四元数的旋转.也可以通过旋转矩阵旋转,但几乎每个人都将四元数描述为有史以来最好的.
我已经阅读了关于四元数并且相当理解它们的内容,但是如何在我的OpenGL程序中实现它们仍然是一个谜.有谁知道一个小例子?不是如何实现四元数类,而是如何使用它.我不知道如何把事情放在一起.
我希望在我的游戏中将我的汽车向左旋转90度.
当我使用这段代码时:
glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
glm::quat done(glm::rotate(rot,glm::eulerAngles(rot)+glm::vec3(90.0f,0.0,0.0)));
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)
汽车得到一个奇怪的旋转.
但是,以下代码根本不会改变汽车的旋转(正如我所期望的那样,只是为了确保GLM与游戏中的quats兼容):
glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
glm::quat done(rot);
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)
每当我尝试检查旋转是否随之改变时:
glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
glm::quat done(glm::rotate(rot,vec3(0.0,0.0,0.0)));
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)
汽车轮换仅设置为游戏中的0,0,0,0轮换.我希望这个代码保持旋转不受影响,因为我期望以下代码将汽车向左旋转90度:
glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
glm::quat done(glm::rotate(rot,vec3(90.0,0.0,0.0)));
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)
但这不符合我的要求.它只是设置旋转,而不是将其添加到'rot'.
我究竟做错了什么?
我目前正在实现一个C++解决方案来跟踪多个对象的运动.因为我在帧序列中跟踪了这些对象的点,使得每帧中有多个点.结果,我有整个帧序列的那些点的x,y,z坐标.通过研究已经生成的模型,我理解它包括相对于彼此移动的关节系统.每个关节都有一个父母,他们的动作是以四元数格式相对于父母的.因此,我想将相对于同一原点在3D空间中的x,y,z坐标转换为相对于其父级写入的四元数格式.然后我可以使用四元数来动画它们.
我不明白如何计算它所需的角度.能否请您提供示例代码(用c ++)或任何有用的资源来解决这个问题.