Flocking References: xxx
What is it? A way to simulate "herds": – Flock of birds – Flock of fish – Herd of wildebeest – A group of enemies First image: Second image: Third image: Fourth image:
Boid Representation
Boid Representation, cont. Independent Steering? – For most characters, the orientation should match the direction of the linear velocity Need a refresher on the math? – Sometimes, you do want a separate facing direction… [optional] Max Speed (a scalar) – Useful to keep speed under control – Refresher (with vectors)? Image:
Steering
Steering, cont.
Flocking overview Every frame: – Generate 0 or more steerings (force vectors) From a set of low-level behaviors – Seek – Flee – Wander – Avoid-another-boid – Align – Obstacle-avoid Each force vector is created considering only that behavior – Combine these steerings into a single force vector – Apply it using the position-/velocity-update formula.
Low-level behavior: Seek max_accel
Low-level behavior: Flee max_accel
Low-level Behavior: Wander Approach #1: – Add random.uniform(-m, m) to heading. – Generate a force vector in this direction – Problem: tends to be "jittery" Approach #2: – Every few seconds generate a new seek target. – Problem: can be abrupt. Approach #3: – Place a target n units in the heading direction – Add random.uniform(-m,m) to it's rotation This is relative to the heading direction – Seek towards this target – Usually a little less "jittery" Even though the target itself is "jittery"
Low-level behavior: Avoid-another-boid Simple: – If within n units, flee More advanced: – Predict if we'll collide, and if so steer to avoid – "Problem" cases: Moving parallel to each other -- no collision! Intersecting paths, but no hit. – Calculating the correction force vector. – Can also consider a "cone of vision"
Low-level behavior: Align Given: a direction vector. Simple -- just accelerate in this direction!
Low-level Behavior: Obstacle Avoid One approach: Usually you want to modulate the force based on distance.
Blending
Blending, cont. Problems: – Contradictory forces (Equlibria) – Oscillating: If you gradually adjust weights, this shouldn't happen. – Near-sightedness E.g. taking the wrong route in a maze. Combine this with A* to get around this. – Behaviors that should take precedence: E.g. Wall-avoid if we're close; otherwise, 0.5 wander, 0.5 seek. – Use a decision tree.