Por favor, perdoe-me, mas preciso de ajuda e estou preso a isso há algumas semanas, não estou fazendo nenhum progresso e em todos os lugares que vou e vejo uma resposta diferente, tudo o que tento não funciona. Já tive dicas e conselhos suficientes, agora só preciso que alguém me dê a resposta para que eu trabalhe de trás para frente porque não consigo entender isso.
O que tornou esse assunto mais confuso é a maneira como todos usam um conjunto diferente de convenções ou regras, e suas respostas são baseadas em suas próprias convenções, sem definir o que são.
Então, aqui está o conjunto de convenções que formei com base no que parece ser mais comum e lógico:
- Regra da mão direita para o eixo.
- O positivo Y está ativo, o positivo Z está voltado para o espectador, o positivo X está à direita.
- Matrizes principais de linha, transpostas quando enviadas para shaders.
- Passo: rotação em torno do eixo X
- Guinada: rotação em torno do eixo y
- Rolo: rotação sobre o eixo z
- Ordem de rotação: rotação, inclinação, guinada (isso está correto? Alguém pode me verificar isso?)
- Valores de rotação positivos, olhando para baixo a partir da extremidade positiva de um eixo, resultam em rotação no sentido horário.
- A direção padrão para a rotação 0 em todo o eixo é um vetor apontando para Y negativo.
.. dadas essas convenções (por todos os meios, corrija-me se estiverem erradas!), como alguém:
- Escreva uma função LookAt? (lookAt (posição do vetor, foco do vetor, vetor acima))
- Calcular uma matriz de rotação. (rotação (x, y, z))
Tentei responder a essas duas perguntas pessoalmente pelo menos nas últimas 3 semanas, reescrevi minha função LookAt & Rotation Matrix pelo menos 30 vezes, testei dezenas de métodos e li o material que vi em centenas de sites e leu muitas perguntas respondidas, copiou o código de outras pessoas e nada que eu fiz até agora funcionou, tudo produziu o resultado errado. Alguns dos quais produziram resultados hilariantes e bizarros, nem mesmo perto da rotação correta.
Venho trabalhando nisso todas as noites, com exceção da noite passada, porque estava tão frustrado com o fracasso repetido que tive que parar e fazer uma pausa.
Por favor, mostre-me qual é o método correto para que eu possa trabalhar de trás para frente e descobrir como funciona. Só não estou recebendo a resposta correta e isso está me deixando um pouco louco!
Estou escrevendo em Java, mas vou pegar o código escrito em qualquer linguagem, a maioria do meu código de renderização 3D está realmente funcionando de maneira brilhante, são apenas as matemáticas que não consigo entender.
ATUALIZAÇÃO: RESOLVIDO
Obrigado pela ajuda! Agora tenho uma função LookAt funcional que realmente entendo e não poderia estar mais feliz (se alguém quiser vê-la, pergunte por todos os meios).
Tentei novamente criar uma matriz de rotação baseada em variáveis fora do pitch / yaw / roll e novamente pareceu falhar, mas decidi fazer um dump ao tentar usar ângulos de euler para a câmera freelook, pois parece ser inadequado para o O papel, em vez de criar uma classe de quaternion, pode ter melhor sorte nesse caminho; caso contrário, recorrerei ao uso do pitch / yaw como coordenadas esféricas e contarei com a nova função LookAt para rotação.
Se alguém estiver enfrentando um problema semelhante e quiser me fazer perguntas, sinta-se à vontade.
Pelo menos não estou mais preso, obrigado pela ajuda!