Pergunta

Então, eu ter escrito uma câmera 3D baseado Quaternion orientada para novos programadores por isso é ultra fácil para eles para integrar e começar a usar.

Enquanto eu estava desenvolvendo-a, num primeiro momento eu levaria a entrada do usuário como ângulos de Euler, em seguida, gerar um Quaternion baseado fora da entrada para esse quadro. Eu, então, tomar Quaternion da câmera e multiplicá-lo por aquele geramos para a entrada, e, em teoria, que devem simplesmente adicionar a rotação de entrada para o estado atual da rotação da câmera, e as coisas seriam toda a gordura e feliz. Vamos chamar este:. Acumulando Quaternions, porque estamos armazenando e adicionando Quaternions única

Mas eu notei que havia um problema com este método. Quanto mais eu usei-o, mesmo que eu só estava girando em um ângulo de Euler, dizem Yaw, seria, por cima de algumas iterações, começa a sangrar mais em outro, dizer passo. Era leve, mas bastante inaceitável.

Então eu fiz mais algumas pesquisas e encontrou um artigo afirmando que era melhor para acumular ângulos de Euler, por isso as lojas de câmera é a rotação atual como ângulos de Euler, ea entrada é simplesmente adicionado a eles cada quadro. Em seguida, gerar um quatérnion deles cada quadro, o que por sua vez é utilizada para gerar o meu matriz de rotação. E isso corrigiu o problema de rotação sangramento em eixos impróprias.

Então, fazer quaisquer membros StackOverflow tem qualquer conhecimento sobre este problema? É que uma maneira correta de fazer as coisas?

Foi útil?

Solução

quaternions Multiplicando vai sofrer de acumulação de ponto flutuante de arredondamento problemas (mesmo ângulos simples, como 45 graus não vai ser exato). É uma ótima maneira de rotações compostas, mas a precisão de cada um de seus componentes quaternion vai cair-off tempo acabou. A sangria-through é um efeito colateral, um visual pior, porém, é a sua quaternion poderia começar a incorporar um fator de escala - para recuperar isso, você teria que a normalizar volta para ângulos de Euler, em qualquer caso. Um ângulo Euler de ponto fixo não vai arredondamento se acumulam.

A recalcular o quaternion per-frame é mínima. Eu não me incomoda tentando otimizá-lo para fora. Você provavelmente poderia permitir que algumas quaternions para acumular antes de renormalizada para obter a volta precisão, mas realmente não vale a pena o esforço.

Outras dicas

A acumulação é um processo impreciso. Acumulando lotes de rotações incrementais irá acumular erro de arredondamento se você fazê-lo com quaternions ou matrizes.

Eu imagino algo como isto: você tem o seu código instalado e funcionando, mas notou que depois de uma certa quantidade de navegação sua câmera foi heeling mais irritantemente - violar um invariante que você não tinha pensado com antecedência. Efetivamente, você percebeu que você não deseja para rotações acumular; em vez você quer fazer algo mais.

Você pode olhar para isto como mais um problema design de interface que uma questão de precisão numérica. Basicamente, as pessoas esperam uma câmera para navegar de acordo com arremesso, guinada, and roll, por isso a escolha de controle e representam os ângulos diretamente pode evitar uma série de problemas.

A chatice é que os quaterions parecem ter redundante tornar-se (para este uso particular, pelo menos). Você ainda quer os quaternions, embora - interpolação com os ângulos de inclinação / guinada / roll pode ser feio. Novamente, é uma questão de design de interface: você precisa descobrir onde você vai precisar dos quaternions, e como obtê-los dentro e fora ...

Eu vi tanto defendeu. Eu acho que a verdadeira questão que você terá que lidar com é a flexibilidade em seu sistema de câmera para baixo da linha; IMO guinada é geralmente mais interessante em uma visão em terceira pessoa (porque você está indo para girar sobre o eixo vertical do personagem). Enquanto você pode sem dúvida "guinada" em torno da vertical na visão em primeira pessoa, bem, eu não tenho certeza que é realmente a mesma coisa.

No entanto, eu acho que é um tipo de resíduos para recalcular seus quaternions per-frame. Talvez seria melhor para armazenar as últimas quaternions e marcá-los sujo se o seu quadro recebe entrada?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top