annotate ai/steer.d @ 23:e79347dd38a3

steering
author zzzzrrr <mason.green@gmail.com>
date Thu, 26 Mar 2009 20:35:58 -0400
parents 4fce5596d1f6
children 441eb7672404
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 */
18
7f74e064dad5 refactored code
zzzzrrr <mason.green@gmail.com>
parents: 15
diff changeset
33 module openmelee.ai.steer;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
34
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
35 import tango.io.Stdout : Stdout;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
36
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
37 import blaze.common.bzMath: bzDot, bzClamp, bzVec2;
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
38 import blaze.collision.shapes.bzShape : bzShape;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
39 import tango.math.Math : sqrt;
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
40 import blaze.dynamics.bzBody: bzBody;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
41
18
7f74e064dad5 refactored code
zzzzrrr <mason.green@gmail.com>
parents: 15
diff changeset
42 import openmelee.ships.ship : Ship, State;
7f74e064dad5 refactored code
zzzzrrr <mason.green@gmail.com>
parents: 15
diff changeset
43 import openmelee.ai.utilities;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
44
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
45 class Steer
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
46 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
47 // Constructor: initializes state
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
48 this (Ship ship)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
49 {
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
50 m_ship = ship;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
51 m_body = ship.rBody;
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
52 }
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
53
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
54 struct PathIntersection
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
55 {
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
56 bool intersect;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
57 float distance;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
58 bzVec2 surfacePoint;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
59 bzVec2 surfaceNormal;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
60 bzBody obstacle;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
61 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
62
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
63 // reset state
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
64 void reset () {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
65 // initial state of wander behavior
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
66 m_wanderSide = 0;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
67 m_wanderUp = 0;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
68 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
69
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
70 void update() {
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
71 m_position = m_ship.state.position;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
72 m_velocity = m_ship.state.velocity;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
73 m_speed = m_ship.state.speed;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
74 m_maxForce = m_ship.state.maxForce;
12
2ecd16840900 added tracker
Mason Green <mason.green@gmail.com>
parents: 11
diff changeset
75 m_forward = m_ship.state.forward;
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
76 m_radius = m_ship.state.radius;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
77 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
78
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
79 // -------------------------------------------------- steering behaviors
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
80
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
81 bzVec2 steerForWander (float dt) {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
82 // random walk m_wanderSide and m_wanderUp between -1 and +1
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
83 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
84 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
85 m_wanderUp = scalarRandomWalk (m_wanderUp, speed, -1, +1);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
86
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
87 // 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
88 return (m_side * m_wanderSide) + (m_up * m_wanderUp);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
89 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
90
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
91 // Seek behavior
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
92 bzVec2 steerForSeek (bzVec2 target) {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
93 bzVec2 desiredVelocity = target - m_position;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
94 return desiredVelocity - m_velocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
95 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
96
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
97 // Flee behavior
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
98 bzVec2 steerForFlee (bzVec2 target) {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
99 bzVec2 desiredVelocity = m_position - target;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
100 return desiredVelocity - m_velocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
101 }
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
102
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
103 /*
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
104 // xxx proposed, experimental new seek/flee [cwr 9-16-02]
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
105 bzVec2 xxxsteerForFlee (bzVec2 target) {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
106 bzVec2 offset = m_position - target;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
107 bzVec2 desiredVelocity = bzClamp(offset.truncateLength (maxSpeed ());
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
108 return desiredVelocity - m_velocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
109 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
110
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
111 bzVec2 xxxsteerForSeek (bzVec2 target) {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
112 // bzVec2 offset = target - position;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
113 bzVec2 offset = target - m_position;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
114 bzVec2 desiredVelocity = offset.truncateLength (maxSpeed ()); //xxxnew
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
115 return desiredVelocity - m_velocity;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
116 }
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
117 */
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
118
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
119 /*
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
120 // ------------------------------------------------------------------------
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
121 // Obstacle Avoidance behavior
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
122 //
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
123 // Returns a steering force to avoid a given obstacle. The purely
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
124 // lateral steering force will turn our vehicle towards a silhouette edge
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
125 // of the obstacle. Avoidance is required when (1) the obstacle
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
126 // 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
127 // vehicle, and (3) is within minTimeToCollision seconds of travel at the
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
128 // vehicle's current velocity. Returns a zero vector value (bzVec2::zero)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
129 // when no avoidance is required.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
130 bzVec2 steerToAvoidObstacle (float minTimeToCollision, Obstacle obstacle) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
131
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
132 bzVec2 avoidance = obstacle.steerToAvoid (this, minTimeToCollision);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
133 return avoidance;
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
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
136 // avoids all obstacles in an ObstacleGroup
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
137 */
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
138
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
139 bzVec2 steerToAvoidObstacles (float minTimeToCollision, bzBody obstacles) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
140
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
141 bzVec2 avoidance;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
142 PathIntersection nearest, next;
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
143 float minDistanceToCollision = 10; //minTimeToCollision * m_speed;
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
144
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
145 next.intersect = false;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
146 nearest.intersect = false;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
147
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
148 // test all obstacles for intersection with my forward axis,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
149 // select the one whose point of intersection is nearest
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
150 for (bzBody o = obstacles; o; o = o.next) {
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
151
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
152 if(o is m_body) continue;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
153
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
154 // This code which presumes the obstacle is spherical
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
155 findNextIntersectionWithSphere(o, next);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
156
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
157 if (!nearest.intersect || (next.intersect && next.distance < nearest.distance)) {
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
158 nearest = next;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
159 }
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
160 }
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
161
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
162 // when a nearest intersection was found
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
163 if (nearest.intersect && (nearest.distance < minDistanceToCollision)) {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
164 // compute avoidance steering force: take offset from obstacle to me,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
165 // take the component of that which is lateral (perpendicular to my
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
166 // forward direction), set length to maxForce, add a bit of forward
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
167 // component (in capture the flag, we never want to slow down)
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
168 bzVec2 offset = m_position - nearest.obstacle.position;
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
169 avoidance = perpendicularComponent(offset, m_forward);
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
170 avoidance.normalize;
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
171 avoidance = m_body.localPoint(avoidance);
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
172 ///avoidance *= m_maxForce;
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
173 //avoidance += m_forward * m_maxForce * 0.75f;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
174 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
175
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
176 auto state = cast(State) m_body.userData;
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
177 state.avoid = avoidance;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
178 return avoidance;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
179 }
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
180
23
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
181 bzVec2 getSteering(bzBody obstacles) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
182
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
183 // 1. Find the target that’s closest to collision
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
184
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
185 float radius = m_radius;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
186 float rad;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
187 // Store the first collision time
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
188 float shortestTime = 0.5;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
189
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
190 // Store the target that collides then, and other data
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
191 // that we will need and can avoid recalculating
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
192 bzBody firstTarget = null;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
193 float firstMinSeparation = 0;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
194 float firstDistance = 0;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
195 bzVec2 firstRelativePos;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
196 bzVec2 firstRelativeVel;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
197 bzVec2 relativePos;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
198
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
199 // Loop through each target
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
200 for (bzBody target = obstacles; target; target = target.next) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
201
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
202 if(target is m_body) continue;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
203
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
204 // Calculate the time to collision
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
205 relativePos = m_body.localPoint(target.position); // - m_position;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
206 bzVec2 relativeVel = target.linearVelocity - m_velocity;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
207 float relativeSpeed = relativeVel.length;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
208 float timeToCollision = bzDot(relativePos, relativeVel) /
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
209 (relativeSpeed * relativeSpeed);
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
210
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
211 // Check if it is going to be a collision at all
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
212 float distance = relativePos.length;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
213 float minSeparation = distance - relativeSpeed * shortestTime;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
214
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
215 float eRad;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
216 for (bzShape s = target.shapeList; s; s = s.next) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
217 if(s.sweepRadius > eRad) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
218 eRad = s.sweepRadius;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
219 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
220 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
221
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
222 if (minSeparation > radius + eRad) continue;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
223
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
224 // Check if it is the shortest
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
225 if (timeToCollision > 0 && timeToCollision < shortestTime) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
226
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
227 // Store the time, target and other data
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
228 shortestTime = timeToCollision;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
229 firstTarget = target;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
230 firstMinSeparation = minSeparation;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
231 firstDistance = distance;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
232 firstRelativePos = relativePos;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
233 firstRelativeVel = relativeVel;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
234 rad = eRad;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
235 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
236 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
237
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
238 // 2. Calculate the steering
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
239
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
240 // If we have no target, then exit
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
241 if(!firstTarget) return bzVec2.zeroVect;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
242
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
243 Stdout(shortestTime).newline;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
244
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
245 // If we’re going to hit exactly, or if we’re already
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
246 // colliding, then do the steering based on current
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
247 // position.
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
248 if(firstMinSeparation <= 0 || firstDistance < radius + rad) {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
249 relativePos = firstTarget.position - m_position;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
250 } else {
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
251 // Otherwise calculate the future relative position:
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
252 relativePos = firstRelativePos +
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
253 firstRelativeVel * shortestTime;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
254 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
255
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
256 // Avoid the target
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
257 bzVec2 steering = relativePos;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
258 steering.normalize();
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
259 //steering.linear = relativePos * maxAcceleration
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
260
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
261 return steering;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
262 }
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
263
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
264 bzVec2 avoid(float maxLookAhead, bzBody obstacles) {
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
265
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
266 float avoidMargin = 1.0f;
23
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
267 float maxLookahead = maxLookAhead * m_speed;
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
268
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
269 // Make sure we're moving
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
270 if (m_velocity.length > 0)
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
271 {
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
272 for (bzBody o = obstacles; o; o = o.next) {
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
273
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
274 if(o is m_body) continue;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
275
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
276 // Find the distance from the line we're moving along to the obstacle.
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
277 bzVec2 movementNormal = m_velocity;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
278 movementNormal.normalize();
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
279 bzVec2 characterToObstacle = o.position - m_position;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
280
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
281 real distanceSquared = bzDot(characterToObstacle, movementNormal);
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
282 distanceSquared = characterToObstacle.lengthSquared - distanceSquared*distanceSquared;
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
283
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
284 // Check for collision
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
285 float oRad = 0;
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
286 for (bzShape s = o.shapeList; s; s = s.next) {
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
287 if(s.sweepRadius > oRad) {
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
288 oRad = s.sweepRadius;
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
289 }
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
290 }
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
291
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
292 real radius = oRad + avoidMargin;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
293 if (distanceSquared < radius*radius)
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
294 {
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
295 // Find how far along our movement vector the closest pass is
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
296 real distanceToClosest = bzDot(characterToObstacle, movementNormal);
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
297
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
298 // Make sure this isn't behind us and is closer than our lookahead.
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
299 if (distanceToClosest > 0 && distanceToClosest < maxLookahead)
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
300 {
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
301 // Find the closest point
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
302 bzVec2 closestPoint = o.position + movementNormal * distanceToClosest;
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
303
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
304 // Find the point of avoidance
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
305 bzVec2 target = o.position + (closestPoint - o.position).length * radius;
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
306
23
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
307 target -= m_position;
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
308
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
309 auto state = cast(State) m_body.userData;
23
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
310 state.avoid = m_body.localPoint(target);
e79347dd38a3 steering
zzzzrrr <mason.green@gmail.com>
parents: 22
diff changeset
311
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
312 return target;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
313 }
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
314 }
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
315 }
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
316 }
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
317
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
318 auto state = cast(State) m_body.userData;
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
319 state.avoid = bzVec2.zeroVect;
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
320
21
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
321 return bzVec2.zeroVect;
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
322
zzzzrrr <mason.green@gmail.com>
parents: 20
diff changeset
323 }
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
324
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
325 void findNextIntersectionWithSphere(bzBody obs,
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
326 inout PathIntersection intersection) {
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
327
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
328 // This routine is based on the Paul Bourke's derivation in:
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
329 // Intersection of a Line and a Sphere (or circle)
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
330 // http://local.wasp.uwa.edu.au/~pbourke/geometry/sphereline/raysphere.c
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
331
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
332 float b, c, d, p, q, s;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
333 bzVec2 lc;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
334
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
335 // initialize pathIntersection object
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
336 intersection.intersect = false;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
337 intersection.obstacle = obs;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
338
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
339 // find "local center" (lc) of sphere in coordinate space
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
340 lc = m_body.localPoint(obs.position);
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
341
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
342 // computer line-sphere intersection parameters
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
343 b = 0;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
344
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
345 // Find radius of obstacle
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
346 float obsRadius = 0;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
347 for (bzShape shape = obs.shapeList; shape; shape = shape.next) {
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
348 if(shape.sweepRadius > obsRadius) {
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
349 obsRadius = shape.sweepRadius;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
350 }
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
351 }
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
352
22
4fce5596d1f6 ai work
zzzzrrr <mason.green@gmail.com>
parents: 21
diff changeset
353 c = square(lc.x) + square(lc.y) - square(obsRadius + m_radius);
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
354 d = (b * b) - (4 * c);
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
355
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
356 // when the path does not intersect the sphere
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
357 if (d < 0) return;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
358
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
359 // otherwise, the path intersects the sphere in two points with
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
360 // parametric coordinates of "p" and "q".
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
361 // (If "d" is zero the two points are coincident, the path is tangent)
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
362 s = sqrt(d);
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
363 p = (-b + s) * 0.5f;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
364 q = (-b - s) * 0.5f;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
365
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
366 // both intersections are behind us, so no potential collisions
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
367 if ((p < 0) && (q < 0)) return;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
368
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
369 // at least one intersection is in front of us
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
370 intersection.intersect = true;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
371 intersection.distance =
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
372 ((p > 0) && (q > 0)) ?
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
373 // both intersections are in front of us, find nearest one
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
374 ((p < q) ? p : q) :
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
375 // otherwise only one intersections is in front, select it
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
376 ((p > 0) ? p : q);
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
377 }
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
378
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
379 /*
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
380 // ------------------------------------------------------------------------
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
381 // Unaligned collision avoidance behavior: avoid colliding with other
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
382 // nearby vehicles moving in unconstrained directions. Determine which
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
383 // (if any) other other vehicle we would collide with first, then steers
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
384 // to avoid the site of that potential collision. Returns a steering
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
385 // force vector, which is zero length if there is no impending collision.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
386
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
387 bzVec2 steerToAvoidNeighbors (float minTimeToCollision, AVGroup others) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
388
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
389 // first priority is to prevent immediate interpenetration
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
390 bzVec2 separation = steerToAvoidCloseNeighbors (0, others);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
391 if (separation != bzVec2::zero) return separation;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
392
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
393 // otherwise, go on to consider potential future collisions
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
394 float steer = 0;
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
395 Ship threat;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
396
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
397 // Time (in seconds) until the most immediate collision threat found
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
398 // 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
399 // many frames into the future.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
400 float minTime = minTimeToCollision;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
401
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
402 // xxx solely for annotation
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
403 bzVec2 xxxThreatPositionAtNearestApproach;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
404 bzVec2 xxxOurPositionAtNearestApproach;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
405
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
406 // for each of the other vehicles, determine which (if any)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
407 // pose the most immediate threat of collision.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
408 for (AVIterator i = others.begin(); i != others.end(); i++)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
409 {
15
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
410 Ship other = i;
8e6a9e390cba Added binary win32 demo
zzzzrrr <mason.green@gmail.com>
parents: 12
diff changeset
411 if (other !is this)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
412 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
413 // 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
414 float collisionDangerThreshold = radius * 2;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
415
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
416 // predicted time until nearest approach of "this" and "other"
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
417 float time = predictNearestApproachTime (other);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
418
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
419 // If the time is in the future, sooner than any other
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
420 // threatened collision...
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
421 if ((time >= 0) (time < minTime))
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
422 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
423 // if the two will be close enough to collide,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
424 // make a note of it
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
425 if (computeNearestApproachPositions (other, time)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
426 < collisionDangerThreshold)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
427 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
428 minTime = time;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
429 threat = other;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
430 xxxThreatPositionAtNearestApproach
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
431 = hisPositionAtNearestApproach;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
432 xxxOurPositionAtNearestApproach
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
433 = ourPositionAtNearestApproach;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
434 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
435 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
436 }
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
437 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
438
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
439 // if a potential collision was found, compute steering to avoid
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
440 if (threat)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
441 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
442 // 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
443 float parallelness = m_forward.dot(threat.forward);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
444 float angle = 0.707f;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
445
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
446 if (parallelness < -angle)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
447 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
448 // anti-parallel "head on" paths:
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
449 // steer away from future threat position
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
450 bzVec2 offset = xxxThreatPositionAtNearestApproach - m_position;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
451 float sideDot = offset.dot(m_side());
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
452 steer = (sideDot > 0) ? -1.0f : 1.0f;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
453 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
454 else
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
455 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
456 if (parallelness > angle)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
457 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
458 // parallel paths: steer away from threat
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
459 bzVec2 offset = threat.position - m_position;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
460 float sideDot = bzDot(offset, m_side);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
461 steer = (sideDot > 0) ? -1.0f : 1.0f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
462 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
463 else
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
464 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
465 // perpendicular paths: steer behind threat
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
466 // (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
467 if (threat.speed() <= speed)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
468 {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
469 float sideDot = bzDot(m_side, threat.velocity);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
470 steer = (sideDot > 0) ? -1.0f : 1.0f;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
471 }
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
472 }
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
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
476 return m_side() * steer;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
477 }
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
478 */
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
479
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
480 // Given two vehicles, based on their current positions and velocities,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
481 // determine the time until nearest approach
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
482 float predictNearestApproachTime (State other) {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
483
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
484 // imagine we are at the origin with no velocity,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
485 // compute the relative velocity of the other vehicle
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
486 bzVec2 myVelocity = m_velocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
487 bzVec2 otherVelocity = other.velocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
488 bzVec2 relVelocity = otherVelocity - myVelocity;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
489 float relSpeed = relVelocity.length;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
490
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
491 // for parallel paths, the vehicles will always be at the same distance,
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
492 // 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
493 if (relSpeed == 0) return 0;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
494
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
495 // Now consider the path of the other vehicle in this relative
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
496 // space, a line defined by the relative position and velocity.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
497 // The distance from the origin (our vehicle) to that line is
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
498 // the nearest approach.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
499
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
500 // Take the unit tangent along the other vehicle's path
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
501 bzVec2 relTangent = relVelocity / relSpeed;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
502
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
503 // find distance from its path to origin (compute offset from
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
504 // other to us, find length of projection onto path)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
505 bzVec2 relPosition = m_position - other.position;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
506 float projection = bzDot(relTangent, relPosition);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
507
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
508 return projection / relSpeed;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
509 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
510
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
511 // Given the time until nearest approach (predictNearestApproachTime)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
512 // determine position of each vehicle at that time, and the distance
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
513 // between them
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
514 float computeNearestApproachPositions (State other, float time) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
515
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
516 bzVec2 myTravel = m_forward * m_speed * time;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
517 bzVec2 otherTravel = other.forward * other.speed * time;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
518
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
519 bzVec2 myFinal = m_position + myTravel;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
520 bzVec2 otherFinal = other.position + otherTravel;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
521
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
522 return (myFinal - otherFinal).length;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
523 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
524
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
525 // ------------------------------------------------------------------------
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
526 // pursuit of another vehicle ( version with ceiling on prediction time)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
527
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
528 bzVec2 steerForPursuit (State quarry) {
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
529 return steerForPursuit (quarry, float.max);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
530 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
531
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
532 bzVec2 steerForPursuit (State quarry, float maxPredictionTime) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
533
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
534 // offset from this to quarry, that distance, unit vector toward quarry
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
535 bzVec2 offset = quarry.position - m_position;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
536 float distance = offset.length;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
537 bzVec2 unitOffset = offset / distance;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
538
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
539 // how parallel are the paths of "this" and the quarry
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
540 // (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
541 float parallelness = bzDot(m_forward , quarry.forward);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
542
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
543 // how "forward" is the direction to the quarry
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
544 // (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
545 float forwardness = bzDot(m_forward , unitOffset);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
546
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
547 float directTravelTime = distance / m_speed;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
548 int f = intervalComparison (forwardness, -0.707f, 0.707f);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
549 int p = intervalComparison (parallelness, -0.707f, 0.707f);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
550
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
551 float timeFactor = 0; // to be filled in below
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
552
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
553 // Break the pursuit into nine cases, the cross product of the
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
554 // quarry being [ahead, aside, or behind] us and heading
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
555 // [parallel, perpendicular, or anti-parallel] to us.
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
556 switch (f)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
557 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
558 case +1:
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
559 switch (p)
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
560 {
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
561 case +1: // ahead, parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
562 timeFactor = 4;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
563 break;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
564 case 0: // ahead, perpendicular
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
565 timeFactor = 1.8f;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
566 break;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
567 case -1: // ahead, anti-parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
568 timeFactor = 0.85f;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
569 break;
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
570 }
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
571 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
572 case 0:
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
573 switch (p)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
574 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
575 case +1: // aside, parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
576 timeFactor = 1;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
577 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
578 case 0: // aside, perpendicular
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
579 timeFactor = 0.8f;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
580 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
581 case -1: // aside, anti-parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
582 timeFactor = 4;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
583 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
584 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
585 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
586 case -1:
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
587 switch (p)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
588 {
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
589 case +1: // behind, parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
590 timeFactor = 0.5f;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
591 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
592 case 0: // behind, perpendicular
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
593 timeFactor = 2;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
594 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
595 case -1: // behind, anti-parallel
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
596 timeFactor = 2;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
597 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
598 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
599 break;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
600 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
601
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
602 // estimated time until intercept of quarry
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
603 float et = directTravelTime * timeFactor;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
604
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
605 // xxx experiment, if kept, this limit should be an argument
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
606 float etl = (et > maxPredictionTime) ? maxPredictionTime : et;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
607
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
608 // estimated position of quarry at intercept
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
609 bzVec2 target = quarry.predictFuturePosition(etl);
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
610
12
2ecd16840900 added tracker
Mason Green <mason.green@gmail.com>
parents: 11
diff changeset
611 return target; //steerForSeek (target);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
612 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
613
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
614 // ------------------------------------------------------------------------
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
615 // evasion of another vehicle
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
616 bzVec2 steerForEvasion (State menace, float maxPredictionTime) {
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
617
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
618 // offset from this to menace, that distance, unit vector toward menace
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
619 bzVec2 offset = menace.position - m_position;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
620 float distance = offset.length;
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
621
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
622 float roughTime = distance / menace.speed;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
623 float predictionTime = ((roughTime > maxPredictionTime) ? maxPredictionTime : roughTime);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
624 bzVec2 target = menace.predictFuturePosition (predictionTime);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
625
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
626 return steerForFlee (target);
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
627 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
628
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
629
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
630 // ------------------------------------------------------------------------
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
631 // tries to maintain a given speed, returns a maxForce-clipped steering
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
632 // force along the forward/backward axis
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
633 bzVec2 steerForTargetSpeed (float targetSpeed) {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
634 float mf = m_maxForce;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
635 float speedError = targetSpeed - m_speed;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
636 return m_forward * bzClamp(speedError, -mf, +mf);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
637 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
638
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
639
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
640 // ----------------------------------------------------------- utilities
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
641 bool isAhead (bzVec2 target) {return isAhead (target, 0.707f);};
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
642 bool isAside (bzVec2 target) {return isAside (target, 0.707f);};
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
643 bool isBehind (bzVec2 target) {return isBehind (target, -0.707f);};
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
644
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
645 bool isAhead (bzVec2 target, float cosThreshold)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
646 {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
647 bzVec2 targetDirection = target - m_position;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
648 targetDirection.normalize();
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
649 return bzDot(m_forward, targetDirection) > cosThreshold;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
650 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
651
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
652 bool isAside (bzVec2 target, float cosThreshold)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
653 {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
654 bzVec2 targetDirection = target - m_position;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
655 targetDirection.normalize();
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
656 float dp = bzDot(m_forward, targetDirection);
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
657 return (dp < cosThreshold) && (dp > -cosThreshold);
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
658 }
0
c10bc63824e7 Initial commit!
zzzzrrr <mason.green@gmail.com>
parents:
diff changeset
659
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
660 bool isBehind (bzVec2 target, float cosThreshold)
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
661 {
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
662 bzVec2 targetDirection = target - m_position;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
663 targetDirection.normalize();
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
664 return bzDot(m_forward, targetDirection) < cosThreshold;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
665 }
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
666
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
667 private:
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
668
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
669 Ship m_ship;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
670
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
671 bzVec2 m_position;
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
672 bzVec2 m_velocity;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
673 bzVec2 m_up;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
674 bzVec2 m_side;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
675 bzVec2 m_forward;
19
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
676 float m_radius;
08ddf9e71b88 steer to avoid
zzzzrrr <mason.green@gmail.com>
parents: 18
diff changeset
677 bzBody m_body;
11
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
678
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
679 float m_speed = 0;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
680 float m_maxForce = 0;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
681
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
682 // Wander behavior
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
683 float m_wanderSide;
d998bf1b0654 Added utilities and AI; fixed steer
Mason Green <mason.green@gmail.com>
parents: 9
diff changeset
684 float m_wanderUp;
9
5b61327b5a7c update steer
zzzzrrr <mason.green@gmail.com>
parents: 2
diff changeset
685 }