Programação com OpenGL/Modern OpenGL Tutorial 06 (editar)
Revisão das 21h06min de 17 de maio de 2013
, 17 de maio de 2013→Um cubo completo
[edição não verificada] | [edição não verificada] |
== Um cubo completo ==
Assim como nós dizemos, vamos especificar vértices independentes para cada face:
<source lang="c">
GLfloat cube_vertices[] = {
// frente
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0,
// Em cima
-1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
1.0, 1.0, -1.0,
-1.0, 1.0, -1.0,
// Atrás
1.0, -1.0, -1.0,
-1.0, -1.0, -1.0,
-1.0, 1.0, -1.0,
1.0, 1.0, -1.0,
// Em baixo
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
1.0, -1.0, 1.0,
-1.0, -1.0, 1.0,
// Esquerda
-1.0, -1.0, -1.0,
-1.0, -1.0, 1.0,
-1.0, 1.0, 1.0,
-1.0, 1.0, -1.0,
// Direita
1.0, -1.0, 1.0,
1.0, -1.0, -1.0,
1.0, 1.0, -1.0,
1.0, 1.0, 1.0,
};
</source>
Para cada face, as vértices serão colocadas em sentido anti-horário( Como o espectador esta encarando as faces).
Como consequência, o mapeamento da textura será a mesma em todas as faces:
<source lang="cpp">
GLfloat cube_texcoords[2*4*6] = {
// front
0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0,
};
for (int i = 1; i < 6; i++)
memcpy(&cube_texcoords[i*4*2], &cube_texcoords[0], 2*4*sizeof(GLfloat));
</source>
Aqui nós especificamos o mapeamento para a face da frente, e copiaremos isto nas 5 faces restantes.
Se as faces que estivessem em sentido horário, a textura seria mostrada espelhada depois disto.
Não existe nenhuma convenção sobre a orientação, se você fizer corretamente as coordenadas da textura ficarão devidamente mapeadas.
Os elementos do cubo são escritos similarmente, com 2 triângulo como índices(x, x+1, x+2), (x+2,x+3,x):
<source lang="c">
GLushort cube_elements[] = {
// frente
0, 1, 2,
2, 3, 0,
// topo
4, 5, 6,
6, 7, 4,
// fundo
8, 9, 10,
10, 11, 8,
// em baixo
12, 13, 14,
14, 15, 12,
// esquerda
16, 17, 18,
18, 19, 16,
// direita
20, 21, 22,
22, 23, 20,
};
...
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cube_elements);
int size; glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
</source>
[[File:OpenGL_Tutorial_Cube_textured.png|thumb|Voe, cubo, voe!]]
Para ficar mais divertido, e para ver a face inferior, vamos implementar 3 movimentos de rotação mostradas no tutorial flying cube do NeHe´s, no <code>onIdle</code>:
<source lang="cpp">
float angle = glutGet(GLUT_ELAPSED_TIME) / 1000.0 * 15; // base 15° per second
glm::mat4 anim = \
glm::rotate(glm::mat4(1.0f), angle*3.0f, glm::vec3(1, 0, 0)) * // X axis
glm::rotate(glm::mat4(1.0f), angle*2.0f, glm::vec3(0, 1, 0)) * // Y axis
glm::rotate(glm::mat4(1.0f), angle*4.0f, glm::vec3(0, 0, 1)); // Z axis
</source>
Está pronto!
== Usando o SOIL ==
|