File: CastleFrustum.TFrustum.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 (337 lines) | stat: -rw-r--r-- 22,886 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
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
<!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: CastleFrustum: Object TFrustum</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="TFrustum"></a><h1 class="cio">Object TFrustum</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><a class="section" href="#PasDoc-Fields">Fields</a></td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a  href="CastleFrustum.html">CastleFrustum</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TFrustum = object(TObject)</code></p>
<h2 class="description">Description</h2>
<p>
Viewing frustum, defined as 6 plane equations. Calculating and operating on such frustum. Frustums with far plane in infinity (typically used in conjunction with shadow volumes) are fully supported by all methods (we just have 5 frustum planes then).

<p>We define this using ObjectPascal old-style &quot;object&quot;, to have comfort and low-overhead at the same time.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TFrustum</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Fields"></a><h3 class="summary">Fields</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><b><a  href="CastleFrustum.TFrustum.html#Planes">Planes</a></b>: array [<a  href="CastleFrustum.html#TFrustumPlane">TFrustumPlane</a>] of <a  href="CastleVectors.html#TVector4Single">TVector4Single</a>;</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><b><a  href="CastleFrustum.TFrustum.html#ZFarInfinity">ZFarInfinity</a></b>: boolean;</code></td>
</tr>
</table>
<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="CastleFrustum.TFrustum.html#Init">Init</a></b>(const Matrix: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</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>constructor <b><a  href="CastleFrustum.TFrustum.html#Init">Init</a></b>(const ProjectionMatrix, ModelviewMatrix: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</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>procedure <b><a  href="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a></b>(out FrustumPoints: <a  href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>); overload;</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>procedure <b><a  href="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a></b>(out FrustumPoints: <a  href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>); overload;</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>function <b><a  href="CastleFrustum.TFrustum.html#SphereCollisionPossible">SphereCollisionPossible</a></b>( const SphereCenter: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): <a  href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</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="CastleFrustum.TFrustum.html#SphereCollisionPossibleSimple">SphereCollisionPossibleSimple</a></b>( const SphereCenter: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): boolean;</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>function <b><a  href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">Box3DCollisionPossible</a></b>( const Box: <a  href="CastleBoxes.TBox3D.html">TBox3D</a>): <a  href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</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="CastleFrustum.TFrustum.html#Box3DCollisionPossibleSimple">Box3DCollisionPossibleSimple</a></b>( const Box: <a  href="CastleBoxes.TBox3D.html">TBox3D</a>): boolean;</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>function <b><a  href="CastleFrustum.TFrustum.html#Move">Move</a></b>(const M: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleFrustum.TFrustum.html">TFrustum</a>;</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>procedure <b><a  href="CastleFrustum.TFrustum.html#MoveTo1st">MoveTo1st</a></b>(const M: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>);</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>function <b><a  href="CastleFrustum.TFrustum.html#DirectionInside">DirectionInside</a></b>(const Direction: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): boolean;</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="CastleFrustum.TFrustum.html#Transform">Transform</a></b>(const M: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>): <a  href="CastleFrustum.TFrustum.html">TFrustum</a>;</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>function <b><a  href="CastleFrustum.TFrustum.html#ToNiceStr">ToNiceStr</a></b>(const Indent: string): string;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Fields</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="Planes"></a><code><b>Planes</b>: array [<a  href="CastleFrustum.html#TFrustumPlane">TFrustumPlane</a>] of <a  href="CastleVectors.html#TVector4Single">TVector4Single</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Six planes defining the frustum. Direction vectors of these planes must point to the inside of the frustum. Currently, they are always normalized.

<p>Note that if projection has far plane in infinity (indicated by <a class="normal" href="CastleFrustum.TFrustum.html#ZFarInfinity">ZFarInfinity</a>) then the far plane will be invalid &mdash; first three values of it's equation will be 0.</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="ZFarInfinity"></a><code><b>ZFarInfinity</b>: boolean;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<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="Init"></a><code>constructor <b>Init</b>(const Matrix: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate frustum, knowing the combined matrix (modelview * projection).</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="Init"></a><code>constructor <b>Init</b>(const ProjectionMatrix, ModelviewMatrix: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate frustum, knowing projection and modelview matrices. This is equivalent to 1-parameter Init with Matrix = ModelviewMatrix * <a class="normal" href="CastleGLUtils.html#ProjectionMatrix">ProjectionMatrix</a>. This way you can get from OpenGL your two matrices (modelview and projection) (or you can calculate them using routines in this unit like <a class="normal" href="CastleVectors.html#FrustumProjMatrix">FrustumProjMatrix</a>), then pass them to this routine and you get your current viewing frustum.</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="CalculatePoints"></a><code>procedure <b>CalculatePoints</b>(out FrustumPoints: <a  href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>); overload;</code></td>
</tr>
<tr><td colspan="2">
<p>
Calculate 8 points of frustum. These points are simply calculated doing <a class="normal" href="CastleVectors.html#ThreePlanesIntersectionPoint">ThreePlanesIntersectionPoint</a> on appropriate planes.

<p>Using these points you can easily draw given frustum on screen. Use <a class="normal" href="CastleFrustum.html#FrustumPointsQuadsIndexes">FrustumPointsQuadsIndexes</a> to obtain indexes to FrustumPoints. E.g. using OpenGL use code like this:

<p></p>

<pre class="longcode">
  glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(<span class="pascal_numeric">4</span>, GL_FLOAT / GL_DOUBLE, <span class="pascal_numeric">0</span>, @FrustumPoints);

    glDrawElements(GL_QUADS,
      SizeOf(FrustumPointsQuadsIndexes) <span class="pascal_keyword">div</span> SizeOf(LongWord),
      GL_UNSIGNED_INT, @FrustumPointsQuadsIndexes);
    <span class="pascal_comment">// or</span>
    glDrawElements(GL_LINES,
      SizeOf(FrustumPointsLinesIndexes) <span class="pascal_keyword">div</span> SizeOf(LongWord),
      GL_UNSIGNED_INT, @FrustumPointsLinesIndexes);

  glDisableClientState(GL_VERTEX_ARRAY);
</pre>

<p>

<p>This example rendering code will even work Ok with far plane in infinity. Then the 4 points of the far plane will be &quot;in infinity&quot;, that is will have 4th component set to zero. Or, equivalently, they will be directions. Homogeneous coordinates allow us for this, and in fact you can just render such points without any problems in OpenGL.

<p>For good precision, always use <a class="normal" href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>. Tests show that, while storing the plane equations with Single precision is sufficient, calculating FrustumPoints using Single precision is *not* sufficient.

<p>(Testcase that the Double precision is needed: run <code>view3dscene demo_models/vrml_2/cones.wrl</code>. Jump to viewpoint named &quot;Frustum needs double-precision&quot;. Turn &quot;Show viewing frustum&quot; on. When view3dscene.lpr uses Single precision with <a class="normal" href="CastleFrustum.TFrustum.html#CalculatePoints">CalculatePoints</a> (use <a class="normal" href="CastleFrustum.html#TFrustumPointsSingle">TFrustumPointsSingle</a>, and GL_FLOAT at glVertexPointer) the result is incorrect, near and far quads are visibly asymetrical.)

<p>

<p></p>
<h6 class="description_section">Exceptions raised</h6>
<dl class="exceptions_raised">
<dt><a class="normal" href="CastleVectors.EPlanesParallel.html">EPlanesParallel</a></dt>
<dd>If Frustum doesn't have planes of any valid frustum.</dd>
</dl>
</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="CalculatePoints"></a><code>procedure <b>CalculatePoints</b>(out FrustumPoints: <a  href="CastleFrustum.html#TFrustumPointsDouble">TFrustumPointsDouble</a>); overload;</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="SphereCollisionPossible"></a><code>function <b>SphereCollisionPossible</b>( const SphereCenter: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): <a  href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and sphere.

<p>Check is done fast, but is not accurate, that's why this function's name contains &quot;CollisionPossible&quot;. It returns:

<p>fcNoCollision when it's sure that there no collision,

<p>fcSomeCollisionPossible when some collision is possible, but nothing is sure. There *probably* is some collision, but it's not difficult to find some special situations where there is no collision but this function answers fcSomeCollisionPossible. There actually may be either no collision, or only part of sphere may be inside frustum.

<p>Note that it's guaranteed that if the whole sphere (or the whole box in case of <a class="normal" href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">Box3DCollisionPossible</a>) is inside the frustum that fcInsideFrustum will be returned, not fcSomeCollisionPossible.

<p>fcInsideFrustum if sphere is for sure inside the frustum.

<p>So this function usually cannot be used for some precise collision detection, but it can be used for e.g. optimizing your graphic engine by doing frustum culling. Note that fcInsideFrustum result is often useful when you're comparing your frustum with bounding volume of some tree (e.g. octree) node: fcInsideFrustum tells you that not only this node collides with frustum, but also all it's children nodes collide for sure with frustum. This allows you to save some time instead of doing useless recursion down the tree.

<p>Many useful optimization ideas used in implementing this function were found at [<a  href="http://www.flipcode.com/articles/article_frustumculling.shtml">http://www.flipcode.com/articles/article_frustumculling.shtml</a>].

<p></p>
<h6 class="description_section">See also</h6>
<dl class="see_also">
  <dt><a class="normal" href="CastleFrustum.TFrustum.html#Box3DCollisionPossible">TFrustum.Box3DCollisionPossible</a></dt>
  <dd>Checks for collision between frustum and box.</dd>
</dl>
</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="SphereCollisionPossibleSimple"></a><code>function <b>SphereCollisionPossibleSimple</b>( const SphereCenter: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; const SphereRadiusSqr: Single): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and sphere, faster. Like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a>, but this only returns true (when <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a> would return fcSomeCollisionPossible or fcInsideFrustum) or false (when <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">TFrustum.SphereCollisionPossible</a> would return fcNoCollision).

<p>Consequently, it runs (very slightly) faster. Use this if you don't need to differentiate between fcSomeCollisionPossible or fcInsideFrustum cases.</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="Box3DCollisionPossible"></a><code>function <b>Box3DCollisionPossible</b>( const Box: <a  href="CastleBoxes.TBox3D.html">TBox3D</a>): <a  href="CastleFrustum.html#TFrustumCollisionPossible">TFrustumCollisionPossible</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and box. Meaning of return value like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossible">SphereCollisionPossible</a>.</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="Box3DCollisionPossibleSimple"></a><code>function <b>Box3DCollisionPossibleSimple</b>( const Box: <a  href="CastleBoxes.TBox3D.html">TBox3D</a>): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Checks for collision between frustum and box, faster. Meaning of return value like <a class="normal" href="CastleFrustum.TFrustum.html#SphereCollisionPossibleSimple">SphereCollisionPossibleSimple</a>.</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="Move"></a><code>function <b>Move</b>(const M: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): <a  href="CastleFrustum.TFrustum.html">TFrustum</a>;</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="MoveTo1st"></a><code>procedure <b>MoveTo1st</b>(const M: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>);</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="DirectionInside"></a><code>function <b>DirectionInside</b>(const Direction: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>): boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
Is Direction within a frustum. You can think of direction it as a &quot;point infinitely away in given Direction&quot;, like the direction to the sun. Note that this ignores near/far planes of the frustum, only checking the 4 side planes.</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="Transform"></a><code>function <b>Transform</b>(const M: <a  href="CastleVectors.html#TMatrix4Single">TMatrix4Single</a>): <a  href="CastleFrustum.TFrustum.html">TFrustum</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Transform frustum by a matrix.

<p>

<p></p>
<h6 class="description_section">Parameters</h6>
<dl class="parameters">
<dt>M</dt>
<dd>Transformation matrix. This matrix must be &quot;sane&quot;: it must transform homogeneous positions into homogeneous positions, and homogeneous directions into homogeneous directions. Also, it must not invert or do other weird stuff (like shear) with directions. To be safe just make sure it's a matrix composed only from translations, rotations, and scale (with all scale parameters being &gt; 0).</dd>
</dl>
<h6 class="description_section">Exceptions raised</h6>
<dl class="exceptions_raised">
<dt><a class="normal" href="CastleVectors.ETransformedResultInvalid.html">ETransformedResultInvalid</a></dt>
<dd>In some cases when matrix is not sane.</dd>
</dl>
</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="ToNiceStr"></a><code>function <b>ToNiceStr</b>(const Indent: string): string;</code></td>
</tr>
<tr><td colspan="2">
&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:09</em>
</span>
</td></tr></table></body></html>