annotate steer.d @ 12:2ecd16840900

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