Motion Matching: Automatic target mode for trajectory query

* Consolidated the different automatic path generation modes into a single automatic demo mode.
* Moved the static phase variable to a member so that multiple instances won't follow the same path and speedup the phase increment.

Signed-off-by: Benjamin Jillich <jillich@amazon.com>
monroegm-disable-blank-issue-2
Benjamin Jillich 4 years ago
parent f60b056b8a
commit a01500eaaa

@ -12,44 +12,13 @@
namespace EMotionFX::MotionMatching namespace EMotionFX::MotionMatching
{ {
AZ::Vector3 SampleFunction(TrajectoryQuery::EMode mode, float offset, float radius, float phase) AZ::Vector3 SampleFunction(float offset, float radius, float phase)
{ {
switch (mode) phase += 10.7;
{ AZ::Vector3 displacement = AZ::Vector3::CreateZero();
case TrajectoryQuery::MODE_TWO: displacement.SetX(radius * sinf(phase * 0.7f + offset) + radius * 0.75f * cosf(phase * 2.0f + offset * 2.0f));
{ displacement.SetY(radius * cosf(phase * 0.4f + offset));
AZ::Vector3 displacement = AZ::Vector3::CreateZero(); return displacement;
displacement.SetX(radius * sinf(phase + offset) );
displacement.SetY(cosf(phase + offset));
return displacement;
}
case TrajectoryQuery::MODE_THREE:
{
AZ::Vector3 displacement = AZ::Vector3::CreateZero();
const float rad = radius * cosf(radius + phase*0.2f);
displacement.SetX(rad * sinf(phase + offset));
displacement.SetY(rad * cosf(phase + offset));
return displacement;
}
case TrajectoryQuery::MODE_FOUR:
{
AZ::Vector3 displacement = AZ::Vector3::CreateZero();
displacement.SetX(radius * sinf(phase + offset));
displacement.SetY(radius*2.0f * cosf(phase + offset));
return displacement;
}
// MODE_ONE and default
default:
{
AZ::Vector3 displacement = AZ::Vector3::CreateZero();
displacement.SetX(radius * sinf(phase * 0.7f + offset) + radius * 0.75f * cosf(phase * 2.0f + offset * 2.0f));
displacement.SetY(radius * cosf(phase * 0.4f + offset));
return displacement;
}
}
} }
void TrajectoryQuery::Update(const ActorInstance* actorInstance, void TrajectoryQuery::Update(const ActorInstance* actorInstance,
@ -88,19 +57,18 @@ namespace EMotionFX::MotionMatching
} }
else else
{ {
static float phase = 0.0f; m_automaticModePhase += timeDelta * pathSpeed;
phase += timeDelta * pathSpeed; AZ::Vector3 base = SampleFunction(0.0f, pathRadius, m_automaticModePhase);
AZ::Vector3 base = SampleFunction(mode, 0.0f, pathRadius, phase);
for (size_t i = 0; i < numFutureSamples; ++i) for (size_t i = 0; i < numFutureSamples; ++i)
{ {
const float offset = i * 0.1f; const float offset = i * 0.1f;
const AZ::Vector3 curSample = SampleFunction(mode, offset, pathRadius, phase); const AZ::Vector3 curSample = SampleFunction(offset, pathRadius, m_automaticModePhase);
AZ::Vector3 displacement = curSample - base; AZ::Vector3 displacement = curSample - base;
m_futureControlPoints[i].m_position = actorInstance->GetWorldSpaceTransform().m_position + displacement; m_futureControlPoints[i].m_position = actorInstance->GetWorldSpaceTransform().m_position + displacement;
// Evaluate a control point slightly further into the future than the actual // Evaluate a control point slightly further into the future than the actual
// one and use the position difference as the facing direction. // one and use the position difference as the facing direction.
const AZ::Vector3 deltaSample = SampleFunction(mode, offset + 0.01f, pathRadius, phase); const AZ::Vector3 deltaSample = SampleFunction(offset + 0.01f, pathRadius, m_automaticModePhase);
const AZ::Vector3 dir = deltaSample - curSample; const AZ::Vector3 dir = deltaSample - curSample;
m_futureControlPoints[i].m_facingDirection = dir.GetNormalizedSafe(); m_futureControlPoints[i].m_facingDirection = dir.GetNormalizedSafe();
} }

@ -36,10 +36,7 @@ namespace EMotionFX::MotionMatching
enum EMode : AZ::u8 enum EMode : AZ::u8
{ {
MODE_TARGETDRIVEN = 0, MODE_TARGETDRIVEN = 0,
MODE_ONE = 1, MODE_AUTOMATIC = 1
MODE_TWO = 2,
MODE_THREE = 3,
MODE_FOUR = 4
}; };
void Update(const ActorInstance* actorInstance, void Update(const ActorInstance* actorInstance,
@ -64,5 +61,7 @@ namespace EMotionFX::MotionMatching
AZStd::vector<ControlPoint> m_pastControlPoints; AZStd::vector<ControlPoint> m_pastControlPoints;
AZStd::vector<ControlPoint> m_futureControlPoints; AZStd::vector<ControlPoint> m_futureControlPoints;
float m_automaticModePhase = 0.0f; //< Current phase for the automatic demo mode. Not needed by the target-driven mode.
}; };
} // namespace EMotionFX::MotionMatching } // namespace EMotionFX::MotionMatching

Loading…
Cancel
Save