annotate steer.d @ 4:8d7c50415269

changed Hz
author Zzzzrrr <mason.green@gmail.com>
date Fri, 20 Mar 2009 17:00:30 -0400
parents a40d066ebbd1
children 5b61327b5a7c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
1 // ----------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
2 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
3 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
4 // OpenSteer -- Steering Behaviors for Autonomous Characters
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
5 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
6 // Copyright (c) 2002-2003, Sony Computer Entertainment America
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
7 // Original author: Craig Reynolds <craig_reynolds@playstation.sony.com>
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
8 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
9 // Permission is hereby granted, free of charge, to any person obtaining a
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
10 // copy of this software and associated documentation files (the "Software"),
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
11 // to deal in the Software without restriction, including without limitation
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
12 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
13 // and/or sell copies of the Software, and to permit persons to whom the
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
14 // Software is furnished to do so, subject to the following conditions:
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
15 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
16 // The above copyright notice and this permission notice shall be included in
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
17 // all copies or substantial portions of the Software.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
18 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
22 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
24 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
25 // DEALINGS IN THE SOFTWARE.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
26 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
27 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
28 // ----------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
29 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
30 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
31 // SteerLibraryMixin
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
32 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
33 // This mixin (class with templated superclass) adds the "steering library"
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
34 // functionality to a given base class. SteerLibraryMixin assumes its base
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
35 // class supports the Ship interface.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
36 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
37 // 10-04-04 bk: put everything into the OpenSteer namespace
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
38 // 02-06-03 cwr: create mixin (from "SteerMass")
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
39 // 06-03-02 cwr: removed TS dependencies
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
40 // 11-21-01 cwr: created
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
41 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
42 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
43 // ----------------------------------------------------------------------------
2
a40d066ebbd1 implemented zoom
Zzzzrrr <mason.green@gmail.com>
parents: 0
diff changeset
44 module openmelee.steer;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
45
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
46 class Steer
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
47 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
48 // Constructor: initializes state
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
49 this ()
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
50 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
51 // set inital state
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
52 reset ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
53 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
54
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
55 // reset state
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
56 void reset (void)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
57 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
58 // initial state of wander behavior
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
59 wanderSide = 0;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
60 wanderUp = 0;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
61
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
62 // default to non-gaudyPursuitAnnotation
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
63 gaudyPursuitAnnotation = false;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
64 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
65
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
66 // -------------------------------------------------- steering behaviors
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
67
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
68 // Wander behavior
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
69 float wanderSide;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
70 float wanderUp;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
71
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
72 bzVec2 steerForWander (float dt) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
73 // random walk wanderSide and wanderUp between -1 and +1
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
74 float speed = 12 * dt; // maybe this (12) should be an argument?
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
75 wanderSide = scalarRandomWalk (wanderSide, speed, -1, +1);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
76 wanderUp = scalarRandomWalk (wanderUp, speed, -1, +1);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
77
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
78 // return a pure lateral steering vector: (+/-Side) + (+/-Up)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
79 return (side() * wanderSide) + (up() * wanderUp);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
80 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
81
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
82 // Seek behavior
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
83 bzVec2 steerForSeek (bzVec2 target) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
84 bzVec2 desiredVelocity = target - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
85 return desiredVelocity - velocity;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
86 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
87
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
88 // Flee behavior
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
89 bzVec2 steerForFlee (bzVec2 target) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
90 bzVec2 desiredVelocity = position - target;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
91 return desiredVelocity - velocity();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
92 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
93
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
94 // xxx proposed, experimental new seek/flee [cwr 9-16-02]
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
95 bzVec2 xxxsteerForFlee (bzVec2 target) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
96 bzVec2 offset = position - target;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
97 bzVec2 desiredVelocity = offset.truncateLength (maxSpeed ());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
98 return desiredVelocity - velocity();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
99 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
100
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
101 bzVec2 xxxsteerForSeek (bzVec2 target) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
102 // bzVec2 offset = target - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
103 bzVec2 offset = target - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
104 bzVec2 desiredVelocity = offset.truncateLength (maxSpeed ()); //xxxnew
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
105 return desiredVelocity - velocity();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
106 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
107
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
108 // ------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
109 // Obstacle Avoidance behavior
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
110 //
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
111 // Returns a steering force to avoid a given obstacle. The purely
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
112 // lateral steering force will turn our vehicle towards a silhouette edge
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
113 // of the obstacle. Avoidance is required when (1) the obstacle
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
114 // intersects the vehicle's current path, (2) it is in front of the
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
115 // vehicle, and (3) is within minTimeToCollision seconds of travel at the
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
116 // vehicle's current velocity. Returns a zero vector value (bzVec2::zero)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
117 // when no avoidance is required.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
118 bzVec2 steerToAvoidObstacle (float minTimeToCollision, Obstacle obstacle) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
119
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
120 bzVec2 avoidance = obstacle.steerToAvoid (this, minTimeToCollision);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
121 // XXX more annotation modularity problems (assumes spherical obstacle)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
122 if (avoidance != bzVec2::zero)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
123 annotateAvoidObstacle (minTimeToCollision * speed());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
124
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
125 return avoidance;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
126 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
127
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
128 // avoids all obstacles in an ObstacleGroup
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
129
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
130 bzVec2 steerToAvoidObstacles (float minTimeToCollision,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
131 ObstacleGroup obstacles) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
132
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
133 bzVec2 avoidance;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
134 PathIntersection nearest, next;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
135 float minDistanceToCollision = minTimeToCollision * speed();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
136
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
137 next.intersect = false;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
138 nearest.intersect = false;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
139
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
140 // test all obstacles for intersection with my forward axis,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
141 // select the one whose point of intersection is nearest
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
142 for (ObstacleIterator o = obstacles.begin(); o != obstacles.end(); o++)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
143 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
144 // xxx this should be a generic call on Obstacle, rather than
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
145 // xxx this code which presumes the obstacle is spherical
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
146 findNextIntersectionWithSphere ((SphericalObstacle)**o, next);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
147
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
148 if ((nearest.intersect == false) ||
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
149 ((next.intersect != false)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
150 (next.distance < nearest.distance)))
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
151 nearest = next;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
152 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
153
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
154 // when a nearest intersection was found
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
155 if ((nearest.intersect != false)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
156 (nearest.distance < minDistanceToCollision))
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
157 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
158 // show the corridor that was checked for collisions
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
159 annotateAvoidObstacle (minDistanceToCollision);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
160
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
161 // compute avoidance steering force: take offset from obstacle to me,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
162 // take the component of that which is lateral (perpendicular to my
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
163 // forward direction), set length to maxForce, add a bit of forward
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
164 // component (in capture the flag, we never want to slow down)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
165 bzVec2 offset = position - nearest.obstacle.center;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
166 avoidance = offset.perpendicularComponent (forward());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
167 avoidance = avoidance.normalize ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
168 avoidance *= maxForce ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
169 avoidance += forward() * maxForce () * 0.75;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
170 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
171
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
172 return avoidance;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
173 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
174
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
175 // ------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
176 // Unaligned collision avoidance behavior: avoid colliding with other
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
177 // nearby vehicles moving in unconstrained directions. Determine which
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
178 // (if any) other other vehicle we would collide with first, then steers
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
179 // to avoid the site of that potential collision. Returns a steering
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
180 // force vector, which is zero length if there is no impending collision.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
181
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
182 bzVec2 steerToAvoidNeighbors (float minTimeToCollision, AVGroup others) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
183
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
184 // first priority is to prevent immediate interpenetration
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
185 bzVec2 separation = steerToAvoidCloseNeighbors (0, others);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
186 if (separation != bzVec2::zero) return separation;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
187
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
188 // otherwise, go on to consider potential future collisions
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
189 float steer = 0;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
190 Ship* threat = NULL;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
191
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
192 // Time (in seconds) until the most immediate collision threat found
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
193 // so far. Initial value is a threshold: don't look more than this
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
194 // many frames into the future.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
195 float minTime = minTimeToCollision;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
196
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
197 // xxx solely for annotation
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
198 bzVec2 xxxThreatPositionAtNearestApproach;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
199 bzVec2 xxxOurPositionAtNearestApproach;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
200
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
201 // for each of the other vehicles, determine which (if any)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
202 // pose the most immediate threat of collision.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
203 for (AVIterator i = others.begin(); i != others.end(); i++)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
204 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
205 Ship other = **i;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
206 if (other != this)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
207 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
208 // avoid when future positions are this close (or less)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
209 float collisionDangerThreshold = radius() * 2;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
210
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
211 // predicted time until nearest approach of "this" and "other"
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
212 float time = predictNearestApproachTime (other);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
213
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
214 // If the time is in the future, sooner than any other
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
215 // threatened collision...
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
216 if ((time >= 0) (time < minTime))
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
217 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
218 // if the two will be close enough to collide,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
219 // make a note of it
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
220 if (computeNearestApproachPositions (other, time)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
221 < collisionDangerThreshold)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
222 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
223 minTime = time;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
224 threat = other;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
225 xxxThreatPositionAtNearestApproach
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
226 = hisPositionAtNearestApproach;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
227 xxxOurPositionAtNearestApproach
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
228 = ourPositionAtNearestApproach;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
229 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
230 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
231 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
232 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
233
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
234 // if a potential collision was found, compute steering to avoid
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
235 if (threat)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
236 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
237 // parallel: +1, perpendicular: 0, anti-parallel: -1
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
238 float parallelness = forward.dot(threat.forward);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
239 float angle = 0.707f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
240
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
241 if (parallelness < -angle)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
242 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
243 // anti-parallel "head on" paths:
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
244 // steer away from future threat position
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
245 bzVec2 offset = xxxThreatPositionAtNearestApproach - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
246 float sideDot = offset.dot(side());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
247 steer = (sideDot > 0) ? -1.0f : 1.0f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
248 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
249 else
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
250 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
251 if (parallelness > angle)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
252 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
253 // parallel paths: steer away from threat
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
254 bzVec2 offset = threat.position - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
255 float sideDot = offset.dot(side());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
256 steer = (sideDot > 0) ? -1.0f : 1.0f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
257 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
258 else
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
259 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
260 // perpendicular paths: steer behind threat
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
261 // (only the slower of the two does this)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
262 if (threat.speed() <= speed())
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
263 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
264 float sideDot = side().dot(threat.velocity);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
265 steer = (sideDot > 0) ? -1.0f : 1.0f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
266 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
267 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
268 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
269 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
270
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
271 return side() * steer;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
272 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
273
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
274 // Given two vehicles, based on their current positions and velocities,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
275 // determine the time until nearest approach
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
276 float predictNearestApproachTime (Ship other) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
277
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
278 // imagine we are at the origin with no velocity,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
279 // compute the relative velocity of the other vehicle
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
280 bzVec2 myVelocity = velocity;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
281 bzVec2 otherVelocity = other.velocity;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
282 bzVec2 relVelocity = otherVelocity - myVelocity;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
283 float relSpeed = relVelocity.length;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
284
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
285 // for parallel paths, the vehicles will always be at the same distance,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
286 // so return 0 (aka "now") since "there is no time like the present"
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
287 if (relSpeed == 0) return 0;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
288
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
289 // Now consider the path of the other vehicle in this relative
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
290 // space, a line defined by the relative position and velocity.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
291 // The distance from the origin (our vehicle) to that line is
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
292 // the nearest approach.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
293
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
294 // Take the unit tangent along the other vehicle's path
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
295 bzVec2 relTangent = relVelocity / relSpeed;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
296
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
297 // find distance from its path to origin (compute offset from
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
298 // other to us, find length of projection onto path)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
299 bzVec2 relPosition = position - other.position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
300 float projection = relTangent.dot(relPosition);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
301
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
302 return projection / relSpeed;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
303 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
304
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
305 // Given the time until nearest approach (predictNearestApproachTime)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
306 // determine position of each vehicle at that time, and the distance
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
307 // between them
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
308 float computeNearestApproachPositions (Ship other, float time) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
309
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
310 bzVec2 myTravel = forward * speed * time;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
311 bzVec2 otherTravel = other.forward * other.speed * time;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
312
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
313 bzVec2 myFinal = position + myTravel;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
314 bzVec2 otherFinal = other.position + otherTravel;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
315
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
316 // xxx for annotation
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
317 ourPositionAtNearestApproach = myFinal;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
318 hisPositionAtNearestApproach = otherFinal;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
319
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
320 return bzVec2::distance (myFinal, otherFinal);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
321 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
322
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
323 // otherwise return zero
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
324 return bzVec2::zero;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
325 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
326
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
327 // ------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
328 // pursuit of another vehicle ( version with ceiling on prediction time)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
329
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
330 bzVec2 steerForPursuit (Ship quarry) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
331 return steerForPursuit (quarry, FLT_MAX);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
332 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
333
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
334 bzVec2 steerForPursuit (Ship quarry, float maxPredictionTime) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
335
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
336 // offset from this to quarry, that distance, unit vector toward quarry
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
337 bzVec2 offset = quarry.position - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
338 float distance = offset.length ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
339 bzVec2 unitOffset = offset / distance;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
340
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
341 // how parallel are the paths of "this" and the quarry
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
342 // (1 means parallel, 0 is pependicular, -1 is anti-parallel)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
343 float parallelness = forward.dot(quarry.forward());
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
344
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
345 // how "forward" is the direction to the quarry
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
346 // (1 means dead ahead, 0 is directly to the side, -1 is straight back)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
347 float forwardness = forward.dot(unitOffset);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
348
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
349 float directTravelTime = distance / speed;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
350 int f = intervalComparison (forwardness, -0.707f, 0.707f);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
351 int p = intervalComparison (parallelness, -0.707f, 0.707f);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
352
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
353 float timeFactor = 0; // to be filled in below
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
354 bzVec2 color; // to be filled in below (xxx just for debugging)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
355
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
356 // Break the pursuit into nine cases, the cross product of the
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
357 // quarry being [ahead, aside, or behind] us and heading
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
358 // [parallel, perpendicular, or anti-parallel] to us.
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
359 switch (f)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
360 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
361 case +1:
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
362 switch (p)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
363 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
364 case +1: // ahead, parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
365 timeFactor = 4;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
366 color = gBlack;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
367 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
368 case 0: // ahead, perpendicular
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
369 timeFactor = 1.8f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
370 color = gGray50;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
371 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
372 case -1: // ahead, anti-parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
373 timeFactor = 0.85f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
374 color = gWhite;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
375 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
376 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
377 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
378 case 0:
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
379 switch (p)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
380 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
381 case +1: // aside, parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
382 timeFactor = 1;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
383 color = gRed;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
384 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
385 case 0: // aside, perpendicular
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
386 timeFactor = 0.8f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
387 color = gYellow;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
388 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
389 case -1: // aside, anti-parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
390 timeFactor = 4;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
391 color = gGreen;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
392 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
393 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
394 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
395 case -1:
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
396 switch (p)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
397 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
398 case +1: // behind, parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
399 timeFactor = 0.5f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
400 color= gCyan;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
401 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
402 case 0: // behind, perpendicular
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
403 timeFactor = 2;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
404 color= gBlue;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
405 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
406 case -1: // behind, anti-parallel
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
407 timeFactor = 2;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
408 color = gMagenta;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
409 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
410 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
411 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
412 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
413
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
414 // estimated time until intercept of quarry
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
415 float et = directTravelTime * timeFactor;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
416
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
417 // xxx experiment, if kept, this limit should be an argument
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
418 float etl = (et > maxPredictionTime) ? maxPredictionTime : et;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
419
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
420 // estimated position of quarry at intercept
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
421 bzVec2 target = quarry.predictFuturePosition (etl);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
422
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
423 // annotation
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
424 annotationLine (position,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
425 target,
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
426 gaudyPursuitAnnotation ? color : gGray40);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
427
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
428 return steerForSeek (target);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
429 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
430
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
431 // ------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
432 // evasion of another vehicle
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
433 bzVec2 steerForEvasion (Ship menace, float maxPredictionTime) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
434
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
435 // offset from this to menace, that distance, unit vector toward menace
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
436 bzVec2 offset = menace.position - position;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
437 float distance = offset.length;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
438
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
439 float roughTime = distance / menace.speed;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
440 float predictionTime = ((roughTime > maxPredictionTime) ? maxPredictionTime : roughTime);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
441 bzVec2 target = menace.predictFuturePosition (predictionTime);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
442
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
443 return steerForFlee (target);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
444 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
445
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
446
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
447 // ------------------------------------------------------------------------
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
448 // tries to maintain a given speed, returns a maxForce-clipped steering
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
449 // force along the forward/backward axis
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
450 bzVec2 steerForTargetSpeed (float targetSpeed) {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
451 float mf = maxForce();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
452 float speedError = targetSpeed - speed ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
453 return forward () * clip (speedError, -mf, +mf);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
454 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
455
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
456
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
457 // ----------------------------------------------------------- utilities
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
458 bool isAhead (bzVec2 target) {return isAhead (target, 0.707f);};
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
459 bool isAside (bzVec2 target) {return isAside (target, 0.707f);};
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
460 bool isBehind (bzVec2 target) {return isBehind (target, -0.707f);};
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
461
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
462 bool isAhead (bzVec2 target, float cosThreshold)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
463 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
464 bzVec2 targetDirection = (target - position ()).normalize ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
465 return forward().dot(targetDirection) > cosThreshold;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
466 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
467
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
468 bool isAside (bzVec2 target, float cosThreshold)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
469 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
470 bzVec2 targetDirection = (target - position ()).normalize ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
471 float dp = forward().dot(targetDirection);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
472 return (dp < cosThreshold) (dp > -cosThreshold);
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
473 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
474
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
475 bool isBehind (bzVec2 target, float cosThreshold)
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
476 {
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
477 bzVec2 targetDirection = (target - position).normalize ();
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
478 return forward().dot(targetDirection) < cosThreshold;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
479 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
480 }