Un el renderitzats de terrenys a partir de mapes d’alçada consisteix en generar programàticament, a partir d’un bitmap en blanc i negre, un terreny més o menys muntanyós.
L’algorisme es basa en llegir tots els colors del bitmap i establir una alçada a un vector tridimensional. Posteriorment s’afegiran els triangles que conformen el terreny i afegirem el material (o textura) al terreny generat.
El codi que us facilito està ampliament basat en l’exemple de XNA Creators club «Generated Geometry«. Hi he afegit algunes cosetes més, com un component de càmera mòbil que permet «volar» pel terreny generat.
Així passarem de tenir un mapa d’alçades com aquest, a un terreny generat com el que hem vist a la foto de dalt.
La gràcia afegida de tot plegat, és que la generació del terreny es fa amb una classe que extèn el Content Pipeline. D’aquesta manera, podem tractar el nostre terreny com una textura més a carregar, i la podem generar amb un senzill «LoadContent», com trobareu al codi (on terreny és una variable de tipus «Model»):
// Carreguem el mapa d’alçades «terrain»
terreny = Content.Load<Model>(«terreny»);
Per moure la càmera podeu fer-ho amb el ratolí, amb la qual cosa la fareu rotar sobre els seus propis eixos, o amb les lletres W, S, A i D del teclat, amb la qual cosa la moureu cap endavant, endarrera, esquerra i dreta respectivament.
És important recalcar, que per utilitzar la extensió del content pipeline en altres projectes, hem de seguir aquests passos:
1- Afegir el projecte a la solució:
2-Referenciar el projecte des del content pipeline:
3-Dir al compilador que ha de fer servir la nostra extensió del content pipeline quan intentem carregar el contingut:
Podeu descarregar el codi complet mitjançant aquest enllaç. Obviament cal tenir instal·lat XNA Game Studio i Visual Studio per a poder-lo compilar. Si no saps ni que és XNA, aquí pots trobar una introducció.
[…] mi anterior blog escribí un artículo en el que se explicaba como generar un terreno en XNA a partir de un mapa de alturas (catalán). Vamos a partir de ese ejemplo para este nuevo […]