File: CastleTerrain.TTerrainNoise.html

package info (click to toggle)
castle-game-engine 5.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 185,428 kB
  • sloc: pascal: 260,781; cpp: 1,363; objc: 713; makefile: 537; xml: 496; sh: 480; php: 4
file content (240 lines) | stat: -rw-r--r-- 17,652 bytes parent folder | download
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Castle Game Engine: CastleTerrain: Class TTerrainNoise</title>
<meta name="generator" content="PasDoc 0.13.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>Castle Game Engine</h2><p><a href="introduction.html" class="navigation">Introduction</a></p><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<a name="TTerrainNoise"></a><h1 class="cio">Class TTerrainNoise</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a  href="CastleTerrain.html">CastleTerrain</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TTerrainNoise = class(<a class="normal" href="CastleTerrain.TTerrainImage.html">TTerrainImage</a>)</code></p>
<h2 class="description">Description</h2>
<p>
Procedural terrain: data from a procedural noise.

<p>&quot;Synthesized noise&quot; means it's not simply something random. We take the noise (integer noise, i.e. hash), smooth it (how well, and how fast &mdash; see <a class="normal" href="CastleTerrain.TTerrainNoise.html#Interpolation">Interpolation</a> and <a class="normal" href="CastleTerrain.TTerrainNoise.html#Blur">Blur</a>), and add several functions (&quot;<a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a>&quot;) of such noise (with varying <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> and <a class="normal" href="CastleTerrain.TTerrainNoise.html#Amplitude">amplitude</a>) together. This is the kind of noise used to synthesize textures, terrains and all other procedural stuff.

<p>For more info about math inside:

<p></p>

