File: Castle3D.T3DMoving.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 (208 lines) | stat: -rw-r--r-- 15,873 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
<!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: Castle3D: Class T3DMoving</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="T3DMoving"></a><h1 class="cio">Class T3DMoving</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="Castle3D.html">Castle3D</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type T3DMoving = class(<a class="normal" href="Castle3D.T3DCustomTransform.html">T3DCustomTransform</a>)</code></p>
<h2 class="description">Description</h2>
<p>
3D object moving and potentially pushing other 3D objects. Good for elevators, doors and such.

<p>Other 3D objects may be pushed, if <a class="normal" href="Castle3D.T3DMoving.html#Pushes">Pushes</a>. There are two methods of pushing available, see <a class="normal" href="Castle3D.T3DMoving.html#PushesEverythingInside">PushesEverythingInside</a>. Only the 3D objects with <a class="normal" href="Castle3D.T3D.html#CollidesWithMoving">T3D.CollidesWithMoving</a> are ever pushed by this object (the rest of 3D world is treated as static, does not interact with elevators / doors or such).

<p>You can also stop/reverse the move to prevent some collisions from occuring at all. This way you can e.g. prevent the door from automatically closing, if someone/something blocks the way. You do this by overriding <a class="normal" href="Castle3D.T3DMoving.html#BeforeTimeIncrease">BeforeTimeIncrease</a>. See TDoomLevelDoor.BeforeTimeIncrease in &quot;The Castle&quot; for example how to do this.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TComponent</li>
<li class="ancestor"><a class="normal" href="Castle3D.T3D.html">T3D</a></li>
<li class="ancestor"><a class="normal" href="Castle3D.T3DList.html">T3DList</a></li>
<li class="ancestor"><a class="normal" href="Castle3D.T3DCustomTransform.html">T3DCustomTransform</a></li>
<li class="thisitem">T3DMoving</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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>function <b><a  href="Castle3D.T3DMoving.html#GetTranslation">GetTranslation</a></b>: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>function <b><a  href="Castle3D.T3DMoving.html#OnlyTranslation">OnlyTranslation</a></b>: boolean; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>function <b><a  href="Castle3D.T3DMoving.html#GetTranslationFromTime">GetTranslationFromTime</a></b>(const AnAnimationTime: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a>): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; virtual; abstract;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>procedure <b><a  href="Castle3D.T3DMoving.html#BeforeTimeIncrease">BeforeTimeIncrease</a></b>(const NewAnimationTime: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a>); virtual;</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>constructor <b><a  href="Castle3D.T3DMoving.html#Create">Create</a></b>(AOwner: TComponent); override;</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="Castle3D.T3DMoving.html#Update">Update</a></b>(const SecondsPassed: Single; var RemoveMe: <a  href="Castle3D.html#TRemoveType">TRemoveType</a>); 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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>property <b><a  href="Castle3D.T3DMoving.html#AnimationTime">AnimationTime</a></b>: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a> read FAnimationTime;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="published.gif" alt="Published" title="Published"></a></td>
<td class="itemcode"><code>property <b><a  href="Castle3D.T3DMoving.html#Pushes">Pushes</a></b>: boolean read FPushes write FPushes default true;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="published.gif" alt="Published" title="Published"></a></td>
<td class="itemcode"><code>property <b><a  href="Castle3D.T3DMoving.html#PushesEverythingInside">PushesEverythingInside</a></b>: boolean
      read FPushesEverythingInside write FPushesEverythingInside default true;</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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="GetTranslation"></a><code>function <b>GetTranslation</b>: <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; override;</code></td>
</tr>
<tr><td colspan="2">
<p>
Implements T3D.GetTranslation by always calling <a class="normal" href="Castle3D.T3DMoving.html#GetTranslationFromTime">GetTranslationFromTime</a>(<a class="normal" href="Castle3D.T3DMoving.html#AnimationTime">AnimationTime</a>). Descendants should only override <a class="normal" href="Castle3D.T3DMoving.html#GetTranslationFromTime">GetTranslationFromTime</a>.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="OnlyTranslation"></a><code>function <b>OnlyTranslation</b>: boolean; override;</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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="GetTranslationFromTime"></a><code>function <b>GetTranslationFromTime</b>(const AnAnimationTime: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a>): <a  href="CastleVectors.html#TVector3Single">TVector3Single</a>; virtual; abstract;</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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="BeforeTimeIncrease"></a><code>procedure <b>BeforeTimeIncrease</b>(const NewAnimationTime: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a>); virtual;</code></td>
</tr>
<tr><td colspan="2">
<p>
Do something right before animation progresses. Called at the beginning of our <a class="normal" href="Castle3D.T3DMoving.html#Update">Update</a>, <i>right before</i> <a class="normal" href="Castle3D.T3DMoving.html#AnimationTime">AnimationTime</a> changes to NewAnimationTime.

