Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-04-05T09:20:02+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Générer un terrain grâce au Perlin Noise, message #1050822016-04-05T09:20:02+02:00MeliMelo/@MeliMelohttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p105082<p>Bonjour,</p>
<p>desole de l'absence mais j'ai ete tres pris par un projet professionnel ces derniers temps et comme ce defis de generation de terrain procedural est personnel c'est un peu passe au second plan pendant un moment.</p>
<p>Bon du coup je m'y suis remis aujourd'hui et apres avoir lu un article sur un tres bon blog, j'ai recommence mes tests. <a href="http://www.redblobgames.com/articles/noise/introduction.html">lien vers le site de l'article</a></p>
<p>je me heurte cependant a un nouveau probleme que j'avoue ne pas comprendre.
J'ai decide d'ajouter un 60 niveau de perlin noise avec des frequences allant de 1 a 60 et donc le poids serait de 1/frequence.
Je pense qu'avec des reglages de ce genre je pourrais obtenir quelque chose d'interessant mais pour le moment le terrain generer contient des grandes traces en diagonale. Je me demande vraiment ce qui pourrait causer cet effet.</p>
<p><a href="http://zestedesavoir.com/media/galleries/1187/7962f675-fad6-42ee-9720-3b8635bd63c9.png"><img alt="proceduralterrain" src="http://zestedesavoir.com/media/galleries/1187/7962f675-fad6-42ee-9720-3b8635bd63c9.png.120x120_q95_crop.png"></a></p>
<p>voila si quelqu'un a une idee de ce qui pourrait provoquer cet effet, comment le resoudre … je suis preneur <img alt=":)" src="/static/smileys/smile.png"></p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> <span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">UnityEditor</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">HeightmapGen</span> <span class="p">:</span> <span class="n">MonoBehaviour</span> <span class="p">{</span>
<span class="k">private</span> <span class="kt">float</span><span class="p">[,]</span> <span class="n">HeightMap</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">float</span><span class="p">[]</span> <span class="n">weights</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">float</span><span class="p">[</span><span class="m">60</span><span class="p">];</span><span class="c1">//{ 1f, 1/4f, 1/16f, 1/64f, 1/256f, 1/1024f};//, 0.2f, 4f, 0.5f, 3f }; //new float[30];</span>
<span class="k">private</span> <span class="kt">float</span><span class="p">[]</span> <span class="n">frequencies</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">float</span><span class="p">[</span><span class="m">60</span><span class="p">];</span><span class="c1">// = { 1f, 2f, 4f, 8f, 16f, 32f};// 2f, 4f, 8f, 16f, 32f }; //new float[30];</span>
<span class="k">private</span> <span class="kt">int</span> <span class="n">xTerrainRes</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">int</span> <span class="n">yTerrainRes</span><span class="p">;</span>
<span class="k">private</span> <span class="n">GameObject</span> <span class="n">myTerrain</span><span class="p">;</span>
<span class="k">private</span> <span class="n">TerrainData</span> <span class="n">tData</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">float</span> <span class="n">xOrg</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">float</span> <span class="n">yOrg</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">float</span> <span class="n">frequency</span> <span class="p">=</span> <span class="m">1.0F</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">float</span> <span class="n">previousFrequency</span> <span class="p">=</span> <span class="m">0.0F</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">int</span> <span class="n">j</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">public</span> <span class="n">Texture2D</span> <span class="n">terrainTex</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">int</span> <span class="n">passes</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">float</span> <span class="n">amplitude</span> <span class="p">=</span> <span class="m">1.0F</span><span class="p">;</span> <span class="c1">//terrain height</span>
<span class="k">private</span> <span class="kt">float</span> <span class="n">previousAmplitude</span> <span class="p">=</span> <span class="m">1.0F</span><span class="p">;</span>
<span class="c1">// Use this for initialization</span>
<span class="k">void</span> <span class="nf">Start</span> <span class="p">()</span>
<span class="p">{</span>
<span class="n">previousFrequency</span> <span class="p">=</span> <span class="n">frequency</span><span class="p">;</span>
<span class="n">previousAmplitude</span> <span class="p">=</span> <span class="n">amplitude</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p"><</span> <span class="m">60</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
<span class="p">{</span>
<span class="n">frequencies</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="n">i</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span>
<span class="n">weights</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="n">Pow</span><span class="p">(</span><span class="n">frequencies</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="p">(-</span><span class="m">1f</span><span class="p">));</span>
<span class="p">}</span>
<span class="n">generateNewTerrain</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">void</span> <span class="nf">generateNewTerrain</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">//set the data of the terrain we will create</span>
<span class="n">tData</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TerrainData</span><span class="p">();</span>
<span class="n">tData</span><span class="p">.</span><span class="n">size</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Vector3</span><span class="p">(</span><span class="m">32</span><span class="p">,</span> <span class="m">500</span><span class="p">,</span> <span class="m">32</span><span class="p">);</span>
<span class="n">tData</span><span class="p">.</span><span class="n">heightmapResolution</span> <span class="p">=</span> <span class="m">513</span><span class="p">;</span>
<span class="n">tData</span><span class="p">.</span><span class="n">SetDetailResolution</span><span class="p">(</span><span class="m">512</span><span class="p">,</span> <span class="m">8</span><span class="p">);</span>
<span class="n">HeightMap</span> <span class="p">=</span> <span class="n">tData</span><span class="p">.</span><span class="n">GetHeights</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">,</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">);</span> <span class="c1">//set the HeightMap tab to make it correspond to the actual height tab for our terrain</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p"><</span> <span class="n">passes</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">y</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">y</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">x</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">x</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">float</span> <span class="n">xCoord</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">/</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span> <span class="p">-</span> <span class="m">1</span><span class="p">);</span> <span class="c1">//need to convert everything to float in order for the Perling Noise function to work</span>
<span class="kt">float</span> <span class="n">yCoord</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="p">/</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span> <span class="p">-</span> <span class="m">1</span><span class="p">);</span> <span class="c1">// same</span>
<span class="kt">float</span> <span class="n">sample</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="n">PerlinNoise</span><span class="p">(</span><span class="n">xCoord</span> <span class="p">*</span> <span class="n">frequencies</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">*</span> <span class="n">frequency</span><span class="p">,</span> <span class="n">yCoord</span> <span class="p">*</span> <span class="n">frequencies</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">*</span> <span class="n">frequency</span><span class="p">);</span> <span class="c1">//generate height value for a vertex of the terrain with the Perlin Noise function</span>
<span class="n">HeightMap</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="p">+=</span> <span class="n">sample</span> <span class="p">*</span> <span class="n">weights</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">*</span> <span class="n">amplitude</span><span class="p">;</span> <span class="c1">//put the generated value in the corresponding table of heights</span>
<span class="n">x</span><span class="p">++;</span>
<span class="p">}</span>
<span class="n">y</span><span class="p">++;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">p</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">p</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">x</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">x</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">HeightMap</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">p</span><span class="p">]</span> <span class="p">=</span> <span class="n">HeightMap</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">p</span><span class="p">]</span> <span class="p">/</span> <span class="n">SumWeights</span><span class="p">();</span> <span class="c1">//put the generated value in the corresponding table of heights</span>
<span class="n">x</span><span class="p">++;</span>
<span class="p">}</span>
<span class="n">p</span><span class="p">++;</span>
<span class="p">}</span>
<span class="n">tData</span><span class="p">.</span><span class="n">SetHeights</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">HeightMap</span><span class="p">);</span> <span class="c1">//put the generated heights into our terrain data</span>
<span class="c1">//set the texture of the terrain</span>
<span class="n">SplatPrototype</span><span class="p">[]</span> <span class="n">tex</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SplatPrototype</span><span class="p">[</span><span class="m">1</span><span class="p">];</span>
<span class="n">tex</span><span class="p">[</span><span class="m">0</span><span class="p">]</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SplatPrototype</span><span class="p">();</span>
<span class="n">tex</span><span class="p">[</span><span class="m">0</span><span class="p">].</span><span class="n">texture</span> <span class="p">=</span> <span class="n">terrainTex</span><span class="p">;</span>
<span class="n">tex</span><span class="p">[</span><span class="m">0</span><span class="p">].</span><span class="n">tileSize</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Vector2</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">1</span><span class="p">);</span>
<span class="n">tData</span><span class="p">.</span><span class="n">splatPrototypes</span> <span class="p">=</span> <span class="n">tex</span><span class="p">;</span>
<span class="c1">//create the terrain data object as an asset</span>
<span class="n">AssetDatabase</span><span class="p">.</span><span class="n">CreateAsset</span><span class="p">(</span><span class="n">tData</span><span class="p">,</span> <span class="s">"Assets/testTerrain.asset"</span><span class="p">);</span>
<span class="c1">//create the terrain</span>
<span class="n">myTerrain</span> <span class="p">=</span> <span class="n">Terrain</span><span class="p">.</span><span class="n">CreateTerrainGameObject</span><span class="p">(</span><span class="n">tData</span><span class="p">);</span>
<span class="n">myTerrain</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Vector3</span><span class="p">(-</span><span class="m">250f</span><span class="p">,</span> <span class="m">0f</span><span class="p">,</span> <span class="p">-</span><span class="m">250f</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Update is called once per frame</span>
<span class="k">void</span> <span class="nf">Update</span> <span class="p">()</span>
<span class="p">{</span>
<span class="c1">//if the scale has changed, then destroy the previous terrain and generate a new one with the current scale.</span>
<span class="k">if</span><span class="p">(</span><span class="n">frequency</span> <span class="p">!=</span> <span class="n">previousFrequency</span> <span class="p">||</span> <span class="n">amplitude</span> <span class="p">!=</span> <span class="n">previousAmplitude</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">Destroy</span><span class="p">(</span><span class="n">myTerrain</span><span class="p">);</span>
<span class="n">generateNewTerrain</span><span class="p">();</span>
<span class="n">previousFrequency</span> <span class="p">=</span> <span class="n">frequency</span><span class="p">;</span>
<span class="n">previousAmplitude</span> <span class="p">=</span> <span class="n">amplitude</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">float</span> <span class="nf">SumWeights</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">float</span> <span class="n">sumWeights</span> <span class="p">=</span> <span class="m">0f</span><span class="p">;</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p"><</span> <span class="n">weights</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
<span class="p">{</span>
<span class="n">sumWeights</span> <span class="p">+=</span> <span class="n">weights</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">sumWeights</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p><strong>EDIT:</strong><br>
je n'ai pas trouve vraiment quel etait le probleme mais je viens de faire des tests avec des frequences correspondants a des puissances de 2 (ce qui est apparemment appele octaves dans les articles que j'ai lu sur le sujet) et cet effet de rayure a disparu. Peut etre que la fonction Perlin Noise marche mieux avec des octaves …
Du coup en generant un terrain avec 5 passes, le resultat est plutot satisfaisant. Je vais maintenant essayer de rajouter un smooth sur les valeurs basses afin que les parties plaines soient un peu moins bosselees.</p>Générer un terrain grâce au Perlin Noise, message #993452016-02-18T02:39:29+01:00MeliMelo/@MeliMelohttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p99345<p>Haaa ca fait plaisir d'avoir des retours. Je commencais a penser que cela n'interessait personne hehe.
Effectivement j'essaye de mixer differents perlin noise d'amplitudes differentes mais je n'avais pas penser a y ajouter un poids.
Je vais aller faire un tour sur les differents liens que tu as poste car cela a l'air tres interessant et je reviens tres bientot pour poster mon avancee sur le sujet.</p>Générer un terrain grâce au Perlin Noise, message #991852016-02-17T08:36:06+01:00overdrivr/@overdrivrhttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p99185<p>Si tu veux des algorithmes pour mélanger des bruits de manière à avoir des résultats intéressants, je t'invite à jeter un œil à <a href="https://github.com/Overdrivr/ZNoise">mon dépôt github</a>. Il y a des examples de Mixers, qui permettent de produire des terrains assez cools.</p>
<p><figure><img alt="" src="https://raw.githubusercontent.com/Overdrivr/ZNoise/master/example-images/hybridmultifractal_h0.2_l2.5.bmp"><figcaption>Un exemple de Mixer FBM, but... will it blend ?</figcaption></figure></p>
<p>Comme tu l'as bien compris, l'idée est de construire ton image finale en additionnant des échelles de plus en plus fines en leur donnant un poids dans l'image finale de plus en plus petits. Les échelles les plus petites apporteront donc du detail, tandis que les premières amèneront la forme globale du terrain.</p>
<p>Pour l'instant mon dépôt implémente deux mixers, le <a href="https://github.com/Overdrivr/ZNoise#fractal-brownian-motion-fbm---5-octaves"><em>Fractal Brownian Motion</em></a> (c'est pas moi qui ait inventé le nom héhé) et le <a href="https://github.com/Overdrivr/ZNoise#hybrid-multi-fractal---5-octaves">Hybrid Multi Fractal</a>.</p>
<p>Le plus gros challenge avec ce genre de mixers, c'est d'arriver a trouver la bonne échelle de base. Donc mon conseil, c'est d'augmenter l'echelle de ton Perlin, jusqu'à ce que sur ton terrain entier il génère une ou deux vallées et une ou deux montagnes, puis d'appliquer l'algorithme de mixage dessus.</p>Générer un terrain grâce au Perlin Noise, message #981392016-02-10T10:17:05+01:00MeliMelo/@MeliMelohttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p98139<p>Hum donc si je comprends bien, il faudrait que je génère un perlin noise avec un certain scale (qui ici correspond à la fréquence je pense puisque lorsque j'augmente celui-ci, la période diminue) puis un autre avec une fréquence plus grande et ensuite que je les ajoute ?
Pour l'instant j'ai essayé de jouer la dessus mais les résultats ne sont pas très concluants, je n'obtiens pas des edges très prononcés. Ils restent arrondis et donc ressemblent à des dunes.</p>Générer un terrain grâce au Perlin Noise, message #967512016-02-01T04:29:14+01:00MeliMelo/@MeliMelohttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p96751<p>Hum ok ok.
En fait le truc c'est que dans les fonctions de Perlin Noise que ecrites a la mains que j'ai vu sur le net, les parametres permettaient de faire varier la frequence et l'octave mais dans le cas de la fonction fournie pas Unity, il n'y a pas ces parametres la …
Il faudrait alors que avant de remplir le tableau des heights avec le sample cree je lui ajoute un autre Perlin Noise cree avec des parametres differents ?
Pouvez vous m'aiguiller sur ce point car je ne suis sur de bien comprendre. </p>Générer un terrain grâce au Perlin Noise, message #966622016-01-31T12:04:33+01:00ache/@achehttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p96662<p>Je pense vraiment que la solution d'Eusèbe est la bonne.</p>
<p>Si tu veux des vallées (ou chaînes de montagnes), tu perds un peu d'aléatoire, mais il faudra faire un traitement après je pense. Lisser les zones basses proches par exemple.</p>Générer un terrain grâce au Perlin Noise, message #965342016-01-30T14:12:00+01:00Eusèbe/@Eus%C3%A8behttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p96534<blockquote>
<p>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. </p>
</blockquote>
<p>Avec la même fréquence, ce n'est pas surprenant, mais est-ce que tu as essayé d'additionner un bruit de basse fréquence et de haute amplitude (ce que tu as actuellement, pour le relief global) avec un autre de haute fréquence et de faible amplitude (pour les irrégularités) ?</p>Générer un terrain grâce au Perlin Noise, message #965152016-01-30T12:00:11+01:00MeliMelo/@MeliMelohttps://zestedesavoir.com/forums/sujet/5262/generer-un-terrain-grace-au-perlin-noise/?page=1#p96515<p>Bonjour à tous,</p>
<p>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.</p>
<p>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. <br>
<a href="http://zestedesavoir.com/media/galleries/1187/eb37b74b-9b9f-45a1-9826-01c6442f9b6d.png"><img alt="Perlin Noise Terrain" src="http://zestedesavoir.com/media/galleries/1187/eb37b74b-9b9f-45a1-9826-01c6442f9b6d.png.120x120_q85_crop.png"></a> </p>
<p>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. <br>
<a href="http://www.3dvia.com/studio/wp-content/uploads/2011/04/terrain-mounts.png">Voici le lien d'une image d'un terrain que je souhaiterai pouvoir générer</a> <br>
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 <a href="http://arches.liris.cnrs.fr/publications/images/FeatureCurves/FeatureCurves_03.jpg">ici.</a> </p>
<p>Bref voici au point où j'en suis niveau code :</p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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</pre></div></td><td class="code"><div class="codehilite"><pre> <span class="k">void</span> <span class="nf">generateNewTerrain</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">//set the data of the terrain we will create</span>
<span class="n">tData</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TerrainData</span><span class="p">();</span>
<span class="n">tData</span><span class="p">.</span><span class="n">size</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Vector3</span><span class="p">(</span><span class="m">32</span><span class="p">,</span> <span class="m">10</span><span class="p">,</span> <span class="m">32</span><span class="p">);</span>
<span class="n">tData</span><span class="p">.</span><span class="n">heightmapResolution</span> <span class="p">=</span> <span class="m">513</span><span class="p">;</span>
<span class="n">tData</span><span class="p">.</span><span class="n">SetDetailResolution</span><span class="p">(</span><span class="m">512</span><span class="p">,</span> <span class="m">8</span><span class="p">);</span>
<span class="n">HeightMap</span> <span class="p">=</span> <span class="n">tData</span><span class="p">.</span><span class="n">GetHeights</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">,</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">);</span> <span class="c1">//set the HeightMap tab to make it correspond to the actual height tab for our terrain</span>
<span class="kt">int</span> <span class="n">y</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">y</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">x</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">x</span> <span class="p"><</span> <span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">float</span> <span class="n">xCoord</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">*</span> <span class="n">scale</span><span class="p">/</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">tData</span><span class="p">.</span><span class="n">heightmapWidth</span><span class="p">);</span> <span class="c1">//need to convert everything to float in order for the Perling Noise function to work</span>
<span class="kt">float</span> <span class="n">yCoord</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="p">*</span> <span class="n">scale</span><span class="p">/</span> <span class="n">Convert</span><span class="p">.</span><span class="n">ToSingle</span><span class="p">(</span><span class="n">tData</span><span class="p">.</span><span class="n">heightmapHeight</span><span class="p">);</span> <span class="c1">// same</span>
<span class="kt">float</span> <span class="n">sample</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="n">PerlinNoise</span><span class="p">(</span><span class="n">xCoord</span><span class="p">,</span> <span class="n">yCoord</span><span class="p">);</span> <span class="c1">//generate height value for a vertex of the terrain with the Perlin Noise function</span>
<span class="n">HeightMap</span><span class="p">[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">]</span> <span class="p">=</span> <span class="n">sample</span> <span class="p">;</span> <span class="c1">//put the generated value in the corresponding table of heights</span>
<span class="n">x</span><span class="p">++;</span>
<span class="p">}</span>
<span class="n">y</span><span class="p">++;</span>
<span class="p">}</span>
<span class="n">tData</span><span class="p">.</span><span class="n">SetHeights</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">HeightMap</span><span class="p">);</span> <span class="c1">//put the generated heights into our terrain data</span>
<span class="c1">// //set the texture of the terrain</span>
<span class="c1">// SplatPrototype[] tex = new SplatPrototype[1];</span>
<span class="c1">// tex[0] = new SplatPrototype();</span>
<span class="c1">// tex[0].texture = terrainTex;</span>
<span class="c1">// tex[0].tileSize = new Vector2(1,1);</span>
<span class="c1">// tData.splatPrototypes = tex;</span>
<span class="c1">//create the terrain data object as an asset</span>
<span class="n">AssetDatabase</span><span class="p">.</span><span class="n">CreateAsset</span><span class="p">(</span><span class="n">tData</span><span class="p">,</span> <span class="s">"Assets/testTerrain.asset"</span><span class="p">);</span>
<span class="c1">//create the terrain</span>
<span class="n">myTerrain</span> <span class="p">=</span> <span class="n">Terrain</span><span class="p">.</span><span class="n">CreateTerrainGameObject</span><span class="p">(</span><span class="n">tData</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>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. <br>
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. <img alt=":)" src="/static/smileys/smile.png"></p>