Bonjour à tous,
je me suis lancé dans un projet de faire un script pour créer un terrain via script sous Unity. Le script a donc pour but de créer l'objet terrain, de générer un relief aléatoire grâce à la fonction Perlin Noise, puis de le texturer dans un second temps en fonction de l'altitude de chaque vertex, de la pente du terrain, etc, grâce à un système de poids sur un tableau de textures.
J'en suis actuellement à l'étape de la génération de relief aléatoire et j'arrive à quelque chose d'intéressant (voir image ci dessous) mais pas satisfaisant à mon goût.
En effet, le terrain obtenu grâce à mon petit script me donne un terrain qui ressemble fortement a des dunes de sable. En jouant sur la hauteur maximal du terrain je peux obtenir un relief plus ou moins haut et grâce à un coefficient je peux obtenir une fréquence plus importante mais je voudrais obtenir plus d'aléatoire.
Voici le lien d'une image d'un terrain que je souhaiterai pouvoir générer
Je voudrais pouvoir générer des petites bosses sur les versant de mes collines, pouvoir faire en sorte que les collines ne soit pas espacées à intervalle régulier. Je voudrais pouvoir générer pourquoi pas des vallées dans un terrain montagneux comme ici.
Bref voici au point où j'en suis niveau code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | void generateNewTerrain() { //set the data of the terrain we will create tData = new TerrainData(); tData.size = new Vector3(32, 10, 32); tData.heightmapResolution = 513; tData.SetDetailResolution(512, 8); HeightMap = tData.GetHeights(0, 0, tData.heightmapWidth, tData.heightmapHeight); //set the HeightMap tab to make it correspond to the actual height tab for our terrain int y = 0; while (y < tData.heightmapHeight) { int x = 0; while (x < tData.heightmapWidth) { float xCoord = Convert.ToSingle(x) * scale/ Convert.ToSingle(tData.heightmapWidth); //need to convert everything to float in order for the Perling Noise function to work float yCoord = Convert.ToSingle(y) * scale/ Convert.ToSingle(tData.heightmapHeight); // same float sample = Mathf.PerlinNoise(xCoord, yCoord); //generate height value for a vertex of the terrain with the Perlin Noise function HeightMap[x,y] = sample ; //put the generated value in the corresponding table of heights x++; } y++; } tData.SetHeights(0, 0, HeightMap); //put the generated heights into our terrain data // //set the texture of the terrain // SplatPrototype[] tex = new SplatPrototype[1]; // tex[0] = new SplatPrototype(); // tex[0].texture = terrainTex; // tex[0].tileSize = new Vector2(1,1); // tData.splatPrototypes = tex; //create the terrain data object as an asset AssetDatabase.CreateAsset(tData, "Assets/testTerrain.asset"); //create the terrain myTerrain = Terrain.CreateTerrainGameObject(tData); } |
J'ai déjà essayé de rajouter un facteur random à la valeur obtenue grâce à la fonction Perlin Noise mais ça me fait une multitude de stalactites à la surface de mon terrain, ce qui n'est pas l'effet désiré. J'ai aussi essayé de rajouter une boucle qui rajoute un Perlin Noise par dessus le tableau de Heights obtenu mais cela ne fait qu’aplanir mon terrain au lieu de rajouter du bruit.
Je voudrais donc savoir si quelqu'un pouvait m'aider, avait une idée de comment je pourrait arriver au résultat désiré.
Je posterai plus tard le script permettant de texturer le terrain, qui est plutôt bien avancé et marche plutôt bien sur un terrain créé à la main mais qui serait encore plus intéressant sur un terrain générer aléatoirement.