-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhow_it_works.html
More file actions
255 lines (234 loc) · 14.8 KB
/
how_it_works.html
File metadata and controls
255 lines (234 loc) · 14.8 KB
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
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>4. How it works — Raysect Documentation</title>
<link rel="stylesheet" href="_static/theme.css" type="text/css" />
<link rel="shortcut icon" href="_static/RaysectLogo_web.ico"/>
<script src="_static/documentation_options.js?v=39bb1c6d"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="5. Quickstart Guide" href="quickstart_guide.html" />
<link rel="prev" title="3. Downloading and Installation" href="installation.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Raysect
<img src="_static/RaysectLogo_web.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="introduction.html">1. Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">2. License</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation.html">3. Downloading and Installation</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">4. How it works</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#what-is-a-ray-tracer">4.1. What is a ray tracer?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#key-concepts">4.2. Key Concepts</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#rays">4.2.1. Rays</a></li>
<li class="toctree-l3"><a class="reference internal" href="#observers">4.2.2. Observers</a></li>
<li class="toctree-l3"><a class="reference internal" href="#primitives">4.2.3. Primitives</a></li>
<li class="toctree-l3"><a class="reference internal" href="#scene-graph">4.2.4. Scene-graph</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#process-of-raytracing">4.3. Process of raytracing</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="quickstart_guide.html">5. Quickstart Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="observers.html">6. Sampling and Observers</a></li>
<li class="toctree-l1"><a class="reference internal" href="primitives.html">7. Primitives</a></li>
<li class="toctree-l1"><a class="reference internal" href="materials.html">8. Materials</a></li>
<li class="toctree-l1"><a class="reference internal" href="conventions.html">9. Conventions</a></li>
<li class="toctree-l1"><a class="reference internal" href="references.html">10. References</a></li>
<li class="toctree-l1"><a class="reference internal" href="glossary.html">11. Glossary</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Demonstrations</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="demonstrations/demonstrations.html">1. Core Functionality</a></li>
<li class="toctree-l1"><a class="reference internal" href="demonstrations/demonstrations.html#materials">2. Materials</a></li>
<li class="toctree-l1"><a class="reference internal" href="demonstrations/demonstrations.html#observers">3. Observers</a></li>
<li class="toctree-l1"><a class="reference internal" href="demonstrations/demonstrations.html#optics">4. Optics</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="api_reference/core/core.html">1. Raysect Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="api_reference/primitives/primitives.html">2. Primitives Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="api_reference/optical/optical.html">3. Optical Module</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Raysect</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active"><span class="section-number">4. </span>How it works</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/how_it_works.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="how-it-works">
<h1><span class="section-number">4. </span>How it works<a class="headerlink" href="#how-it-works" title="Link to this heading">¶</a></h1>
<section id="what-is-a-ray-tracer">
<h2><span class="section-number">4.1. </span>What is a ray tracer?<a class="headerlink" href="#what-is-a-ray-tracer" title="Link to this heading">¶</a></h2>
<p>An algorithm for simulating light propogation, light is modelled as a bundle of rays
that travel through a scene. The paths of the rays follow a straight line unless
they interact with objects in the scene. As rays interact with materials, their
contribution to the emission is added/subtracted from the ray. A wide variety of
optical interactions can be simulated such as reflection and refraction, scattering,
and dispersion.</p>
<p>Same example scientific applications:</p>
<ul class="simple">
<li><p>Design of lenses and optical systems, such as cameras, microscopes and telescopes.
Image-forming properties of a system to be modeled.</p></li>
<li><p>Simulating optical diagnostics of plasmas through forward modelling, diagnostic
design optimisation.</p></li>
</ul>
<p>Ray-tracing is typically very computationally expensive and is best suited for
applications that don’t require real-time calculation.</p>
</section>
<section id="key-concepts">
<h2><span class="section-number">4.2. </span>Key Concepts<a class="headerlink" href="#key-concepts" title="Link to this heading">¶</a></h2>
<section id="rays">
<h3><span class="section-number">4.2.1. </span>Rays<a class="headerlink" href="#rays" title="Link to this heading">¶</a></h3>
<p>Represent a ray of light</p>
<ul class="simple">
<li><p>defines a line with an origin and direction</p></li>
<li><p>wavelength range and number of spectral samples, centre of range used for refraction calculations</p></li>
</ul>
<p>Ray objects must implement a tracing algorithm</p>
<ul class="simple">
<li><p>spectrum = ray.trace(world)</p></li>
<li><p>causes the ray to start sampling the world</p></li>
<li><p>returns a Spectrum object</p></li>
<li><p>samples of spectral radiance: W/m 2 /str/nm</p></li>
</ul>
</section>
<section id="observers">
<h3><span class="section-number">4.2.2. </span>Observers<a class="headerlink" href="#observers" title="Link to this heading">¶</a></h3>
<p>Represents objects that measure light, e.g. CCDs, cameras, photo diodes, eyes. Observers launch rays and accumulate
samples of the scene, which is more convenient than tracing individual rays manually.</p>
<ul class="simple">
<li><p>can be placed in the world and moved around</p></li>
<li><p>observe() method triggers ray-tracing, i.e camera.observe()</p></li>
</ul>
</section>
<section id="primitives">
<h3><span class="section-number">4.2.3. </span>Primitives<a class="headerlink" href="#primitives" title="Link to this heading">¶</a></h3>
<p>Scenes in Raysect consist of primitives, which are the basic objects making up the scene. These are objects that rays
can interact with, e.g light sources, lenses, mirrors, diffuse surfaces. Types of primitives:</p>
<ul class="simple">
<li><p>Mathematically defined surfaces and solids (i.e. sphere, box, cylinder, cone, parabola, torus).</p></li>
<li><p>Constructive Solid Geometry Operators (union, intersect, subtract).</p></li>
<li><p>Tri-poly meshes optimised for millions of polygons, support instancing. Importers for STL and OBJ.</p></li>
</ul>
<p>Primitive surfaces and volumes can be assigned materials, e.g. glass, metal, emitter properties.</p>
</section>
<section id="scene-graph">
<h3><span class="section-number">4.2.4. </span>Scene-graph<a class="headerlink" href="#scene-graph" title="Link to this heading">¶</a></h3>
<p>Primitives and Observers are typically defined in their own local coordinate system but need to be placed into the
“world”. There needs to be a system to keep track of the locations/co-ordinate transforms of all objects in the scene.</p>
<p>The Scene-graph is a tree structure consisting of nodes, which can be both primitives and observers. Each node has an
associated coordinate space and is translated/rotated relative to it’s parent node. I.e. a car node may have four
wheel nodes as children. Operations applied to a parent are automatically propogated down to all children. The resulting
data structure describes the spatial arrangement of primitives throughout a scene.</p>
<p>The World is the root node of the scene-graph - all primitives and observers must be attached to World. When adding
nodes to the world, nodes are always parented to another node (e.g. World) and given a transform (e.g. a translation
and/or rotation) relative to their parent. Allows us to build hierarchies of objects and manipulate the whole group with
one transform.</p>
</section>
</section>
<section id="process-of-raytracing">
<h2><span class="section-number">4.3. </span>Process of raytracing<a class="headerlink" href="#process-of-raytracing" title="Link to this heading">¶</a></h2>
<p>We desire the intensity/spectrum of light reaching an observer e.g. camera pixel.
Our strategy is to sample light (radiance) along paths reaching observer and
accumulate many samples to obtain intensity. Raysect uses a “Path tracing” algorithm
where we trace a ray from the observer through all material interactions until it
reaches a light source. Finally, we propagate the resulting spectrum from the light
source back through all material/volume interactions.</p>
<p>Ray-tracing is a recursive process in nature. For example, a ray hitting a diffuse surface will
need to know about light reflected from other sources in the scene. To get this emission we
re-evaluate the ray-tracing algorithm by generating a bundle of rays at this surface.
This process can repeat many times leading to a very high level of recursion.</p>
<p>Ray-tracing is bi-directional, the algorithm can be run in both the forward and reverse
directions. In forward ray-tracing, light is traced from the light sources through material
interactions to the observer. In backward ray-tracing, light starts at the observer and ray
paths are followed through to the sources of emission. Raysect traces light in the reverse
direction because this is generally more computationally efficient. The majority of light
rays fired from a light source won’t reach the observer resulting in wasted computation.</p>
<figure class="align-default" id="id1">
<img alt="_images/ray-tracing_directions.png" src="_images/ray-tracing_directions.png" />
<figcaption>
<p><span class="caption-text"><strong>Caption:</strong> Ray-tracing algorithms are generally bi-directional and can be evaluated in both the
forward and reverse directions. ray-tracing is naturally recursive. (Image credit: Carr, M.,
Meakins, A., et. al. (2017))</span><a class="headerlink" href="#id1" title="Link to this image">¶</a></p>
</figcaption>
</figure>
<p>During ray propogation, rays are tested for intersection with objects in the scene. Once
the nearest object has been identified, the material properties of the object are inspected
to determine the next step of the algorithm. Materials can alter the path of ray propagation
and alter the ray’s spectra through absorption and reflection curves. Some materials will
require more rays to be launched to return an accurate spectra.</p>
<figure class="align-default" id="id2">
<img alt="_images/calculate_emission.png" src="_images/calculate_emission.png" />
<figcaption>
<p><span class="caption-text"><strong>Caption:</strong> In the first stage of path tracing, a single ray path is generated. This path may be
represented by a number of smaller straight path segments that represent a ray’s interactions
with surfaces and light sources in the scene. Once the termination criteria has been met
(absorbing surface or recursion limit, etc) the emission is evaluated along the segment stack
in the forward direction. This ensures materials along the path can correctly add their emission
or absorption. To estimate a light arriving at the observer, many of these paths will be measured
and combined in a weighted average. (Image credit: Carr, M., Meakins, A., et. al. (2017))</span><a class="headerlink" href="#id2" title="Link to this image">¶</a></p>
</figcaption>
</figure>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="installation.html" class="btn btn-neutral float-left" title="3. Downloading and Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="quickstart_guide.html" class="btn btn-neutral float-right" title="5. Quickstart Guide" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 2014-2025, Dr Alex Meakins.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>