Skip to content

progjogos3d/opengl03-ex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 

Repository files navigation

opengl03-ex

Solução do exercício sobre construir um chão.

O primeiro passo na solução é a criação dos vértices. Por serem quadrados, a criação é bastante simples, e é constituída de uma repetição para os vértices das linhas, outra para o das colunas:

Por exemplo, no esquema 5x3 abaixo, os vértices seriam criados na seguinte ordem:

.1    .2    .3    .4    .5

.6    .7    .8    .9    .10

.11   .12   .13   .14    .15

Como o posicionamento deve ser centralizado, é necessário subtrair das coordenadas x e y da malha metade da largura e metade da altura. Observe que, como a distância entre os vértices é 1, e não há distância no vértice 0, essa dimensão será (largura-1)/2.0 e (altura-1)/2.0.

O código final de criação dos vértices será, portanto:

float hw = (width-1) / 2.0f;
float hd = (depth-1) / 2.0f;

List<Vector3f> positions = new ArrayList<>();
for (int z = 0; z < depth; z++) {
    for (int x = 0; x < width; x++) {
        positions.add(new Vector3f(x - hw, 0, z - hd));
    }
}

A parte mais complicada é certamente a criação dos índices. Criaremos os índices quadrado. Porém, como descobrir o índice do vértice dentro do IndexBuffer, se nele os vértices foram inseridos sequencialmente?

Podemos converter um índice bidimensional (linha e coluna) em um índice bidimensional utilizando a fórmula:

indice = coluna + linha * largura

Observe que ao percorrer um quadrado, teremos os seguintes vértices

.0 (x,z)        .1 (x+1, z)   

.2 (x,z+1)      .3 (x+1, z+1)   

O codigo abaixo utiliza a fórmula acima para obte-los:

int zero = x + z * width;               
int one = (x + 1) + z * width;          
int two = x + (z + 1) * width;          
int three = (x + 1) + (z + 1) * width;  

Agora, basta percorrermos cada quadrado, e fornecermos os índices de 6 em 6. Observe no esquema que uma malha 5x3 terá 4x2 quadrados. Ou seja (linhas-1)x(colunas-1) quadrados. Cada quadrado será formado pelos índices 0,3,1 e 0,2,3, resultando no código:

List<Integer> indices = new ArrayList<>();
for (int z = 0; z < depth - 1; z++) {
   for (int x = 0; x < width - 1; x++) {
       int zero = x + z * width;               //inferior esquerdo
       int one = (x + 1) + z * width;          //inferior direito
       int two = x + (z + 1) * width;          //superior esquerdo
       int three = (x + 1) + (z + 1) * width;  //superior direito

       indices.add(zero);
       indices.add(three);
       indices.add(one);

       indices.add(zero);
       indices.add(two);
       indices.add(three);
   }
}

Formando assim a malha que desejamos.

About

Solução do exercício

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors