티스토리 뷰

 에픽 게임즈의  엔지니어인  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<floatfloat> 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


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함