File: CastleSphereSampling.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 (185 lines) | stat: -rw-r--r-- 12,105 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
<!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: CastleSphereSampling</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">
<h1 class="unit">Unit CastleSphereSampling</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td>Classes, Interfaces, Objects and Records</td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
Random sampling of points (directions) on a sphere and hemisphere. Useful e.g. for ray-tracers.

<p>Most of the implementation based on &quot;Global Illumination Compendium&quot; IV.B [<a  href="http://www.cs.kuleuven.ac.be/~phil/GI/">http://www.cs.kuleuven.ac.be/&tilde;phil/GI/</a>]. See also images there, they help to illustrate the meaning of some functions here.

<p>We use two ways to represent points on hemisphere:

<p></p>

<ol class="paragraph_spacing">
  <li value="1"><p>Functions <i>without &quot;XYZ&quot; suffix</i> return vector of 2 floats = two angles, called phi and theta (in this order). Phi (in [0, 2*Pi]) is an angle from some chosen meridian. Theta (in [0, Pi/2] for hemisphere and [0, Pi] for sphere) is an angle from chosen vector pointing outward from the (hemi)sphere. See images in &quot;Global Illumination Compendium&quot;, they are probably much easier to understand than this definition.</p></li>
  <li value="2"><p>Functions <i>with &quot;XYZ&quot; suffix</i> return 3D point x, y, z.

<p></p>

<ul class="paragraph_spacing">
  <li><p>(0, 0, 0) is the center of (hemi)sphere,</p></li>
  <li><p>(0, 0, 1) is the chosen outward vector (i.e. Theta = 0 there),</p></li>
  <li><p>(1, 0, 0) is the direction where Phi = 0 and Theta = Pi/2,</p></li>
  <li><p>(0, 1, 0) is the direction where Phi = Pi/2 and Theta = Pi/2.</p></li>
</ul>

<p>

<p>This is matching conventions in &quot;Global Illumination Compendium&quot;, see there (point 21).</p></li>
</ol>

<p>

<p>Functions with Density &lt;&gt; Const return PdfValue for returned point, i.e. for density p(Theta) it's PfdValue = p(Result[1]). These functions try to calculate PdfValue smartly (often calculating PfdValue and calculating Result uses the same intermediate calculation, so we can save some computation). PdfValue is needed for importance sampling.</p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a  href="CastleVectors.html">CastleVectors</a></li><li><a  href="CastleUtils.html">CastleUtils</a></li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#PhiThetaToXYZ">PhiThetaToXYZ</a></b>(const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>; const SphereRadius: Single) :<a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; overload;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#PhiThetaToXYZ">PhiThetaToXYZ</a></b>(const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>; const SphereTheta0: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; overload;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#XYZToPhiTheta">XYZToPhiTheta</a></b>(const XYZ: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointConst">RandomHemispherePointConst</a></b>: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointConstXYZ">RandomHemispherePointConstXYZ</a></b>: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointCosTheta">RandomHemispherePointCosTheta</a></b>( out PdfValue: Single): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointCosThetaXYZ">RandomHemispherePointCosThetaXYZ</a></b>( out PdfValue: Single): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointCosThetaExp">RandomHemispherePointCosThetaExp</a></b>(const n: Single; out PdfValue: Single): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphereSampling.html#RandomHemispherePointCosThetaExpXYZ">RandomHemispherePointCosThetaExpXYZ</a></b>(const n: Single; out PdfValue: Single): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="PhiThetaToXYZ"></a><code>function <b>PhiThetaToXYZ</b>(const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>; const SphereRadius: Single) :<a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; overload;</code></td>
</tr>
<tr><td colspan="1">
<p>
Convert from PhiTheta representation of (hemi)sphere direction to XYZ representation.

<p>See the beginning of this unit's documentation, <a class="normal" href="CastleSphereSampling.html">CastleSphereSampling</a>, for more precise description of XYZ representation.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="PhiThetaToXYZ"></a><code>function <b>PhiThetaToXYZ</b>(const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>; const SphereTheta0: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; overload;</code></td>
</tr>
<tr><td colspan="1">
<p>
Convert from PhiTheta representation of (hemi)sphere direction to XYZ representation.

<p>This is the more advanced version where you can freely specify which vector is the &quot;main outside (hemi)sphere vector&quot;, SphereTheta0. Points with Theta = 0 are exactly on SphereTheta0. It is <i>undefined</i> where point like (Phi = 0, Theta = Pi/2) (or any other point with Theta &lt;&gt; 0) will be placed, i.e. it's not defined where's the &quot;chosen meridian&quot; for Phi = 0. However <i>it's defined that this meridian will be determined only by SphereTheta0</i>, and this is usually sufficient (since this makes sure that sampling and then converting to XYZ multiple points with the same SphereTheta0 will preserve sampled density).

<p>Note that the length of SphereTheta0 determines also the sphere radius.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="XYZToPhiTheta"></a><code>function <b>XYZToPhiTheta</b>(const XYZ: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Convert from XYZ representation of (hemi)sphere direction to PhiTheta.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointConst"></a><code>function <b>RandomHemispherePointConst</b>: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Random point (direction) on unit hemisphere, sampled with constant density (p(Theta) = 1/2*Pi). </p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointConstXYZ"></a><code>function <b>RandomHemispherePointConstXYZ</b>: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointCosTheta"></a><code>function <b>RandomHemispherePointCosTheta</b>( out PdfValue: Single): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Random point (direction) on unit hemisphere, sampled with density p(Theta) = cos(Theta)/Pi. </p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointCosThetaXYZ"></a><code>function <b>RandomHemispherePointCosThetaXYZ</b>( out PdfValue: Single): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointCosThetaExp"></a><code>function <b>RandomHemispherePointCosThetaExp</b>(const n: Single; out PdfValue: Single): <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Random point (direction) on unit hemisphere, sampled with density p(Theta) = (n+1) * (cos(Theta))&circ;n / 2*Pi. </p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="RandomHemispherePointCosThetaExpXYZ"></a><code>function <b>RandomHemispherePointCosThetaExpXYZ</b>(const n: Single; out PdfValue: Single): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</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>