8 #ifndef Navigation_AvoidanceSolver_H
9 #define Navigation_AvoidanceSolver_H
26 class NormalizedUtilityFunctionInfluenceRatios
29 NormalizedUtilityFunctionInfluenceRatios(
const AvoidanceConfig* avoidanceConfig)
31 const Kaim::AvoidanceUtilityFunctionConfig& utilityconfig = avoidanceConfig->m_utilityFunctionConfig;
33 utilityconfig.m_avoidanceInfluence +
34 utilityconfig.m_desiredVelocityInfluence +
35 utilityconfig.m_previousVelocityInfluence;
37 KyFloat32 influenceSumInv = 1.0f / influenceSum;
39 m_avoidanceInfluence = influenceSumInv * utilityconfig.m_avoidanceInfluence;
40 m_desiredVelocityInfluence = influenceSumInv * utilityconfig.m_desiredVelocityInfluence;
41 m_previousVelocityInfluence = influenceSumInv * utilityconfig.m_previousVelocityInfluence;
50 (
const AvoidanceSolverConfig& config,
const Vec2f& direction,
KyFloat32 speed,
KyFloat32 time,
51 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, Vec3f& collisionPos);
54 (
const AvoidanceSolverConfig& config,
KyFloat32 speed,
KyFloat32 time, LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
61 : m_normalizedDirection (0.0f, 0.0f)
63 , m_avoidanceScore (0.0f)
64 , m_desiredVelocityScore (0.0f)
65 , m_previousVelocityScore (0.0f)
66 , m_collisionTime (0.0f)
67 , m_colliderIndex (-1)
70 Vec2f m_normalizedDirection;
79 KyFloat32 ComputeFinalScore(
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios)
const
81 return ((m_avoidanceScore * utilityFunctionRatios.m_avoidanceInfluence) +
82 (m_desiredVelocityScore * utilityFunctionRatios.m_desiredVelocityInfluence) +
83 (m_previousVelocityScore * utilityFunctionRatios.m_previousVelocityInfluence));
89 void ScoreDesiredVelocity (
KyFloat32 score) { m_desiredVelocityScore = score; }
90 void ScorePreviousVelocity(
KyFloat32 score) { m_previousVelocityScore = score; }
91 typedef void(VelocitySample::*ScoreVelocityFunction)(
KyFloat32);
94 KyFloat32 GetAvoidanceScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_avoidanceScore; }
95 KyFloat32 GetDesiredVelocityScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_desiredVelocityScore; }
96 KyFloat32 GetPreviousVelocityScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_previousVelocityScore; }
98 typedef KyFloat32(VelocitySample::*ScoreAccessorFunction)(
const NormalizedUtilityFunctionInfluenceRatios&)
const;
101 void AdjustScoreAgainstChannel(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon, RayCastInChannel& rayCastInChannel);
102 void AdjustScoreAgainstNavMesh(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon,
103 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, PerformRaycastFromBotPositionCallback raycastFunction);
105 void AdjustScoreToStaticObstacleCollision(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon,
const Vec2f& botPosition,
const Vec2f& collisionPos);
108 typedef KyArrayPOD<VelocitySample, MemStat_PathFollowing, Kaim::ArrayConstPolicy<0, 16, true> > VelocitySampleArrayType;
110 class VelocitySampleArray
114 void ComputeTurningVelocitiesSamples(
const AvoidanceSolverConfig& config,
const Vec2f& movingDirection,
KyFloat32 timeHorizon);
116 void ScoreForDistanceToDirection(
const Vec2f& direction, VelocitySample::ScoreVelocityFunction scoreFunction);
117 void ScoreForPreviousDirection(
const Vec2f& previousDirection,
KyFloat32 previousSpeed);
118 KyUInt32 FindClosestSampleToDirection(
const Vec2f& direction);
119 KyFloat32 SelectBestVelocitySample(
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
const VelocitySample*& bestSample,
const Vec2f& previousDirection);
121 bool ScoreForAvoidance(
const AvoidanceSolverConfig& config,
KyFloat32 timeHorizon,
KyFloat32 movingSpeed,
122 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, PerformRaycastFromBotPositionCallback raycastFunction,
123 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
125 void DebugDrawSample(ScopedDisplayList& displayList_Samples,
const VelocitySample& velocitySample,
const Vec3f& rootPosition,
126 VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
128 void DebugDrawSamples(
const char* groupName,
const char* displayListName,
Kaim::Bot* bot, VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
129 const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
131 void DebugDrawSamplesCurve(
const char* groupName,
const char* displayListName,
Kaim::Bot* bot, VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
132 const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
134 void DebugDraw(AvoidanceSolverConfig& config,
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
const Vec2f& previousVelocity,
135 const Vec2f& desiredVelocity,
const Vec2f& outputVelocity,
const VelocitySample& noAvoidanceSample,
const VelocitySample& favoriteSample,
KyFloat32 movingSpeed);
138 VelocitySampleArrayType m_velocitySamples;
143 class AvoidanceSolverImplementation
148 AvoidanceSolverImplementation() {}
150 AvoidanceResult Solve(AvoidanceSolverConfig& config,
const Vec2f& previousVelocity,
const Vec2f& desiredVelocity,
151 Vec2f& outputVelocity, Vec2f& outputFrontDirection,
bool& collide,
152 PerformRaycastFromBotPositionCallback raycastFunction,
153 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
156 const Vec2f& previousVelocity,
const Vec2f& desiredVelocity, Vec2f& outputVelocity, Vec2f& outputFrontDirection,
157 PerformRaycastFromBotPositionCallback raycastFunction,
158 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
160 void ComputeMovingDirection(Vec2f& movingDirection);
164 bool CapDirectionChangeAngle(
const Vec2f& normalizedFrom,
const Vec2f& normalizedTo, Vec2f& result, CosAndSinAngle& maxAngle);
166 void SolveContact(
const KyFloat32 maxSpeed,
const Vec2f& avoidanceDirection,
bool& hasCollided, Vec2f& collideSolveDirection,
KyFloat32& finalSpeed);
168 void CapAvoidanceVelocityChange(
169 const KyFloat32 previousSpeed,
const bool hasCollided,
const Vec2f& previousDirection,
const KyFloat32 movingSpeed,
170 Vec2f& finalVelocityDirection,
KyFloat32& finalSpeed, Vec2f& finalFrontDirection);
173 PerformRaycastFromBotPositionCallback raycastFunction,
174 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
177 VelocitySampleArray m_velocitySamplesArray;
178 LocalCostAwareTraverseLogicData m_localCostAwareTraverseLogicData;
180 AvoidanceSolverConfig m_config;
181 Vec2f m_previousVelocityDirection;
183 Vec2f m_followVelocityDirection;
189 template<
class TraverseLogic>
190 class AvoidanceSolver :
public IAvoidanceSolver
206 AvoidanceSolverConfig& config,
const Vec2f& previousVelocity,
const Vec2f& desiredVelocity,
207 Vec2f& outputVelocity, Vec2f& outputFrontDirection,
bool& collide);
212 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
215 const AvoidanceSolverConfig& config,
const Vec2f& direction,
KyFloat32 speed,
KyFloat32 time,
216 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, Vec3f& collisionPos);
218 AvoidanceSolverImplementation m_impl;
225 #endif // Navigation_AvoidanceSolver_H
This class is the world element that represent an active character in Gameware Navigation.
Definition: bot.h:150
The trajectory goes in target direction at the desired speed.
Definition: iavoidancecomputer.h:22
int KyInt32
Type used internally to represent a 32-bit integer.
Definition: types.h:35
DiskCollisionQueryResult
Enumerates the possible results of a DiskCollisionQuery.
Definition: basediskcollisionquery.h:21
AvoidanceResult
Enumerates the possible results of a call to IAvoidanceComputer::Compute().
Definition: iavoidancecomputer.h:20
RayCastQueryResult
Enumerates the possible results of a RayCastQuery.
Definition: baseraycastquery.h:29
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
virtual AvoidanceResult Solve(AvoidanceSolverConfig &config, const Vec2f &previousVelocity, const Vec2f &desiredVelocity, Vec2f &outputVelocity, Vec2f &outputFrontDirection, bool &collide)
Compute the more appropriate velocity.
Definition: avoidancesolver.inl:12
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43