Estou tentando fazer uma simulação simplificada de helicóptero (no momento, é um cubo) em 3D e estou tendo alguns problemas com a rotação. Um helicóptero pode girar ao longo dos três eixos:
- gire sobre si mesmo usando a hélice traseira: rotação do eixo y
- incline para a esquerda e direita para ir para a esquerda ou direita: rotação do eixo z
- incline para cima e para baixo para recuar ou avançar: rotação do eixo x
Eu preciso ser capaz de controlar cada eixo individualmente. Até agora, tentei usar ângulos de Euler, mas, independentemente da ordem de rotação que uso, encontro uma trava de cardan ou alguns eixos "trocam de lugar".
Parece que preciso usar quaternions, mas não sei como controlar cada eixo individual, pois os quaternions usam uma direção e um ângulo. Devo criar três quaternions e multiplicá-los juntos? Eu não acabaria com os mesmos problemas?
O mais estranho é que, se eu usar meu dedo para representar os três eixos do meu helicóptero (polegar para cima = y, índice = z, meio = x), não pareço encontrar esses problemas. Por quê?
Respostas:
Você deve poder usar uma matriz ou um quaternion para armazenar a orientação atual do seu helicóptero. O problema com o qual você está se deparando é como aplicar mudanças no pitch / yaw / roll no helicóptero.
Eu acho que você deseja aplicar pitch / yaw / roll ao helicóptero no espaço local em cada quadro. Você pode fazer isso alterando o pitch / yaw / roll para esse quadro e construindo uma matriz de rotação (você pode fazer isso com ângulos de Euler). Em seguida, você gira a orientação anterior do helicóptero por esta matriz (com a orientação anterior representada como uma matriz ou como um quaternion). Ele fornecerá a orientação para o novo quadro.
Representar a orientação do helicóptero como um quaternion tem a vantagem de que a interpolação entre quaternions é muito mais fácil do que a interpolação entre matrizes. Portanto, se no futuro você tiver uma orientação atual e desejar descobrir a rotação por quadro que o levará a uma nova orientação no momento desejado, a representação do quaternion poderá ser mais amigável para você.
fonte
Basicamente, você pode usar todas as outras representações de rotações, exceto os ângulos de Euler. Matrizes, Quaternions e até Axis Angles farão o que você quiser.
Você está certo, você acabaria com os mesmos problemas. A chave é armazenar a orientação atual (matriz, quaternion) do seu objeto e aplicar apenas um delta ao alterar a orientação.
Quando você quiser girar 10 graus em torno de y, basta criar uma matriz delta / quaternion para isso e depois multiplique-a com sua orientação atual (se você usar a pós-multiplicação para matrizes). Se você multiplicá-lo ao contrário, ele girará o sistema em torno do eixo y do mundo, em vez de no eixo y do objeto.
Acho esse recurso muito útil, ele também vem com o código-fonte e explica muito bem a teoria.
fonte
O problema que eu acho que você pode estar vendo é uma diferença nos vetores de rotação e velocidade do eixo (e também que você está perdendo uma direção). Quando um helicóptero se inclina para frente para avançar, a propulsão das pás do helicóptero empurra o ar para baixo e para trás em um ângulo perpendicular ao que você rotulou como eixo X.
Você tem um quarto grau de liberdade que perdeu: a velocidade das pás controla o volume de ar que é empurrado, que também controla a quantidade de sustentação que o helicóptero gera.
Mas, mesmo assim, sua "inclinação para a esquerda e para a direita" e "para cima e para baixo" geralmente controlam o helicóptero em um determinado avião. Ou seja, um helicóptero não deve voar para baixo quando se inclina para frente, para trás ou para o lado - mas a quantidade de levantamento pode ter que mudar e a velocidade será controlada pelo lado "oposto" do triângulo retângulo formado por conectar o helicóptero ao chão com uma linha reta para baixo (gravidade) e a hipotenusa (elevação). Isso deve fornecer o seu vetor de velocidade.
Você deve usar quaterniões para fazer isso, mas não baseie seus valores na inclinação do helicóptero - tente usar as forças de movimento que o helicóptero gera.
fonte