24 class NormalizedUtilityFunctionInfluenceRatios
27 NormalizedUtilityFunctionInfluenceRatios(
const AvoidanceConfig* avoidanceConfig)
29 const Kaim::AvoidanceUtilityFunctionConfig& utilityconfig = avoidanceConfig->m_utilityFunctionConfig;
31 utilityconfig.m_avoidanceInfluence +
32 utilityconfig.m_desiredVelocityInfluence +
33 utilityconfig.m_previousVelocityInfluence;
35 KyFloat32 influenceSumInv = 1.0f / influenceSum;
37 m_avoidanceInfluence = influenceSumInv * utilityconfig.m_avoidanceInfluence;
38 m_desiredVelocityInfluence = influenceSumInv * utilityconfig.m_desiredVelocityInfluence;
39 m_previousVelocityInfluence = influenceSumInv * utilityconfig.m_previousVelocityInfluence;
48 (
const AvoidanceSolverConfig& config,
const Vec2f& direction,
KyFloat32 speed,
KyFloat32 time,
49 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, Vec3f& collisionPos);
52 (
const AvoidanceSolverConfig& config,
KyFloat32 speed,
KyFloat32 time, LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
59 : m_normalizedDirection (0.0f, 0.0f)
61 , m_avoidanceScore (0.0f)
62 , m_desiredVelocityScore (0.0f)
63 , m_previousVelocityScore (0.0f)
64 , m_collisionTime (0.0f)
65 , m_colliderIndex (-1)
68 Vec2f m_normalizedDirection;
77 KyFloat32 ComputeFinalScore(
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios)
const
79 return ((m_avoidanceScore * utilityFunctionRatios.m_avoidanceInfluence) +
80 (m_desiredVelocityScore * utilityFunctionRatios.m_desiredVelocityInfluence) +
81 (m_previousVelocityScore * utilityFunctionRatios.m_previousVelocityInfluence));
87 void ScoreDesiredVelocity (
KyFloat32 score) { m_desiredVelocityScore = score; }
88 void ScorePreviousVelocity(
KyFloat32 score) { m_previousVelocityScore = score; }
89 typedef void(VelocitySample::*ScoreVelocityFunction)(
KyFloat32);
92 KyFloat32 GetAvoidanceScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_avoidanceScore; }
93 KyFloat32 GetDesiredVelocityScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_desiredVelocityScore; }
94 KyFloat32 GetPreviousVelocityScore (
const NormalizedUtilityFunctionInfluenceRatios& )
const {
return m_previousVelocityScore; }
96 typedef KyFloat32(VelocitySample::*ScoreAccessorFunction)(
const NormalizedUtilityFunctionInfluenceRatios&)
const;
99 void AdjustScoreAgainstChannel(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon, RayCastInChannel& rayCastInChannel);
100 void AdjustScoreAgainstNavMesh(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon,
101 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, PerformRaycastFromBotPositionCallback raycastFunction);
103 void AdjustScoreToStaticObstacleCollision(
const AvoidanceSolverConfig& config,
KyFloat32 movingSpeed,
KyFloat32 timeHorizon,
const Vec2f& botPosition,
const Vec2f& collisionPos);
106 typedef KyArrayPOD<VelocitySample, MemStat_PathFollowing, Kaim::ArrayConstPolicy<0, 16, true> > VelocitySampleArrayType;
108 class VelocitySampleArray
112 void ComputeTurningVelocitiesSamples(
const AvoidanceSolverConfig& config,
const Vec2f& movingDirection,
KyFloat32 timeHorizon);
114 void ScoreForDistanceToDirection(
const Vec2f& direction, VelocitySample::ScoreVelocityFunction scoreFunction);
115 void ScoreForPreviousDirection(
const Vec2f& previousDirection,
KyFloat32 previousSpeed);
116 KyUInt32 FindClosestSampleToDirection(
const Vec2f& direction);
117 KyFloat32 SelectBestVelocitySample(
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
const VelocitySample*& bestSample,
const Vec2f& previousDirection);
119 bool ScoreForAvoidance(
const AvoidanceSolverConfig& config,
KyFloat32 timeHorizon,
KyFloat32 movingSpeed,
120 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData, PerformRaycastFromBotPositionCallback raycastFunction,
121 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
123 void DebugDrawSample(DisplayList& displayList_Samples,
const VelocitySample& velocitySample,
const Vec3f& rootPosition,
124 VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
126 void DebugDrawSamples(
const char* groupName,
const char* displayListName,
Kaim::Bot* bot, VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
127 const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
129 void DebugDrawSamplesCurve(
const char* groupName,
const char* displayListName,
Kaim::Bot* bot, VelocitySample::ScoreAccessorFunction scoreAccessorFunction,
130 const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
KyFloat32 movingSpeed);
132 void DebugDraw(AvoidanceSolverConfig& config,
const NormalizedUtilityFunctionInfluenceRatios& utilityFunctionRatios,
const Vec2f& previousVelocity,
133 const Vec2f& desiredVelocity,
const Vec2f& outputVelocity,
const VelocitySample& noAvoidanceSample,
const VelocitySample& favoriteSample,
KyFloat32 movingSpeed);
136 VelocitySampleArrayType m_velocitySamples;
141 class AvoidanceSolverImplementation
146 AvoidanceSolverImplementation() {}
148 AvoidanceResult Solve(AvoidanceSolverConfig& config,
const Vec2f& previousVelocity,
const Vec2f& desiredVelocity,
149 Vec2f& outputVelocity, Vec2f& outputFrontDirection,
bool& collide,
150 PerformRaycastFromBotPositionCallback raycastFunction,
151 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
154 const Vec2f& previousVelocity,
const Vec2f& desiredVelocity, Vec2f& outputVelocity, Vec2f& outputFrontDirection,
155 PerformRaycastFromBotPositionCallback raycastFunction,
156 PerformDiskCollisionFromBotPositionCallback diskCollisionFunction);
158 void ComputeMovingDirection(Vec2f& movingDirection);
162 bool CapDirectionChangeAngle(
const Vec2f& normalizedFrom,
const Vec2f& normalizedTo, Vec2f& result, CosAndSinAngle& maxAngle);
164 void SolveContact(
const KyFloat32 maxSpeed,
const Vec2f& avoidanceDirection,
bool& hasCollided, Vec2f& collideSolveDirection,
KyFloat32& finalSpeed);
166 void CapAvoidanceVelocityChange(
167 const KyFloat32 previousSpeed,
const bool hasCollided,
const Vec2f& previousDirection,
const KyFloat32 movingSpeed,
168 Vec2f& finalVelocityDirection,
KyFloat32& finalSpeed, Vec2f& finalFrontDirection);
171 PerformRaycastFromBotPositionCallback raycastFunction,
172 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
175 VelocitySampleArray m_velocitySamplesArray;
176 LocalCostAwareTraverseLogicData m_localCostAwareTraverseLogicData;
178 AvoidanceSolverConfig m_config;
179 Vec2f m_previousVelocityDirection;
181 Vec2f m_followVelocityDirection;
187 template<
class TraverseLogic>
204 AvoidanceSolverConfig& config,
const Vec2f& previousVelocity,
const Vec2f& desiredVelocity,
205 Vec2f& outputVelocity,
Vec2f& outputFrontDirection,
bool& collide);
210 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData);
214 LocalCostAwareTraverseLogicData& localCostAwareTraverseLogicData,
Vec3f& collisionPos);
216 AvoidanceSolverImplementation m_impl;
This class is the world element that represent an active character in Autodesk Navigation.
Definition: bot.h:128
The trajectory goes in target direction at the desired speed.
Definition: iavoidancecomputer.h:20
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
AvoidanceSolver computes a velocity compatible with all the colliders in AvoidanceWorkspace and the N...
Definition: avoidancesolver.h:188
DiskCollisionQueryResult
Enumerates the possible results of a DiskCollisionQuery.
Definition: basediskcollisionquery.h:18
AvoidanceResult
Enumerates the possible results of a call to IAvoidanceComputer::Compute().
Definition: iavoidancecomputer.h:18
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
RayCastQueryResult
Enumerates the possible results of a RayCastQuery.
Definition: baseraycastquery.h:24
2d vector using KyFloat32.
Definition: vec2f.h:18
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
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:11
Interface class for Avoidance solvers.
Definition: iavoidancesolver.h:84
float KyFloat32
float
Definition: types.h:32
3d vector using 32bits floating points.
Definition: vec3f.h:16