티스토리 뷰
에픽 게임즈의 엔지니어인 Laurent Delayen의 파라곤 애니메이션 관련 발표 자료를 보고
캐릭터들의 자연스러운 움직임에 반해서 비슷하게라도 만들어 보자는 생각에 발표자료들을 분석하며
어렵게 파라곤 에셋을 이용하여 개인 개발을 하고 있었다.
그런데 회사 프로젝트를 진행하면서 플러그인을 둘러 보던 중 엔진에 AnimDistanceMatching 이라는 플러그인이 있는 것 을
보고 순간 Laurent Delayen 의 발표자료가 생각이 났고 이 플러그인에서 정보를 얻을 수 있을 거라고 생각을 하며 소스를 열어 보았다.
하지만 플러그인 정작 구현 부분은 비어 있는 상태였고 알아보니 언제 추가가 될지는 확실할 수 없다는 답변뿐이다.
무언가 다른 기능들에 비해 우선순위가 낮던지 범용적이지 못해서 그럴 수도 있겠다는 생각이 든다.
아쉽지만 지금 진행하던 대로 분석해가며 기능 개발을 해나가는 수밖에 없을 듯 하다.
아래는 Laurent Delayen 이 공개한 애니메이션 커브에서 원하는 위치를 찾아내는 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | float UProjectABlueprintLibrary::FindPositionFromDistanceCurve(const FFloatCurve& DistanceCurve, const float& Distance, UAnimSequenceBase* InAnimSequence) { const TArray<FRichCurveKey>& Keys = DistanceCurve.FloatCurve.GetConstRefOfKeys(); const int32 NumKeys = Keys.Num(); if (NumKeys < 2) { return 0.f; } #if ENABLE_ANIM_DEBUG if (bDebugLocomotion) { // verify assumptions in DEBUG bool bIsSortedInIncreasingOrder = true; bool bHasUniqueValues = true; TMap<float, float> UniquenessMap; UniquenessMap.Add(Keys[0].Value, Keys[0].Time); for (int32 KeyIndex = 1; KeyIndex < Keys.Num(); KeyIndex++) { if (UniquenessMap.Find(Keys[KeyIndex].Value) != nullptr) { bHasUniqueValues = false; } UniquenessMap.Add(Keys[KeyIndex].Value, Keys[KeyIndex].Time); if (Keys[KeyIndex].Value < Keys[KeyIndex - 1].Value) { bIsSortedInIncreasingOrder = false; } } if (!bIsSortedInIncreasingOrder || !bHasUniqueValues) { } } #endif int32 first = 1; int32 last = NumKeys - 1; int32 count = last - first; while (count > 0) { int32 step = count / 2; int32 middle = first + step; if (Distance > Keys[middle].Value) { first = middle + 1; count -= step + 1; } else { count = step; } } const FRichCurveKey& KeyA = Keys[first - 1]; const FRichCurveKey& KeyB = Keys[first]; const float Diff = KeyB.Value - KeyA.Value; const float Alpha = !FMath::IsNearlyZero(Diff) ? ((Distance - KeyA.Value) / Diff) : 0.f; return FMath::Lerp(KeyA.Time, KeyB.Time, Alpha); } | cs |
'프로그래밍 > Unreal Engine4' 카테고리의 다른 글
Line of Sight 컴포넌트 (C++) (0) | 2019.01.30 |
---|---|
고스트 트레일 효과 (c++ /애님블루프린트) (0) | 2019.01.28 |
VIVE (SteamVR) Load Streaming Level 문제 (0) | 2018.10.22 |
GENERATED_BODY , GENERATED_UCLASS_BODY 매크로 (0) | 2018.07.10 |
파라곤 이동 중지,시작거리 예측 (0) | 2018.05.16 |