Я пытаюсь сделать эквивалент умножения скорости на время между кадрами. Я бы предположил, что сделать это для кватернионов будет сделано, привлекая их к власти. У меня есть код для поворота объекта на основе движений мыши. Он имеет основной цикл, работающий с одной частотой кадров, и физический цикл, работающий с фиксированной частотой кадров. Вот соответствующая часть главного цикла:Как масштабировать поворот кватерниона
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();
Это прекрасно работает, но при попытке повышения угловой скорости к мощности с ГЖС :: pow, объект вращается случайным образом и не следует за моей мышью. Я понимаю, что мог бы сделать это с помощью строки кода, например
rigidBodies[i].transform->getRot() *= glm::angleAxis((float)Time::getFixedDelta() * glm::angle(rigidBodies[i].angularVelocity), glm::axis(rigidBodies[i].angularVelocity));
но это кажется излишне сложным для задачи. Что вызывает эту проблему, и как я могу ее исправить?
Не существует уникального квадратного корня кватерниона или вращения. Вращение на 10 градусов может составлять два оборота 5 градусов или два оборота 185 градусов. Оба, когда они составлены, производят поворот на 10 градусов. В общем случае n-й корень вращения k градусов представляет собой множество x 360/n + k/n для x от 0 до n-1. Я не знаю, что делает ваша библиотека, я просто указываю, что математика неоднозначна. – Yakk