FeaturePosition.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Allocators.h>
  9. #include <EMotionFX/Source/ActorInstance.h>
  10. #include <EMotionFX/Source/EMotionFXManager.h>
  11. #include <EMotionFX/Source/EventManager.h>
  12. #include <EMotionFX/Source/TransformData.h>
  13. #include <FeatureMatrixTransformer.h>
  14. #include <FrameDatabase.h>
  15. #include <MotionMatchingInstance.h>
  16. #include <FeaturePosition.h>
  17. #include <AzCore/Serialization/EditContext.h>
  18. #include <AzCore/Serialization/SerializeContext.h>
  19. #include <MCore/Source/AzCoreConversions.h>
  20. namespace EMotionFX::MotionMatching
  21. {
  22. AZ_CLASS_ALLOCATOR_IMPL(FeaturePosition, MotionMatchAllocator)
  23. void FeaturePosition::ExtractFeatureValues(const ExtractFeatureContext& context)
  24. {
  25. const Transform invRootTransform = context.m_framePose->GetWorldSpaceTransform(m_relativeToNodeIndex).Inversed();
  26. const AZ::Vector3 nodeWorldPosition = context.m_framePose->GetWorldSpaceTransform(m_jointIndex).m_position;
  27. const AZ::Vector3 position = invRootTransform.TransformPoint(nodeWorldPosition);
  28. context.m_featureMatrix.SetVector3(context.m_frameIndex, m_featureColumnOffset, position);
  29. }
  30. void FeaturePosition::FillQueryVector(QueryVector& queryVector, const QueryVectorContext& context)
  31. {
  32. const Transform invRootTransform = context.m_currentPose.GetWorldSpaceTransform(m_relativeToNodeIndex).Inversed();
  33. const AZ::Vector3 worldInputPosition = context.m_currentPose.GetWorldSpaceTransform(m_jointIndex).m_position;
  34. const AZ::Vector3 relativeInputPosition = invRootTransform.TransformPoint(worldInputPosition);
  35. queryVector.SetVector3(relativeInputPosition, m_featureColumnOffset);
  36. }
  37. float FeaturePosition::CalculateFrameCost(size_t frameIndex, const FrameCostContext& context) const
  38. {
  39. const AZ::Vector3 queryPosition = context.m_queryVector.GetVector3(m_featureColumnOffset);
  40. const AZ::Vector3 framePosition = GetFeatureData(context.m_featureMatrix, frameIndex); // This is already relative to the root node and transformed
  41. return CalcResidual(queryPosition, framePosition);
  42. }
  43. void FeaturePosition::DebugDraw(AzFramework::DebugDisplayRequests& debugDisplay,
  44. const Pose& currentPose,
  45. const FeatureMatrix& featureMatrix,
  46. const FeatureMatrixTransformer* featureTransformer,
  47. size_t frameIndex)
  48. {
  49. const Transform relativeToWorldTM = currentPose.GetWorldSpaceTransform(m_relativeToNodeIndex);
  50. AZ::Vector3 position = GetFeatureData(featureMatrix, frameIndex);
  51. if (featureTransformer)
  52. {
  53. position = featureTransformer->InverseTransform(position, m_featureColumnOffset);
  54. }
  55. const AZ::Vector3 transformedPos = relativeToWorldTM.TransformPoint(position);
  56. constexpr float markerSize = 0.03f;
  57. debugDisplay.DepthTestOff();
  58. debugDisplay.SetColor(m_debugColor);
  59. debugDisplay.DrawBall(transformedPos, markerSize, /*drawShaded=*/false);
  60. }
  61. void FeaturePosition::Reflect(AZ::ReflectContext* context)
  62. {
  63. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  64. if (!serializeContext)
  65. {
  66. return;
  67. }
  68. serializeContext->Class<FeaturePosition, Feature>()
  69. ->Version(1);
  70. AZ::EditContext* editContext = serializeContext->GetEditContext();
  71. if (!editContext)
  72. {
  73. return;
  74. }
  75. editContext->Class<FeaturePosition>("FeaturePosition", "Matches joint positions.")
  76. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  77. ->Attribute(AZ::Edit::Attributes::AutoExpand, "")
  78. ;
  79. }
  80. size_t FeaturePosition::GetNumDimensions() const
  81. {
  82. return 3;
  83. }
  84. AZStd::string FeaturePosition::GetDimensionName(size_t index) const
  85. {
  86. AZStd::string result = m_jointName;
  87. result += '.';
  88. switch (index)
  89. {
  90. case 0: { result += "PosX"; break; }
  91. case 1: { result += "PosY"; break; }
  92. case 2: { result += "PosZ"; break; }
  93. default: { result += Feature::GetDimensionName(index); }
  94. }
  95. return result;
  96. }
  97. AZ::Vector3 FeaturePosition::GetFeatureData(const FeatureMatrix& featureMatrix, size_t frameIndex) const
  98. {
  99. return featureMatrix.GetVector3(frameIndex, m_featureColumnOffset);
  100. }
  101. } // namespace EMotionFX::MotionMatching