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 "The Castle" 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">
</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">
</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 "nothing collides". 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">
</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">
</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 "sticky". With <code>PushesEverythingInside</code> = <code>False</code>, when player hits the floor, it takes them some time to raise up. This creates a "bouncing camera" 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 "slip" 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&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>
|