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 "Global Illumination Compendium" IV.B [<a href="http://www.cs.kuleuven.ac.be/~phil/GI/">http://www.cs.kuleuven.ac.be/˜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 "XYZ" 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 "Global Illumination Compendium", they are probably much easier to understand than this definition.</p></li>
<li value="2"><p>Functions <i>with "XYZ" 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 "Global Illumination Compendium", see there (point 21).</p></li>
</ol>
<p>
<p>Functions with Density <> 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 "main outside (hemi)sphere vector", 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 <> 0) will be placed, i.e. it's not defined where's the "chosen meridian" 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">
</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">
</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))ˆ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">
</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>
|