<ul class="paragraph_spacing">
  <li><p>[<a  href="http://en.wikipedia.org/wiki/Fractional_Brownian_motion">http://en.wikipedia.org/wiki/Fractional_Brownian_motion</a>]. This is the idea of summing up <a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a> of noise. Ken Musgrave's dissertation has a lot of info and interesting references: [<a  href="http://www.kenmusgrave.com/dissertation.html">http://www.kenmusgrave.com/dissertation.html</a>]</p></li>
  <li><p>Blender's source code is informative, interesting file is blender/source/blender/blenlib/intern/noise.c</p></li>
  <li><p>The simplest practical <a class="normal" href="introduction.html">introduction</a> to the idea is on [<a  href="http://freespace.virgin.net/hugo.elias/models/m_perlin.htm">http://freespace.virgin.net/hugo.elias/models/m_perlin.htm</a>]. It describes how to get nice noise very easily, and my approach follows theirs.</p></li>
</ul>

<p>

<p>This descends from <a class="normal" href="CastleTerrain.TTerrainImage.html">TTerrainImage</a>, so you add an image to your function result.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="ancestor"><a class="normal" href="CastleTerrain.TTerrain.html">TTerrain</a></li>
<li class="ancestor"><a class="normal" href="CastleTerrain.TTerrainImage.html">TTerrainImage</a></li>
<li class="thisitem">TTerrainNoise</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a  href="CastleTerrain.TTerrainNoise.html#Create">Create</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a  href="CastleTerrain.TTerrainNoise.html#Height">Height</a></b>(const X, Y: Single): Single; override;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Octaves">Octaves</a></b>: Single read FOctaves write FOctaves default 4.0;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Smoothness">Smoothness</a></b>: Single read FSmoothness write FSmoothness default 2.0;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Amplitude">Amplitude</a></b>: Single read FAmplitude write FAmplitude default 1.0;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Frequency">Frequency</a></b>: Single read FFrequency write FFrequency default 1.0;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Interpolation">Interpolation</a></b>: <a  href="CastleTerrain.html#TNoiseInterpolation">TNoiseInterpolation</a>
      read FInterpolation write SetInterpolation default niCosine;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Blur">Blur</a></b>: boolean read FBlur write SetBlur default false;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Seed">Seed</a></b>: Cardinal read FSeed write FSeed default 0;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleTerrain.TTerrainNoise.html#Heterogeneous">Heterogeneous</a></b>: Single
      read FHeterogeneous write FHeterogeneous default 0.0;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Height"></a><code>function <b>Height</b>(const X, Y: Single): Single; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Octaves"></a><code>property <b>Octaves</b>: Single read FOctaves write FOctaves default 4.0;</code></td>
</tr>
<tr><td colspan="2">
<p>
Number of noise functions to sum. This linearly affects the time for Height call, so don't make it too much. Usually &tilde;a few are Ok.

<p>(The fact that it's a float is just a simple trick to allow smooth transitions from x to x+1. In fact, it's executed like Trunc(<code>Octaves</code>) * some noises + Frac(<code>Octaves</code>) * some last noise.)</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Smoothness"></a><code>property <b>Smoothness</b>: Single read FSmoothness write FSmoothness default 2.0;</code></td>
</tr>
<tr><td colspan="2">
<p>
How noise <a class="normal" href="CastleTerrain.TTerrainNoise.html#Amplitude">amplitude</a> changes, when <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> doubles. When we double <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a>, <a class="normal" href="CastleTerrain.TTerrainNoise.html#Amplitude">amplitude</a> is divided by this. Smaller values &lt;=&gt; larger <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> noise is more visible, so terrain is less smooth (more noisy).

<p>This is elsewhere called fractal increment, fractal dimension parameter, &quot;H&quot;, spectral exponent (see e.g. Blender sources, Musgrave's dissertation). Do not confuse this with &quot;lacunarity&quot; (how <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> changes in each octave), that is simply hardcoded to 2.0 in our code currently. In [<a  href="http://freespace.virgin.net/hugo.elias/models/m_perlin.htm">http://freespace.virgin.net/hugo.elias/models/m_perlin.htm</a>], the inverse of this 1/<code>Smoothness</code> is called &quot;Persistence&quot;.

<p>I decided to call it &quot;<code>Smoothness</code>&quot;, since this is the practical intuitive meaning.

<p>Value equal 1.0 means that <a class="normal" href="CastleTerrain.TTerrainNoise.html#Amplitude">amplitude</a> doesn't change at all, each noise <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> is visible the same, so in effect you will just see a lot of noise. And values &lt; 1.0 are really nonsense, they make more <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> noise even more visible, which means that the terrain is dominated by noise.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Amplitude"></a><code>property <b>Amplitude</b>: Single read FAmplitude write FAmplitude default 1.0;</code></td>
</tr>
<tr><td colspan="2">
<p>
<code>Amplitude</code> and <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">frequency</a> of the first noise octave. <code>Amplitude</code> scales the height of the result, and <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">Frequency</a> scales the size of the bumps. </p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Frequency"></a><code>property <b>Frequency</b>: Single read FFrequency write FFrequency default 1.0;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Interpolation"></a><code>property <b>Interpolation</b>: <a  href="CastleTerrain.html#TNoiseInterpolation">TNoiseInterpolation</a>
      read FInterpolation write SetInterpolation default niCosine;</code></td>
</tr>
<tr><td colspan="2">
<p>
How integer noise is interpolated to get smooth float noise.

<p>Setting this to niNone turns off <code>interpolation</code>, which means that your terrain is a sum of a couple of blocky noises &mdash; ugly.

<p>Using niLinear (means &quot;bilinear&quot;, since this is 2D case) is also usually bad. Unless you use <a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a> of really high frequencies, usually sharp edges / flat in-betweens will be visible.

<p>Using niCosine in right now the best.

<p>Using niSpline is even better looking (usese Catmull-Rom splines, which are special case of cubic Hermite spline, see <a  href="http://en.wikipedia.org/wiki/Cubic_Hermite_spline">http://en.wikipedia.org/wiki/Cubic_Hermite_spline</a>, <a  href="http://en.wikipedia.org/wiki/Bicubic_interpolation">http://en.wikipedia.org/wiki/Bicubic_interpolation</a>). But it's more time consuming under current implementation.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Blur"></a><code>property <b>Blur</b>: boolean read FBlur write SetBlur default false;</code></td>
</tr>
<tr><td colspan="2">
<p>
Resulting noise <a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a> may be blurred. This helps to remove the inherent vertical/horizontal directionality in our 2D noise (it also makes it more smooth, since that's what blurring is about; you may want to increase <a class="normal" href="CastleTerrain.TTerrainNoise.html#Frequency">Frequency</a> * 2 to balance this).

<p>This is independent from <a class="normal" href="CastleTerrain.TTerrainNoise.html#Interpolation">Interpolation</a>. Although the need for <code>Blur</code> is most obvious in poor/none <a class="normal" href="CastleTerrain.TTerrainNoise.html#Interpolation">interpolation</a> methods (none, linear), it also helps for the nicer <a class="normal" href="CastleTerrain.TTerrainNoise.html#Interpolation">interpolation</a> methods (cosine, cubic).

<p>Note about [<a  href="http://freespace.virgin.net/hugo.elias/models/m_perlin.htm">http://freespace.virgin.net/hugo.elias/models/m_perlin.htm</a>]: this &quot;blurring&quot; is called &quot;smoothing&quot; there. I call it blurring, as it seems more precise to me.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Seed"></a><code>property <b>Seed</b>: Cardinal read FSeed write FSeed default 0;</code></td>
</tr>
<tr><td colspan="2">
<p>
Determines the random seeds used when generating the terrain.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Heterogeneous"></a><code>property <b>Heterogeneous</b>: Single
      read FHeterogeneous write FHeterogeneous default 0.0;</code></td>
</tr>
<tr><td colspan="2">
<p>
If non-zero, then we generate terrain using <code>heterogeneous</code> fBm. Intuitively, the idea is that the terrain details (from higher <a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a>) are more noisy when ground is higher. This is realistic (debris gathers in lower terrain, smoothing it more).

<p>More precisely, this means that we accumulate multiplied previous noise, at each step dividing this accumulated result by <code>Heterogeneous</code>, and clamping at 1.0. So when <code>Heterogeneous</code> is very small, this always ends up 1.0, and we get normal (homogeneous) generation. When <code>Heterogeneous</code> is larger, the details (at lower ground) are scaled down (terrain is smoother).

<p>This is called &quot;threshold&quot; in Musgrave's dissertation (see algorithm in section 2.3.2.5 &quot;A Large Scale Terrain Model&quot;).</p>
</td></tr>
</table>
<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(["trackPageView"]);
  _paq.push(["enableLinkTracking"]);

  (function() {
    var u=(("https:" == document.location.protocol) ? "https" : "http") + "://michalis.ii.uni.wroc.pl/piwik-castle-engine/";
    _paq.push(["setTrackerUrl", u+"piwik.php"]);
    _paq.push(["setSiteId", "1"]);
    var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
    g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Piwik Code -->

<noscript>
<!-- Piwik Image Tracker -->
<img src="http://michalis.ii.uni.wroc.pl/piwik-castle-engine/piwik.php?idsite=1&amp;rec=1" style="border:0" alt="" />
<!-- End Piwik -->
</noscript>
<hr noshade size="1"><span class="appinfo"><em>Generated by <a  href="http://pasdoc.sourceforge.net/">PasDoc 0.13.0</a> on 2015-06-15 04:43:12</em>
</span>
</td></tr></table></body></html>