Eu estou tentando escrever código com gira um objeto.
Eu o implementei como:
A rotação sobre o eixo X é dada pela quantidade de alteração nas coordenadas y de um mouse e a rotação sobre o eixo Y é dada pela quantidade de alteração nas coordenadas x de um mouse.
Este método é simples e funciona bem até que no eixo coincida com o eixo Z. Em resumo, ocorre um bloqueio flexível.
Como posso utilizar o eixo Z da rotação para evitar o bloqueio do cardan.
Respostas:
A solução simples é não armazenar a orientação do objeto como ângulos em torno dos eixos (eixos X, Y, Z), como por exemplo nos ângulos de Euler.
Armazene a orientação do objeto como uma matriz ou um quaternion.
Isso pode causar o bloqueio do cardan, usando ângulos de euler:
Sem bloqueio do cardan:
Nenhum bloqueio do cardan também:
Agora, sempre que o mouse for alterado, multiplique m_orientation com a mudança de orientação proveniente do movimento do mouse em cada quadro.
fonte
Este livro (renderização em tempo real) me ajudou muito! Veja nas páginas 66 e 70. Possui gráficos e explicações muito bons. Os quaternions também estão na página 72! :)
Rotação em torno de um eixo arbitrário
Isso renderiza a câmera com a rotação feita pela entrada do mouse:
Com a entrada do mouse, você modifica a guinada (cabeça), o pitch and roll.
fonte