Programação com OpenGL/Modern OpenGL Tutorial Navegacao: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 18:
Usar o Blender Z-is-up no OpenGL pode ser tentador, mas apresenta algumas questões:
* O arquivo .obj normalmente esta como Y-is-up, exigindo mudanças enquanto ele for carregado(ou enquanto é exportado no Blender)
* A cameracâmera está em Y-is-up, assim se você usar o Z-is-up, por padrão a camera esta em (0,0,0) ''e'' a face ''abaixo''. Isto é bastante confuso quando a camera for roda, pois por exemplos, se nossa camera está olhando o horizonte no eixo Y, e você rodar no eixo Z, para olhar para direita ou esquerda,você realmente vai rodar a vista no eixo Y (barrel roll). quando for transformar a camera, você tem que imaginar que você grava seu vídeo a partir dos pés.
* Outros motores como o Irrlicht e Ogre também usam o Y-is-up
Por isto vamos ficar com Y-is-up neste livro.
 
== Posicionando a cameracâmera ==
 
Não há conceitos pré definidos de cameracâmera no OpenGL. Nos temos de fazer uma implementação que engane.
 
Nossa técnica é a seguinte: em vez de pensarmos em como mover nossa cameracâmera em um mundo fixo. nós pensaremos em como mover o mundo em torno da nossa cameracâmera.
 
Por exemplo, movendo a cameracâmera para 3 unidades do eixo X é o mesmo que mover o mundo inteiro para -3 unidades do eixo X. O mesmo para todos os outros eixos e para rotações.
 
Manteremos isto em mente enquanto trabalhamos com a cameracâmera. o resultado final ficará completamente intuitivo, mas sempre que vamos trabalhar com a cameracâmera, se você esquecer que usamos este truque primeiro, você pode ter uma transformação estranha.
 
== Controle da cameracâmera ==
 
Vamos começar nossa implementação intuitiva:
* Esquerda/Direita rodara no eixo Y da cameracâmera.
* Cima/Baixo moverá para Frente/Para trás
* Page_up/Page_down rodara a cameracâmera no eixo X.
 
<source lang="cpp">
Linha 46:
* <code>glm::translate(transformation_matrix, glm::vec3(dx, dy, dz))</code>: aplicando a <code>transformation_matrix</code>, depois movendo em (dx, dy, dz) expressada no novo sistema de coordenadas.
* <code>glm::translate(glm::mat4(1), glm::vec3(dx, dy, dz)) * transformation_matrix</code>: aplicando <code>transformation_matrix</code>, depois movendo em (dx, dy, dz) expressado no sistema de coordenadas que está depois da translação.
* Neste caso a translação da cameracâmera, não esqueça que nosso truque move o mundo inteiro, e não a cameracâmera; por isto o significado acima esta ao contrario da matriz world2camera
 
Por exemplo, se existir um <code>transformation_matrix</code> rodando nossa cameracâmera em 90º para direita, e depois trasladar sobre o Z:
* Com a primeira forma você vai movimentar a cameracâmera novamente a esquerda(sobre o eixo Z do mundo),
* Enquanto da segunda forma você vai movimentar a cameracâmera frontal (sobre o eixo X do mundo).
 
-----
 
Esta implementação tem os seguintes problemas ao usar: Quando a cameracâmera estiver rodando para esquerda/direita equantoenquanto é dobrado, não usaremos a rotação do corpo da nossa entidade no dobro do eixo.
Em vez disto, vamos usar a rotação apenas sobre nossa cabeça alinhada ao eixo Y. assim vamos movimentar o mundo no eixo Y da coordenada local da cameracâmera:
<source lang="cpp">
glm::vec3 y_axis_world = glm::mat3(transforms[MODE_CAMERA]) * glm::vec3(0.0, 1.0, 0.0);
Linha 65:
/* code here */
</source>
 
 
{{AutoCat}}