我试图做的速度乘以帧之间的时间的等价物。我会想象这样做的四元数将通过提高他们的权力来完成。我有代码来旋转基于我的鼠标移动的对象。它具有以一个帧速率运行的主循环和以固定帧速率运行的物理循环。下面是主回路的相关部分:如何缩放四元数的旋转
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));
但这似乎是不必要的复杂的任务。是什么导致这个问题,我该如何解决它?
没有四元数的唯一平方根,或者实际上是一个旋转。 10度的旋转可以是5度的两次旋转或185度的两次旋转。两者在组成时产生10度的旋转。一般来说,k度旋转的第n根是x从0到n-1的x 360/n + k/n。我不知道你的图书馆在做什么,我只是指出这个数学模糊不清。 – Yakk