Espero que você conheça a Matemática GL ( GLM ), porque eu tenho um problema, não posso quebrar:
Eu tenho um conjunto de ângulos de Euler e preciso executar uma interpolação suave entre eles. A melhor maneira é convertê-los em Quaternions e aplicar o alrogirthm SLERP.
O problema que tenho é como inicializar glm :: quaternion com Euler Angles, por favor?
Eu li a documentação GLM várias vezes, mas não consigo achar apropriado Quaternion constructor signature
, isso levaria três ângulos de Euler. A mais próxima que encontrei é a
função angleAxis () , assumindo o valor do ângulo e um eixo para esse ângulo. Observe, por favor, o que estou procurando de uma maneira, como analisar RotX, RotY, RotZ
.
Para sua informação, esta é a assinatura da função angleAxis () acima mencionada :
detail::tquat< valType > angleAxis (valType const &angle, valType const &x, valType const &y, valType const &z)
operator *
a multiplicação de Quaternion, portanto, possivelmente, terei que realizar a multiplicação manualmente .Onde
angle
está um passoglm::vec3
contendo , guinada, rolo, respectivamente.PS. Em caso de dúvida, basta ir aos cabeçalhos e procurar. A definição pode ser encontrada em glm / gtc / quaternion.hpp:
Para onde
quat
é um typedef flutuantetquat
.fonte
A solução está na wikipedia: http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
usando isso:
Construtores para um quaternion, dado um Euler (onde a aplicação da rotação é XYZ ou ZYX). No entanto, são apenas duas das seis combinações possíveis de ângulos de Euler. Você realmente precisa descobrir em que ordem os ângulos de Euler são construídos ao converter para transformar a matriz. Somente então a solução pode ser definida.
Na empresa antiga em que trabalhei, tínhamos Z como encaminhador (como a maioria das placas gráficas); portanto, o pedido de aplicativo era ZYX; na minha empresa atual, o eixo Y é encaminhado e Z está ativo; portanto, o pedido é YZX. Essa ordem é a ordem em que você multiplica seus quaternions para gerar sua transformação final, e a ordem que importa para rotações é que as multiplicações não são comutativas.
fonte
O ângulo deve estar em radianos!
fonte