Ir al contenido principal

Renderizado de terrenos

Desde hace mucho tiempo vengo dándole vueltas a este asunto de la generación y renderizado de terrenos. Tutoriales hay a montones en internet pero no estaba preparado para entenderlos hasta que leí OpenGL game programming y Beginning OpenGL game programming, un par de libros que recomiendo muy especialmente. Están en mi lista de prioridades para cuando alguien me deba un favor y esté dispuesto a desembolsar su precio para pagármelos, porque obviamente están muy lejos de mi modesto salario.
Cada cual tiene su propio método, pero nadie explica el algoritmo para calcular la geometría del terreno de una forma tan clara y lo mismo para el proceso de renderizado, que incluso agrega agua y posteriormente es susceptible de ser mejorado con arreglos de vértices.
Me resultó muy fácil adaptar el código del libro, aunque en el proceso cometí varios errores.
Suponiendo que tengas un mapa de alturas en forma de arreglo bidimensional:

float hm[MAP_Z][MAP_X]={
{0,1.0,0,0,0,0,0,0,0,0,0,0},
{1.0,4.0,3.0,0,0,1.0,2.0,1.0,0,0,0,0},
{0,0,1.5,2.0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,2.0,3.5,1.0,0,0,0},
{1,2,3,2.7,2,1.1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0},
{1,2.0,1,0,0,0,1.0,2.0,2.0,0,0,0},
{0,0,0,0,2.0,0,0,0,0,0,0,0},
{0,0,1.0,0,0,0,0,0,0,0,0,0},
{0,0.6,1.0,0.5,0,0,0,0,0,0,0,0},
{0,0,1.0,0,0,0,0,0,0,0,0,0},
{0,0,0.5,0,0,1.1,0,0,0,0,0,0}
};

Generar la geometría sería algo tan sencillo como:

GLfloat terrain[MAP_X][MAP_Z][3];
int z,x;
for (z=0;z < MAP_Z ; z++ )
for (x=0;x < MAP_Z ; z++ )
terrain[x][z][0]=x*ts;

terrain[x][z][1]=hm[z][x];
terrain[x][z][2]=z*ts;
}//for x
}//for z


Y el renderizado sería:

for (z=0;z < style="font-style: italic;"> glBegin(GL_TRIANGLE_STRIP);
for (x=0;x < style="font-style: italic;"> //vertex 0
glTexCoord2f(0.0,0.0);
glVertex3f(terrain[x][z][0],terrain[x][z][1],terrain[x][z][2]);
//vertex 1
glTexCoord2f(1.0,0.0);
glVertex3f(terrain[x+1][z][0],terrain[x+1][z][1],terrain[x+1][z][2]);
//vertex 2
glTexCoord2f(0.0,1.0);
glVertex3f(terrain[x][z+1][0],terrain[x][z+1][1],terrain[x][z+1][2]);
//vertex 3
glTexCoord2f(1.0,1.0);
glVertex3f(terrain[x+1][z+1][0],terrain[x+1][z+1][1],terrain[x+1][z+1][2]);
}
glEnd();
}

Nada, que este libro vale su peso en oro y es una herramienta que no debería faltarte si quieres dedicarte a la programación de juegos.

Comentarios

  1. Y el renderizado sería:

    for (z=0;z // z less than ?;z++) { /* THIS? */
    glBegin(GL_TRIANGLE_STRIP);
    for (x=0;x // x less than ?;x++) { /* THIS? */
    //vertex 0
    glTexCoord2f(0.0,0.0);
    glVertex3f(terrain[x][z][0],terrain[x][z][1],terrain[x][z][2]);
    //vertex 1
    glTexCoord2f(1.0,0.0);
    glVertex3f(terrain[x+1][z][0],terrain[x+1][z][1],terrain[x+1][z][2]);
    //vertex 2
    glTexCoord2f(0.0,1.0);
    glVertex3f(terrain[x][z+1][0],terrain[x][z+1][1],terrain[x][z+1][2]);
    //vertex 3
    glTexCoord2f(1.0,1.0);
    glVertex3f(terrain[x+1][z+1][0],terrain[x+1][z+1][1],terrain[x+1][z+1][2]);
    }
    glEnd();
    }

    ResponderEliminar

Publicar un comentario