steering_behaviors 1.0.7 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/lib/steering_behaviors/align.rb +1 -1
- data/lib/steering_behaviors/arrive.rb +1 -1
- data/lib/steering_behaviors/broadside.rb +1 -1
- data/lib/steering_behaviors/common.rb +2 -2
- data/lib/steering_behaviors/evade.rb +4 -4
- data/lib/steering_behaviors/flee.rb +1 -1
- data/lib/steering_behaviors/match.rb +1 -1
- data/lib/steering_behaviors/orthogonal.rb +1 -1
- data/lib/steering_behaviors/pursue.rb +1 -1
- data/lib/steering_behaviors/seek.rb +1 -1
- data/lib/steering_behaviors/separation.rb +2 -2
- data/lib/steering_behaviors/steering.rb +32 -13
- data/lib/steering_behaviors/vector.rb +1 -1
- data/lib/steering_behaviors/wander.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changelog for steering-behaviors
|
2
2
|
|
3
|
+
## 1.1.0, 13 August 2013
|
4
|
+
* Predictive interception lookahead tweaked slightly
|
5
|
+
* Bugfix: angle-limited steering could never be accelerative
|
6
|
+
* Evasion & pursuit demos are slower and more illustrative
|
7
|
+
* Separation demo includes danger-radius circle, smaller time lookahead
|
8
|
+
* Separation steering force scaled by speed for proper strength
|
9
|
+
* feel_the_force() returns immediately for zero-vector steering
|
10
|
+
* Bumping minor number; honestly, should have done this on 11 Aug
|
11
|
+
|
3
12
|
## 1.0.7, 12 August 2013
|
4
13
|
* Fix embarrassing bug (left 'puts' statements uncommented in prior release)
|
5
14
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Align
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Arrive
|
10
10
|
# Arrive 'gently' at the goal position by decelerating smoothly.
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Broadside
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
module SteeringBehaviors::Common
|
10
10
|
|
@@ -93,7 +93,7 @@ module SteeringBehaviors::Common
|
|
93
93
|
tf = 1.8
|
94
94
|
when 0
|
95
95
|
gen="ahead, perpendicular"
|
96
|
-
tf = 1.
|
96
|
+
tf = 1.45
|
97
97
|
when -1
|
98
98
|
gen="ahead, anti-parallel"
|
99
99
|
tf = 1.10
|
@@ -4,18 +4,18 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Evade
|
10
10
|
extend SteeringBehaviors::Common
|
11
11
|
|
12
|
-
# Evade a moving target by anticipating its future position.
|
13
|
-
# the
|
12
|
+
# Evade a moving target by anticipating its future position. Our character calculates
|
13
|
+
# where it thinks the enemy will be, and leverages 'flee' to calculate how to best escape.
|
14
14
|
# See http://www.red3d.com/cwr/steer/
|
15
15
|
#
|
16
16
|
# * *Args* :
|
17
17
|
# - +character_kinematic+ -> kinematic of "our" character that is moving and evading
|
18
|
-
# - +
|
18
|
+
# - +enemy_kinematic+ -> kinematic of the thing to evade
|
19
19
|
# * *Returns* :
|
20
20
|
# - a steering force
|
21
21
|
#
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Flee
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Match
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Orthogonal
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Pursue
|
10
10
|
extend SteeringBehaviors::Common
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Seek
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Separation
|
10
10
|
extend SteeringBehaviors::Common
|
@@ -31,7 +31,7 @@ class SteeringBehaviors::Separation
|
|
31
31
|
forwardness = unit_offset.dot(character_kinematic.heading_vec)
|
32
32
|
parallelness = character_kinematic.heading_vec.dot(other_kinematic.heading_vec)
|
33
33
|
|
34
|
-
side_vec = character_kinematic.heading_vec.perpendicular
|
34
|
+
side_vec = character_kinematic.heading_vec.perpendicular * character_kinematic.speed
|
35
35
|
|
36
36
|
if parallelness < -0.707
|
37
37
|
# anti-parallel, head-on paths; steer away from the threat's future pos
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Steering
|
10
10
|
|
@@ -12,24 +12,28 @@ class SteeringBehaviors::Steering
|
|
12
12
|
# Takes turn rate limitations, mass, and other limits into account, and
|
13
13
|
# directly alters the provided Mobile component.
|
14
14
|
#
|
15
|
+
# The options hash lets you alter the behaviors a bit from the 'canonical'
|
16
|
+
# behaviors. The routine understands these settings:
|
17
|
+
# * permit_accel => (boolean) whether the steering force should be permitted to
|
18
|
+
# accelerate our agent; set it to false if that is undesirable.
|
19
|
+
# * permit_decel => (boolean) whether the steering force should be permitted to
|
20
|
+
# decelerate our agent; set it to false if that is undesirable.
|
15
21
|
# * *Args* :
|
16
22
|
# - +character_kinematic+ -> "our" character that is moving
|
17
23
|
# - +steering_force+ -> force vector supplied by a steering behavior
|
18
24
|
# - +delta+ -> time delta (in seconds) used for scaling the result
|
25
|
+
# - +options+ -> hash of user-set options for tuning the steering
|
19
26
|
#
|
20
|
-
def self.feel_the_force(character_kinematic, steering_force, delta,
|
21
|
-
return if steering_force.nil?
|
22
|
-
|
23
|
-
acceleration = steering_force / character_kinematic.mass
|
27
|
+
def self.feel_the_force(character_kinematic, steering_force, delta, options={})
|
28
|
+
return if steering_force.nil? || steering_force == SteeringBehaviors::VEC_ZERO
|
24
29
|
|
25
30
|
# Compute the new, proposed velocity vector.
|
31
|
+
acceleration = steering_force / character_kinematic.mass
|
26
32
|
desired_velocity = character_kinematic.velocity_vec + (acceleration * delta)
|
27
|
-
desired_velocity.truncate!(character_kinematic.speed) if !accelerative
|
28
|
-
desired_velocity.truncate!(character_kinematic.max_speed)
|
29
33
|
|
30
34
|
# If this timeslice's proposed velocity-vector exceeds the turn rate,
|
31
35
|
# come up with a revised velociy-vec that doesn't exceed the rate -- and use that.
|
32
|
-
angle
|
36
|
+
angle = Math.acos character_kinematic.heading_vec.clamped_dot(desired_velocity.normalize)
|
33
37
|
max_course_change = character_kinematic.max_turn * delta
|
34
38
|
|
35
39
|
if angle.abs > max_course_change
|
@@ -44,13 +48,28 @@ class SteeringBehaviors::Steering
|
|
44
48
|
# desired_velocity.radians,
|
45
49
|
# limited_crse
|
46
50
|
|
47
|
-
|
48
|
-
Math.sin(limited_crse) *
|
49
|
-
Math.cos(limited_crse) *
|
51
|
+
desired_velocity = SteeringBehaviors::Vector.new(
|
52
|
+
Math.sin(limited_crse) * desired_velocity.length,
|
53
|
+
Math.cos(limited_crse) * desired_velocity.length
|
50
54
|
)
|
51
|
-
else
|
52
|
-
character_kinematic.velocity_vec = desired_velocity
|
53
55
|
end
|
56
|
+
|
57
|
+
opts = {:permit_accel=>true, :permit_decel=>true}.merge(options)
|
58
|
+
|
59
|
+
# Don't permit acceleration if the caller disabled it
|
60
|
+
if !opts[:permit_accel]
|
61
|
+
desired_velocity.truncate!(character_kinematic.speed)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Don't permit deceleration if the caller disabled it
|
65
|
+
if !opts[:permit_decel] && desired_velocity.length < character_kinematic.speed
|
66
|
+
desired_velocity = desired_velocity.normalize! * character_kinematic.speed
|
67
|
+
end
|
68
|
+
|
69
|
+
# And of course obey the character's maximum speed
|
70
|
+
desired_velocity.truncate!(character_kinematic.max_speed)
|
71
|
+
|
72
|
+
character_kinematic.velocity_vec = desired_velocity
|
54
73
|
end
|
55
74
|
|
56
75
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Vector
|
10
10
|
TWOPI = 6.283185307179586
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# This file is part of The Ruby Steering Behaviors Library.
|
5
5
|
# http://github.com/cpowell/steering-behaviors
|
6
6
|
# You can redistribute and/or modify this software only in accordance with
|
7
|
-
# the terms found in the "LICENSE" file included with the
|
7
|
+
# the terms found in the "LICENSE" file included with the library.
|
8
8
|
|
9
9
|
class SteeringBehaviors::Wander
|
10
10
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: steering_behaviors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version:
|
5
|
+
version: 2.0.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Chris Powell
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: |
|
15
15
|
If you're building a game, you need your game agents and characters to move on their own. A standard way of doing this is with 'steering behaviors'. The seminal paper by Craig Reynolds established a core set of steering behaviors that could be utilized for a variety of common movement tasks and natural behaviors. This Ruby library can accomplish many/most of those tasks for your Ruby / JRuby game. The basic behaviors can be layered for more complicated and advanced behaviors, such as flocking and crowd movement.
|