m (→Simplest case : quite dumb car) |
m (→Simplest case : quite dumb car) |
||
| Line 17: | Line 17: | ||
* Determine track by placing nodes on the map. Name that objects for example "waypoint1" "waypoint2" etc. Usually the best way is duplicating nodes along spline or bezier. | * Determine track by placing nodes on the map. Name that objects for example "waypoint1" "waypoint2" etc. Usually the best way is duplicating nodes along spline or bezier. | ||
* Your level loader should create trigger for every node. | * Your level loader should create trigger for every node. | ||
| - | * In every AI loop step (1/10s for example) set Navigator to car entity and target to map node named "waypoint"+waypoint_nr and check what ''celNavigationInfo says''. | + | * In every AI loop step (1/10s for example) set Navigator to car entity and target to map node named ''"waypoint"+waypoint_nr'' and check what ''celNavigationInfo says''. |
* Moving - if ''distance'' is far than car can move fast. If ''distance'' is close and speed too high then use brakes. | * Moving - if ''distance'' is far than car can move fast. If ''distance'' is close and speed too high then use brakes. | ||
* Steering - for this we need to know ''final_angle'' between car direction and target position (vector-point) because ''celNavigationInfo::angle'' gives point-point angle. | * Steering - for this we need to know ''final_angle'' between car direction and target position (vector-point) because ''celNavigationInfo::angle'' gives point-point angle. | ||
| Line 40: | Line 40: | ||
else if SteerStraight | else if SteerStraight | ||
| - | * If car will reach waypoint trigger, then increase waypoint_nr. | + | * If car will reach waypoint trigger, then increase ''waypoint_nr''. |
Current revision
CEL AI Navigation
Introduction
celNavigationTools it's part of celtool that makes a bunch of useful operations for navigation.
You need to choose Navigator - entity with pcmesh and tracked Target - vector or other entity or map mode.
Then information is returned to celNavigationInfo or choosed variables in blxml:
- bool success - if everything is ok, entity exists, target exist etc.
- bool visible - if target is visible
- float distance - distance between navigator and target
- vector3 angle - angle between navigator and target (note it's angle between point-point in worldspace, it doesn't include direction vectors)
Simplest case : quite dumb car
- Determine track by placing nodes on the map. Name that objects for example "waypoint1" "waypoint2" etc. Usually the best way is duplicating nodes along spline or bezier.
- Your level loader should create trigger for every node.
- In every AI loop step (1/10s for example) set Navigator to car entity and target to map node named "waypoint"+waypoint_nr and check what celNavigationInfo says.
- Moving - if distance is far than car can move fast. If distance is close and speed too high then use brakes.
- Steering - for this we need to know final_angle between car direction and target position (vector-point) because celNavigationInfo::angle gives point-point angle.
final_angle = celNavigationInfo::angle.y - car_rotation.y
Usually car_rotation.y should be mirrored BUT in CEL 1.0 camera and pcactormove, pcwheeled and pchover are mirrored already, then don't do this.
After this operation also is nice to fix angles:
if final_angle >= PI then final_angle -= 2*PI
if final_angle < PI then final_angle += 2*PI
Right side it's angle from 0 .. -PI and left 0 .. PI. Now we know where to steer:
if final_angle < -0.1 then SteerRight
else if final_angle > 0.1 then SteerLeft
else if SteerStraight
- If car will reach waypoint trigger, then increase waypoint_nr.
