如何缩放四元数的旋转

问题描述 投票:2回答:2

我正在尝试将速度乘以帧之间的时间。我可以想象为四元数执行此操作将通过将它们提升为幂来完成。我有基于鼠标移动旋转对象的代码。它具有一个以一帧速率运行的主循环和一个以固定帧速率运行的物理循环。这是主循环的相关部分:

glfwPollEvents();
Input::update();
window.clear(0,0,0,1);

rigidBody.angularVelocity *= glm::angleAxis(0.001f * Input::deltaMouse().x, glm::vec3(0,1,0));
rigidBody.angularVelocity *= glm::angleAxis(0.001f * Input::deltaMouse().y, glm::vec3(1,0,0));

if(Input::getKey(Input::KEY_A))
{
    rigidBody.velocity -= float(Time::getDelta()) * glm::vec3(1,0,0);
}
if(Input::getKey(Input::KEY_D))
{
    rigidBody.velocity += float(Time::getDelta()) * glm::vec3(1,0,0);
}
if(Input::getKey(Input::KEY_W))
{
    rigidBody.velocity -= float(Time::getDelta()) * glm::vec3(0,0,1);
}
if(Input::getKey(Input::KEY_S))
{
    rigidBody.velocity += float(Time::getDelta()) * glm::vec3(0,0,1);
}
if(Input::getKey(Input::KEY_LCONTROL))
{
    rigidBody.velocity -= float(Time::getDelta()) * glm::vec3(0,1,0);
}
if(Input::getKey(Input::KEY_LSHIFT))
{
    rigidBody.velocity += float(Time::getDelta()) * glm::vec3(0,1,0);
}

这是物理循环的相关部分:

for(int i = 0; i < *numRigidBodies; i++)
{
    rigidBodies[i].transform->getPos() += rigidBodies[i].velocity;
    rigidBodies[i].transform->getRot() *= rigidBodies[i].angularVelocity;
}
rigidBodies[0].angularVelocity = glm::quat();
rigidBodies[0].velocity = glm::vec3();

这很好,但是当我尝试使用glm :: pow将角速度提高至幂时,该对象随机旋转并且不跟随我的鼠标。我意识到我可以使用类似[]

rigidBodies[i].transform->getRot() *= glm::angleAxis((float)Time::getFixedDelta() * glm::angle(rigidBodies[i].angularVelocity), glm::axis(rigidBodies[i].angularVelocity));

但是对于任务来说,这似乎不必要地复杂。是什么导致此问题,如何解决?

我正在尝试将速度乘以帧之间的时间。我可以想象为四元数执行此操作将通过将它们提升为幂来完成。我有代码...

c++ opengl glm-math
2个回答
2
投票

不确定如何使用您正在使用的API,但是基本上,您将使用Quaternion :: Slerp()。 Slerp的意思是“球面线性插值”。


0
投票

结果角速度通常表示为3d向量,其中方向是轴,大小是角速度。这行代码:

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