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>"Synthesized noise" means it's not simply something random. We take the noise (integer noise, i.e. hash), smooth it (how well, and how fast — 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 ("<a class="normal" href="CastleTerrain.TTerrainNoise.html#Octaves">octaves</a>") 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">
</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">
</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 ˜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 <=> 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, "H", spectral exponent (see e.g. Blender sources, Musgrave's dissertation). Do not confuse this with "lacunarity" (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 "Persistence".
<p>I decided to call it "<code>Smoothness</code>", 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 < 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">
</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 — ugly.
<p>Using niLinear (means "bilinear", 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 "blurring" is called "smoothing" 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 "threshold" in Musgrave's dissertation (see algorithm in section 2.3.2.5 "A Large Scale Terrain Model").</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&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>
|