<p>Useful for taking care of collision detection issues, as our assumption always is that &quot;nothing collides&quot;. Which means that if you don't want your <a class="normal" href="Castle3D.T3DMoving.html">T3DMoving</a> to collide with e.g. player or creatures or items, then you should prevent the collision <i>before it happens</i>. This is the place to do it.</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="Create"></a><code>constructor <b>Create</b>(AOwner: TComponent); override;</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="Update"></a><code>procedure <b>Update</b>(const SecondsPassed: Single; var RemoveMe: <a  href="Castle3D.html#TRemoveType">TRemoveType</a>); override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</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="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="AnimationTime"></a><code>property <b>AnimationTime</b>: <a  href="CastleTimeUtils.html#TFloatTime">TFloatTime</a> read FAnimationTime;</code></td>
</tr>
<tr><td colspan="2">
<p>
Local object time, always increasing, used to track animations.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="published.gif" alt="Published" title="Published"></a></td>
<td class="itemcode"><a name="Pushes"></a><code>property <b>Pushes</b>: boolean read FPushes write FPushes default true;</code></td>
</tr>
<tr><td colspan="2">
<p>
Are other 3D objects pushed when this object moves. Only the 3D objects with <a class="normal" href="Castle3D.T3D.html#CollidesWithMoving">T3D.CollidesWithMoving</a> are ever pushed by this object (the rest of 3D world is treated as static, does not interact with elevators / doors or such).

<p>Only relevant if <a class="normal" href="Castle3D.T3D.html#GetCollides">GetCollides</a>. Non-colliding objects never push others.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="published.gif" alt="Published" title="Published"></a></td>
<td class="itemcode"><a name="PushesEverythingInside"></a><code>property <b>PushesEverythingInside</b>: boolean
      read FPushesEverythingInside write FPushesEverythingInside default true;</code></td>
</tr>
<tr><td colspan="2">
<p>
If <a class="normal" href="Castle3D.T3DMoving.html#Pushes">Pushes</a> is <code>True</code>, this determines how pushing actually works. There two methods:

<p></p>

<ol class="paragraph_spacing">
  <li value="1"><p><code>PushesEverythingInside</code> = <code>True</code>: We move every 3D object that is inside our bounding box and has <a class="normal" href="Castle3D.T3D.html#CollidesWithMoving">CollidesWithMoving</a>=<code>True</code>. This is sensible if we can reasonably assume that things inside our box are standing. For example if this is a (vertical or horizontal) elevator, then creatures/items are usually standing/lying inside, and naturally move with the same speed (and direction) as the elevator.</p></li>
  <li value="2"><p>When <code>PushesEverythingInside</code> = <code>False</code>: We check precise collision between 3D objects with <a class="normal" href="Castle3D.T3D.html#CollidesWithMoving">CollidesWithMoving</a>=<code>True</code> and our triangle mesh. Actually, we use <a class="normal" href="Castle3D.T3DList.html#BoxCollision">T3DList.BoxCollision</a> / T3DList.SphereCollsion, that will use children's <a class="normal" href="Castle3D.T3D.html#BoxCollision">T3D.BoxCollision</a> / T3D.SphereCollsion; they check collisions with triangle mesh in case of <a class="normal" href="CastleScene.TCastleScene.html">TCastleScene</a> with Spatial containing e.g. ssDynamicCollisions.</p></li>
</ol>

<p>

<p>Neither method is really perfect.

<p><code>PushesEverythingInside</code> = <code>False</code> seems like a more precise check, as it actually compares the triangle mesh, taking into account the interior of (this) moving 3D object. <code>PushesEverythingInside</code> = <code>True</code> just approximates the moving 3D object by it's bounding box.

<p>On the other hand, <code>PushesEverythingInside</code> = <code>True</code> makes the elevator more &quot;sticky&quot;. With <code>PushesEverythingInside</code> = <code>False</code>, when player hits the floor, it takes them some time to raise up. This creates a &quot;bouncing camera&quot; effect when the elevator goes up quickly: player constantly falls to the ground, tries to get up, but elevator moves up and player falls to it's ground again. When the elevator goes down, the player/creature constantly falls down on it because of gravity, which again causes artifacts as gravity may work significantly slower/faster than elavator moving speed. When the elevator is a horizontal moving platform, it will &quot;slip&quot; from under the player/creature, leaving the poor fella suddenly hanging in the air, and falling down because of gravity in the next second.

<p>In practice: <code>PushesEverythingInside</code> should be <code>True</code> for small containers, when you can reasonably assume that things (creatures, player, items) stand inside, and when you intend to use it for transport of 3D stuff. For very large moving stuff, that possibly interacts with flying players/creatures in some creative way, <code>PushesEverythingInside</code> may be <code>False</code>.</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&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:08</em>
</span>
</td></tr></table></body></html>