Motion Blending
๋ชจ์ ๋ธ๋ ๋ฉ์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๊ฐ์ฅ ๊ณ ์ ์ ์ด๊ณ ๊ธฐ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก, ๋ ๊ฐ ์ด์์ ์ ๋๋ฉ์ด์ ํด๋ฆฝ์ 'ํผํฉ(Blend)'ํ์ฌ ๊ทธ ์ฌ์ด์ ์ค๊ฐ ํฌ์ฆ๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ธฐ์ ์ ๋๋ค.
1. ์ ํํ ์๋ ๋ฐฉ์
์ ๋๋ฉ์ด์ ์ ๊ฒฐ๊ตญ '์๊ฐ์ ๋ฐ๋ฅธ ๋ผ(Bone)์ ํธ๋์คํผ(์์น, ํ์ , ์ค์ผ์ผ) ๊ฐ'์ ๋๋ค.
๋ชจ์ ๋ธ๋ ๋ฉ์ ๋ ์ ๋๋ฉ์ด์ ํด๋ฆฝ(A, B)์ '๋์ผํ ๋ผ'์ ๋ํด '๊ฐ์ค ํ๊ท (Weighted Average)'์ ๊ณ์ฐํฉ๋๋ค.
- ์์: "๊ฑท๊ธฐ(Walk)" ํด๋ฆฝ๊ณผ "๋ฌ๋ฆฌ๊ธฐ(Run)" ํด๋ฆฝ์ 50%์ฉ ๋ธ๋ ๋ฉํ๋ค๋ฉด,
ย ย -ย ์ต์ข ์ด๊นจ ํ์ = (๊ฑท๊ธฐ ์ด๊นจ ํ์ * 0.5) + (๋ฌ๋ฆฌ๊ธฐ ์ด๊นจ ํ์ * 0.5)
ย ย -ย ์ต์ข ๋ค๋ฆฌ ์์น = (๊ฑท๊ธฐ ๋ค๋ฆฌ ์์น * 0.5) + (๋ฌ๋ฆฌ๊ธฐ ๋ค๋ฆฌ ์์น * 0.5)
ย ย -ย ์ด ๊ณ์ฐ์ ๋ชจ๋ ๋ผ์ ๋ํด ๋งค ํ๋ ์ ์ํํฉ๋๋ค.
2. ์ธ๋ฆฌ์ผ ์์ง์์์ ๊ตฌํ
์ธ๋ฆฌ์ผ์์ ๋ชจ์ ๋ธ๋ ๋ฉ์ ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ(AnimBP)์ ์ฌ์ฅ๊ณผ๋ ๊ฐ์ต๋๋ค.
- ๋ธ๋ ๋ ์คํ์ด์ค (Blend Space):
ย ย ๊ฐ์ฅ ๋ํ์ ์ธ ๊ตฌํ์ฒด์ ๋๋ค. 2D ๊ทธ๋ฆฌ๋(๊ฒฉ์)์ ์ฌ๋ฌ ์ ๋๋ฉ์ด์ ์ ๋ฐฐ์นํ๊ณ , ๋ ๊ฐ์ ์ ๋ ฅ ๊ฐ(์: ์๋์ ๋ฐฉํฅ)์ ๋ฐ๋ผ ์ฃผ๋ณ ์ ๋๋ฉ์ด์ ๋ค์ ์ค์๊ฐ์ผ๋ก ๋ธ๋ ๋ฉํฉ๋๋ค.
ย ย - Y์ถ์ ์๋ (0 = Idle, 200 = Walk, 600 = Run)
ย ย - X์ถ์ ๋ฐฉํฅ (-180 = ๋ค, -90 = ์ผ, 0 = ์, 90 = ์ค)
ย ย - ํ๋ ์ด์ด๊ฐ '๋๊ฐ์ ์(๋ฐฉํฅ 45)์ผ๋ก ์ฒ์ฒํ ๋ธ(์๋ 400)' ๋, ๋ธ๋ ๋ ์คํ์ด์ค๋ "Walk_Fwd", "Run_Fwd", "Walk_Right", "Run_Right" 4๊ฐ์ ์ ๋๋ฉ์ด์ ์ ์ ์ ํ ๋น์จ๋ก ์์ด "๋๊ฐ์ ์ ์กฐ๊น "์ด๋ผ๋, ์กด์ฌํ์ง ์๋ ์ ๋๋ฉ์ด์ ์ ์ค์๊ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
- ๊ธฐํ ๋ธ๋ ๋ ๋ ธ๋: Blend Poses by bool, Blend Poses by int ๋ฑ ์ํ ๋ณ๊ฒฝ ์(์: IsFalling? true๋ก ๋ณ๊ฒฝ) ์ง์ ๋ ์๊ฐ(์: 0.2์ด) ๋์ ๋ถ๋๋ฝ๊ฒ ํ ํฌ์ฆ์์ ๋ค๋ฅธ ํฌ์ฆ๋ก ๋ธ๋ ๋ฉํฉ๋๋ค.
3. ๋ชจ์ ๋ธ๋ ๋ฉ์ ํ๊ณ์
๋ธ๋ ๋ฉ์ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ์ง๋ง, ๋ ๊ฐ์ง ๊ณ ์ง์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
1.ย ๋ฐ ๋ฏธ๋๋ฌ์ง (Foot Sliding): "๋ฌ๋ฆฌ๊ธฐ"์ "๋ฉ์ถ๊ธฐ"์ฒ๋ผ ๋ฐ์ ์๋๋ ์์น๊ฐ ์ ํ ๋ค๋ฅธ ๋ ์ ๋๋ฉ์ด์ ์ ์์ผ๋ฉด, ๋ฐ์ด ๋ ์ ๊ณ ์ ๋์ง ๋ชปํ๊ณ ๋ฐ๋ฅ์ ์ค์ผ์ดํธ์ฒ๋ผ ๋ฏธ๋๋ฌ์ง๋ ํ์์ด ๋ฐ์ํฉ๋๋ค.
2.ย 'ํ๋ฆฌ๋ฉ๋ฉํ' ์์ง์ (Mushy/Generic Poses): ๋ธ๋ ๋ฉ์ 'A์ B์ ์ค๊ฐ'์ ๋ง๋ค ๋ฟ, '์๋ก์ด C'๋ฅผ ๋ง๋ค์ง ๋ชปํฉ๋๋ค. "A ๊ณต๊ฒฉ"๊ณผ "B ๊ณต๊ฒฉ"์ ์์ผ๋ฉด ๊ฐ๋ ฅํ "C ๊ณต๊ฒฉ"์ด ๋์ค๋ ๊ฒ ์๋๋ผ, ์ด๋ ์ ๋ ์๋ ํ ๋น ์ง 'ํ๋ฆฌ๋ฉ๋ฉํ' ๋์์ด ๋์ต๋๋ค.
3.ย '์ํ ๊ธฐ๊ณ ์ง์ฅ' (State Machine Hell): ์ ๋๋ฉ์ดํฐ๊ฐ ๋ชจ๋ ์ ํ ๊ท์น์ ์๋์ผ๋ก ์ ์ํด์ผ ํฉ๋๋ค. (Idle -> Walk, Walk -> Run, Run -> Stop, Run -> Jump, Idle -> Jump...). ์ ๋๋ฉ์ด์ ์ด ์๋ฐฑ ๊ฐ๊ฐ ๋๋ฉด ์ด '์ํ ๊ธฐ๊ณ(State Machine)'๋ ๋๊ตฌ๋ ๊ด๋ฆฌํ ์ ์๋ ์คํ๊ฒํฐ ๊ดด๋ฌผ์ด ๋ฉ๋๋ค.
Motion Matching
1. ๋ชจ์ ๋งค์นญ์ ํด๊ฒฐ ๋ฐฉ์
๋ชจ์ ๋งค์นญ์ ๋ชจ์ ๋ธ๋ ๋ฉ์ '์ํ ๊ธฐ๊ณ ์ง์ฅ'๊ณผ '๋ฐ ๋ฏธ๋๋ฌ์ง' ๋ฌธ์ ๋ฅผ ์ ๋ฉด์ผ๋ก ๋ํํ๊ธฐ ์ํด ๊ณ ์๋, ํจ์ฌ ์ง๋ณด๋ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ธฐ์ ์ ๋๋ค.
ํต์ฌ ์์ด๋์ด:
"๋ธ๋ ๋ฉ(ํ๊ท ๊ฐ)์ ํ์ง ๋ง์. ์ํ ๊ธฐ๊ณ๋ ๋ง๋ค์ง ๋ง์. ๋์ , ๋ฐฉ๋ํ ๋ชจ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋งค ํ๋ ์ ์ด๊ณ ์์ผ๋ก ๊ฒ์ํ์. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋ด ์บ๋ฆญํฐ์ 'ํ์ฌ ํฌ์ฆ'์ ํ๋ ์ด์ด๊ฐ '๋ฏธ๋์ ๊ฐ๊ณ ์ ํ๋ ๋ฐฉํฅ' ์ด ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๊ฐ์ฅ ์ '์ผ์น(Match)'ํ๋ '์ค์ (Real)' ์ ๋๋ฉ์ด์ ํ๋ ์์ ์ฐพ์์, ๊ทธ ์ง์ ๋ถํฐ ์ฆ์ ์ฌ์ํ์."
์ด ๋ฐฉ์์ ์ ๋๋ฉ์ดํฐ๊ฐ ์๋์ผ๋ก '์ ํ(Transition)' ๊ท์น์ ๋ง๋๋ ๋์ , ์์คํ ์ด '๊ฒ์(Search)'์ ํตํด ์ต์ ์ ์ ํ์ ์ค์ค๋ก ์ฐพ์๋ด๊ฒ ๋ง๋ญ๋๋ค.
2. ์ ํํ ์๋ ์๋ฆฌ
๋ชจ์ ๋งค์นญ์ ํฌ๊ฒ (1)๋ฐ์ดํฐ ์ค๋น(Bake) ๋จ๊ณ์ (2)๋ฐํ์(Search) ๋จ๊ณ๋ก ๋๋ฉ๋๋ค.
(a) ๋ฐ์ดํฐ ์ค๋น (Bake Time - '๋ฐ์ดํฐ๋ฒ ์ด์ค' ๊ตฌ์ถ)
1.ย ๋ชจ์ ๋ฐ์ดํฐ ์ค๋น: "Idle_to_Run", "Run_Stop"์ฒ๋ผ ์๊ฒ ์๋ฅธ ํด๋ฆฝ์ด ์๋๋ผ, ๋ฐฐ์ฐ๊ฐ ๋ช ๋ถ ๋์ ์์ ๋กญ๊ฒ ๋ฐ๊ณ , ๋ฉ์ถ๊ณ , ๋๊ณ , ๊ฑท๋ ๋ฑ์ ๊ธธ๊ณ ์ฐ์์ ์ธ(Continuous) ๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ๋๋์ผ๋ก ์ค๋นํฉ๋๋ค. (์: 30๋ถ ๋ถ๋์ ๋ฌ๋ฆฌ๊ธฐ/๊ฑท๊ธฐ/๋ฐฉํฅ์ ํ ๋ชจ์ )
2,ย 'ํน์ง ๋ฒกํฐ (Feature Vector)' ์ถ์ถ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ *๋ชจ๋ * ํ๋ ์(์๋ฐฑ๋ง ๊ฐ)์ ๋ํด ์ผ์ข ์ '์ธ๋ฑ์ค(Index)' ๋๋ '๊ผฌ๋ฆฌํ'๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๊ผฌ๋ฆฌํ๊ฐ ๋ฐ๋ก 'ํน์ง ๋ฒกํฐ'์ด๋ฉฐ, ํ์ฌ ํ๋ ์์ '์ํ'๋ฅผ ์์ฝํฉ๋๋ค.
3.ย ํน์ง ๋ฒกํฐ ๊ตฌ์ฑ: ์ด ๋ฒกํฐ์๋ "ํ์ฌ ํฌ์ฆ"์ "๋ฏธ๋ ๊ถค์ " ์ ๋ณด๊ฐ ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.
ย ย - ํ์ฌ ํฌ์ฆ (Current Pose):
ย ย ย ย - ์์ชฝ ๋ฐ์ ๋ฃจํธ(๊ณจ๋ฐ) ๊ธฐ์ค ์๋ ์์น ๋ฐ ์๋
ย ย ย ย - ์์ชฝ ์์ ๋ฃจํธ ๊ธฐ์ค ์๋ ์์น ๋ฐ ์๋ (์ ํ ์ฌํญ)
ย ย ย ย - ๋ฃจํธ(๊ณจ๋ฐ)์ ์๋ (Velocity) ๋ฐ ๊ฐ์๋ (Angular Velocity)
ย ย - ๋ฏธ๋ ๊ถค์ (Future Trajectory):
ย ย ย ย - "์ด ํ๋ ์๋ถํฐ ์ ๋๋ฉ์ด์ ์ ๊ณ์ ์ฌ์ํ๋ค๋ฉด, 0.5์ด ๋ค, 1.0์ด ๋ค, 1.5์ด ๋ค์ ์บ๋ฆญํฐ์ ๋ฃจํธ๊ฐ ์ด๋์ ์์ ๊ฒ์ธ๊ฐ?"์ ๋ํ 2D (X, Y) ์ขํ ๋ฐ ๋ฐฉํฅ.
์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํ๋ ์์ (ํ์ฌ ๋ฐ ์์น, ํ์ฌ ์ ์๋, ..., 1.5์ด ๋ค ๋ฏธ๋ ์์น)๋ผ๋ ๊ณ ์ ํ 'ํน์ง ๋ฒกํฐ' ๊ผฌ๋ฆฌํ๋ฅผ ๊ฐ๊ฒ ๋๋ฉฐ, ์ด๋ K-d tree ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ก ์ธ๋ฑ์ฑ๋์ด ์ด๊ณ ์ ๊ฒ์์ด ๊ฐ๋ฅํ๋๋ก ์ค๋น๋ฉ๋๋ค.
(a) ๋ฐํ์ (Real-Time - '๊ฒ์๊ณผ ์ ํ')
๋งค ํ๋ ์๋ง๋ค ๋ค์ ๊ณผ์ ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ๋ณต๋ฉ๋๋ค.
1)ย ์์ฒญ ์์ฑ (Player Input):
ย ย - ํ๋ ์ด์ด๊ฐ ์ปจํธ๋กค๋ฌ ์คํฑ์ '์ผ์ชฝ 45๋'๋ก '์ต๋'๋ก ๊ธฐ์ธ์ ๋๋ค.
ย ย - ์์คํ ์ ์ด ์ ๋ ฅ์ ๋ฐํ์ผ๋ก "ํ๋ ์ด์ด๊ฐ ์ํ๋ ๋ฏธ๋ ๊ถค์ (Desired Trajectory)"์ ์์ฑํฉ๋๋ค. (์: "์์ผ๋ก 1์ด ๋ค 5๋ฏธํฐ, ์ผ์ชฝ 45๋ ๋ฐฉํฅ")
2)ย ํ์ฌ ์ํ ์์ฑ (Current Character):
ย ย - ์บ๋ฆญํฐ์ 'ํ์ฌ ํฌ์ฆ ํน์ง ๋ฒกํฐ'๋ฅผ ๊ณ์ฐํฉ๋๋ค. (ํ์ฌ ๋ฐ ์์น, ์๋ ๋ฑ)
3)ย Chooser๋ฅผ ํตํ DB ์ ํ (Database Selection):
ย ย - ์บ๋ฆญํฐ๊ฐ ํ ์ ์๋ ๋ชจ๋ ๋์(๊ฑท๊ธฐ, ๋ฌ๋ฆฌ๊ธฐ, ์ ํฌ, ์์, ๋ฑ๋ฐ...)์ ๋จ ํ๋์ ๊ฑฐ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ๊ณ ๊ฒ์ํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค.
ย ย - 'Chooser(์ ํ์)'๋ ํ์ฌ ์บ๋ฆญํฐ์ '์ํ ํ๊ทธ(Tag)'๋ '๊ฒ์ํ๋ ์ด ์ด๋ฒคํธ'์ ๋ฐ๋ผ ๊ฒ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด๋ฅผ ๋์ ์ผ๋ก ์ ํํ๋ ์์ ์์คํ ์ ๋๋ค.
ย ย - ์๋ ์์:
ย ย ย ย - ํ๋ ์ด์ด๊ฐ ๊ทธ๋ฅ ์ด๋ ์ค -> 'Locomotion_DB'๋ฅผ ๊ฒ์ํ๋ผ.
ย ย ย ย - ํ๋ ์ด์ด๊ฐ "์ ํฌ ์์ธ" ๋ฒํผ์ ๋๋ฆ -> 'Combat_Locomotion_DB' (๋ฌด๊ธฐ๋ฅผ ๋ค๊ณ ์๊ฑธ์์ง ์น๋ ๋ชจ์ ์ด ํฌํจ๋ DB)๋ฅผ ๊ฒ์ํ๋ผ.
ย ย ย ย - ํ๋ ์ด์ด๊ฐ "ํํผ" ๋ฒํผ์ ๋๋ฆ -> 'Dodge_DB' (ํํผ ๋ชจ์ ๋ง ๋ชจ์๋ DB)๋ฅผ ๊ฒ์ํ๋ผ.
ย ย - ์ด 'Chooser' ๋จ๊ณ ๋๋ถ์, ์์คํ ์ '์ ํฌ ์์ธ'์์ 'ํํผ'๋ฅผ ๊ฒ์ํ๋ ๋ฑ์ ์๋ฑํ ๊ฒ์์ ํ์ง ์๊ณ , ํ์ฌ ์ํฉ์ ๋ง๋ ๊ฐ์ฅ ์ ์ ํ ๋ชจ์ ํ(Pool) ์์์๋ง ๊ฒ์์ ์ํํ์ฌ ํจ์จ๊ณผ ์ ํ์ฑ์ ๋์ ๋๋ค.
4)ย ๊ฒ์ ๋ฐ ๋น์ฉ ๊ณ์ฐ (Search & Cost Function):
ย ย - Chooser์ ์ํด ์ ํ๋ DB(์: Locomotion_DB) ์์์, ์์คํ ์ด ์์ญ๋ง ๊ฐ์ ํ๋ ์ ๊ผฌ๋ฆฌํ(ํน์ง ๋ฒกํฐ)๋ฅผ ์ด๊ณ ์์ผ๋ก ๊ฒ์ํ๋ฉฐ "๊ฐ์ฅ ์ ๋ ดํ(Best)" ํ๋ ์์ ์ฐพ์ต๋๋ค.
ย ย - ๋น์ฉ(Cost) =
ย ย ย ย ย Aย (ํ์ฌ ์บ๋ฆญํฐ์ ๋ฐ ์์น - DB ํ๋ ์์ ๋ฐ ์์น)
ย ย ย ย ย + B (ํ์ฌ ์บ๋ฆญํฐ์ ์๋ - DB ํ๋ ์์ ์๋)
ย ย ย ย ย + C (ํ๋ ์ด์ด๊ฐ ์ํ๋ ๋ฏธ๋ ๊ถค์ - DB ํ๋ ์์ ๋ฏธ๋ ๊ถค์ )
ย ย - ์ฌ๊ธฐ์ A, B, C๋ ๊ฐ์ค์น์ ๋๋ค. '๋ฏธ๋ ๊ถค์ (C)'์ ๊ฐ์ฅ ๋์ ๊ฐ์ค์น๋ฅผ ๋์ด ํ๋ ์ด์ด์ ์ ๋ ฅ(๊ฐ๊ณ ์ถ์ ๋ฐฉํฅ)์ ๊ฐ์ฅ ์ ๋ฐ์ํ๋๋ก ์ค์ ํฉ๋๋ค.
5)ย ์ต์ ํ๋ ์์ผ๋ก '์ ํ' (Jump):
ย ย - ์ด '๋น์ฉ'์ด ๊ฐ์ฅ ๋ฎ์(๊ฐ์ฅ ์ผ์นํ๋) ํ๋ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐพ์ต๋๋ค.
ย ย - ์: "Run_and_Turn" ํด๋ฆฝ์ 1245 ํ๋ ์์ด ๊ฐ์ฅ ์ ๋ ดํ๋ค๊ณ ํ๋จ๋จ.
ย ย - ์์คํ ์ ์ฆ์ ํ์ฌ ์ฌ์ ์ค์ธ ์ ๋๋ฉ์ด์ ์ ๋ฒ๋ฆฌ๊ณ , "Run_and_Turn" ํด๋ฆฝ์ 1245 ํ๋ ์๋ถํฐ ์ฌ์์ ์์ํฉ๋๋ค.
6)ย ์คํฐ์นญ ๋ฐ ๋ธ๋ ๋ฉ (Stitching & Blending):
ย ย - ์๋ฌด๋ฆฌ '๋น์ฉ์ด ๋ฎ์' ํ๋ ์์ ์ฐพ์๋ค๊ณ ํด๋, ํ์ฌ ํ๋ ์(A)๊ณผ ์๋ก ์ฐพ์ ํ๋ ์(B)์ด 100% ๋์ผํ ์๋ ์์ต๋๋ค.
ย ย - ์ด '์ ํ'๋ฅผ ํ๋ ์๊ฐ, ๋ฏธ์ธํ ํฌ์ฆ์ ์ฐจ์ด๋ก ์ธํด ์บ๋ฆญํฐ๊ฐ ๋ ๋๊ธฐ๋ 'ํ(Pop)' ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
ย ย - '์คํฐ์นญ(Stitching)'์ ์ด 'ํ' ํ์์ ์จ๊ธฐ๊ธฐ ์ํด, ์ ํ๊ฐ ์ผ์ด๋๋ ๊ทธ ์๊ฐ์ ๋งค์ฐ ์งง์ ์๊ฐ(์: 0.1์ด ~ 0.2์ด) ๋์ '๊ด์ฑ ๊ธฐ๋ฐ ๋ธ๋ ๋(Inertial Blend)'๋ฅผ ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ย ย - ์ด์ ์ ๋๋ฉ์ด์ (A)์ ๊ด์ฑ(์๋, ๊ฐ์๋)์ ์๋ก์ด ์ ๋๋ฉ์ด์ (B)์ผ๋ก ๋ถ๋๋ฝ๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ๋๋ค.
ย ย - ์ค์: ๋ชจ์ ๋งค์นญ์ ์ด๋ฏธ ๋น์ฉ ๊ณ์ฐ์ ํตํด '๊ฐ์ฅ ๋น์ทํ' ํฌ์ฆ๋ฅผ ์ฐพ์๊ธฐ ๋๋ฌธ์, ์ด ๋ธ๋ ๋ฉ์ ๋ชจ์ ๋ธ๋ ๋ฉ์ 'ํ๋ฆฌ๋ฉ๋ฉํ' ๋ธ๋ ๋์ ๋ฌ๋ฆฌ ๊ฑฐ์ ๋์ ๋์ง ์์ผ๋ฉด์ ๋ ํด๋ฆฝ์ ๋งค๋๋ฝ๊ฒ '๊ฟฐ๋งค์ค๋๋ค(Stitch)'.
3. ์ธ๋ฆฌ์ผ ์์ง์์์ ๊ตฌํ
์ธ๋ฆฌ์ผ 5๋ '๋ชจ์ ๋งค์นญ(Motion Matching)' ํ๋ฌ๊ทธ์ธ์ ์ ์์ผ๋ก ์ง์ํ๋ฉฐ, ์ด๋ Lyra ์ํ ํ๋ก์ ํธ์์ ํต์ฌ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Motion Matching Database ์ ์ ์ ๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ๋ฒ ์ดํฌ(Bake) ํฉ๋๋ค.
- Chooser Table ์ ์ ์ ๋ง๋ค์ด "์ ํฌ ์ค", "์ด๋ ์ค" ๊ฐ์ ๊ฒ์ ํ๋ ์ด ํ๊ทธ(Tag)์ ๋ฐ๋ผ ์ด๋ค DB๋ฅผ ์ฌ์ฉํ ์ง ์ ์ํฉ๋๋ค.
- ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ์์ ๊ฑฐ๋ํ State Machine ๋์ , ์ด Motion Matching ๋ ธ๋์ Chooser ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ์ฌ ํจ์ฌ ๋จ์ํ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
4. ๋ชจ์ ๋งค์นญ์ ํ๊ณ์
a)ย ๋ฐ์ดํฐ ์์กด์ฑ (Data Hungry): ๋ชจ์ ๋งค์นญ์ '๋ฐ๊ฒฌ'ํ ๋ฟ, '์ฐฝ์กฐ'ํ์ง ๋ชปํฉ๋๋ค. ๋ง์ฝ DB์ "2.5๋ฏธํฐ ์ ํ" ๋ชจ์ ์ด ์๋ค๋ฉด, ์บ๋ฆญํฐ๋ ์ ๋ 2.5๋ฏธํฐ๋ฅผ ๋ธ ์ ์์ต๋๋ค. (2.3m๋ 2.7m ๋ชจ์ ์ ์ฐพ์ ์ฌ์ํ ๋ฟ)
b)ย ์ ํํ ์ํธ์์ฉ์ ํ๊ณ: "์ ํํ 1.2๋ฏธํฐ ๋์ด์ ๋ด๋ฒผ๋ฝ"์ ๋๊ฑฐ๋, "์ ํํ ๋ด ์ 2.3๋ฏธํฐ ์ง์ ์ ์ "์ ์นผ๋ก ์ฐ๋ฅด๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. DB์ ๋ชจ๋ ๊ฑฐ๋ฆฌ์ ๋ชจ๋ ๋์ด์ ๋ชจ์ ์ ๋ฃ์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Motion Warping
1. ๋ชจ์ ์ํ์ ํด๊ฒฐ ๋ฐฉ์
๋ชจ์ ์ํ(Motion Warping)์ '์ผ๋ฐ์ ์ธ' ๋ชจ์ ํด๋ฆฝ ํ๋๋ฅผ ๊ฐ์ ธ์์, '์๊ฐ๊ณผ ๊ณต๊ฐ์ ์๊ณก(Warp)'์์ผ 'ํน์ ๋ชฉํ ์ง์ '์ ์ ํํ๊ฒ ๋ง์ถ๋ ๊ธฐ์ ์ ๋๋ค.
ํต์ฌ ์์ด๋์ด:
"์ ๋๋ฉ์ด์ ํด๋ฆฝ ์์ฒด๋ ๊ทธ๋๋ก ๋๋, ์ ๋๋ฉ์ด์ ์ ๋ฃจํธ ๋ชจ์ (Root Motion) ์๋์ ์ฌ์ ์๊ฐ(Play Rate)์ ๋์ ์ผ๋ก ์กฐ์ ํ์ฌ, ์ ๋๋ฉ์ด์ ์ 'ํต์ฌ ๋ถ๋ถ(์: ์ ์ง๊ธฐ, ๋ฐ ์ฐฉ์ง)'์ด ๋ด๊ฐ ์ํ๋ ๋ชฉํ ์ง์ (Target)์ ์ ํํ ๋๋ฌํ๋๋ก ๋ง๋ค์."
2. ๋ฃจํธ ๋ชจ์ ์ํ (Root Motion Warping / Space Warping)
"์ ๋๋ฉ์ด์ ์ '์๋(Play Rate)'๋ ๊ทธ๋๋ก ๋ ์ฑ, '์ด๋ ๊ฑฐ๋ฆฌ(Root Motion)'๋ง ๋๋ฆฌ๊ฑฐ๋ ์ค์ฌ์ ์ ํํ '์์น'์ ๋๋ฌํ๊ฒ ๋ง๋๋ ๊ธฐ์ "์ ๋๋ค.
์ด๊ฒ์ด '๋ชจ์ ์ํ'์ด๋ผ๊ณ ํ ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์์ ๋๋ค.
(a) ์์ฃผ ์ฐ์ด๋ ์ผ์ด์ค (๋ชฉํ: ์์น ๋๊ธฐํ)
- ๋ณผํ (Vaulting) / ๋ด๋ฒผ๋ฝ ๋๊ธฐ: 1.0m ํญ์ ๋ด๋ฒผ๋ฝ์ด๋ 1.2m ํญ์ ๋ด๋ฒผ๋ฝ์ด๋ , *๋จ ํ๋์* ๋ด๋ฒผ๋ฝ ๋๊ธฐ ์ ๋๋ฉ์ด์ ์ผ๋ก ์ ํํ ์์ ์ง๊ณ ์ ํํ ๋ฐ๋ํธ์ ์ฐฉ์งํด์ผ ํ ๋.
- ์ ๋ฒฝ/์ ๋ฐ ์ก๊ธฐ (Ledge Grabbing): ์ ํ ๋์ด๊ฐ ์ด์ง ๋ชจ์๋ผ๊ฑฐ๋ ๋์น ๋, ์์ ์ ๋ฒฝ ๋์ ์ ํํ '๋ถ์ฌ์ฃผ๋ฉฐ' ๋งค๋ฌ๋ฆฌ๋ ๋์.
- ๊ทผ์ ์ ํฌ (Finishing Moves, Takedowns): ๋ด ์บ๋ฆญํฐ์ ์ ์บ๋ฆญํฐ๊ฐ 2.0m ๋จ์ด์ ธ ์๋ 2.5m ๋จ์ด์ ธ ์๋ , "๋ง๋ฌด๋ฆฌ ์ผ๊ฒฉ" ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ถ๋๋ฝ๊ฒ ๊ฑฐ๋ฆฌ๋ฅผ ์กฐ์ ํ๋ฉฐ ๋ฌ๋ ค๊ฐ ์ ํํ ์์น์์ ์ฐ๋ฅด๊ธฐ ๋ชจ์ ์ด ์คํ๋์ด์ผ ํ ๋.
(b) ์ ํํ ์๋ ๋ฐฉ์
1)ย ๋ชฉํ ์ง์ ์ค์ (Warp Target):
ย ย - ๊ฒ์ ๋ก์ง(์: ๋ ์ด ์บ์คํธ)์ด ๋์ด๊ฐ์ผ ํ ๋ด๋ฒผ๋ฝ์ ์์๊ณผ ๋ ์์น๋ฅผ ๊ฐ์งํ์ฌ '์ํ ํ๊ฒ'์ผ๋ก ์ค์ ํฉ๋๋ค.
2)ย ๋๊ธฐํ ์ง์ ์ค์ (Sync Point):
ย ย - ์ ๋๋ฉ์ดํฐ๊ฐ '๋ด๋ฒผ๋ฝ ๋๊ธฐ' ์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ(Montage) ๋ด๋ถ์ '๋๊ธฐํ ์ง์ (Notify)'์ ๋ฏธ๋ฆฌ ์ฌ์ด๋ก๋๋ค.
ย ย - ์: Warp_Start (์์ ์ง๊ธฐ ์ง์ ), Warp_Land (์ฐฉ์งํ๋ ํ๋ ์).
3)ย ์ํ (Warping) ์คํ:
ย ย - ํ๋ ์ด์ด๊ฐ ๋ด๋ฒผ๋ฝ ์์์ '๋๊ธฐ' ๋ฒํผ์ ๋๋ฆ ๋๋ค.
ย ย - ๋ชจ์ ์ํ ์ปดํฌ๋ํธ๊ฐ "ํ์ฌ ๋ด ์์น"์ "๋ชฉํ ์ง์ (Warp_Start)" ์ฌ์ด์ ์ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
ย ย - ์ด '์ค์ ๊ฑฐ๋ฆฌ'์ ์ ๋๋ฉ์ด์ ์ ์ ์ฅ๋ '์๋ณธ ๋ฃจํธ ๋ชจ์ ๊ฑฐ๋ฆฌ'๋ฅผ ๋น๊ตํฉ๋๋ค.
4)ย ๊ฒฐ๊ณผ:
ย ย - Case 1: ๋ชฉํ๊ฐ ์๋ณธ๋ณด๋ค ๋ ๋ฉ ๋ (์: ์๋ณธ 2.0m vs ์ค์ 2.2m)
ย ย ย ย - ์์คํ ์ ์ ๋๋ฉ์ด์ ์ ๋ฃจํธ ๋ชจ์ ์ค์ผ์ผ์ 1.1๋ฐฐ๋ก ๋๋ฆฝ๋๋ค. (2.2 / 2.0 = 1.1)
ย ย ย ย - ์บ๋ฆญํฐ๋ ์ ๋๋ฉ์ด์ ์ฌ์ ์๊ฐ(์: 1์ด) ๋์ *๋ ๋น ๋ฅธ ์๋๋ก* ์์ง์ฌ 2.2m๋ฅผ ์ด๋ํฉ๋๋ค.
ย ย ย ย - ์ ๋๋ฉ์ด์ ์์ฒด์ '์ฌ์ ์๋(Play Rate)'๋ 1.0x๋ก ์ ์ง๋ฉ๋๋ค. ์์ ์ง๋ ๋์์ ์ ์ ์๋์ง๋ง, ๊ทธ ๋์์ ์ํํ๋ ๋ชธ์ ์ด๋(๋ฃจํธ ๋ชจ์ )๋ง ๋นจ๋ผ์ง๋๋ค.
ย ย - Case 2: ๋ชฉํ๊ฐ ์๋ณธ๋ณด๋ค ๋ ๊ฐ๊น์ธ ๋ (์: ์๋ณธ 2.0m vs ์ค์ 1.8m)
ย ย ย ย - ์์คํ ์ ์ ๋๋ฉ์ด์ ์ ๋ฃจํธ ๋ชจ์ ์ค์ผ์ผ์ 0.9๋ฐฐ๋ก ์ค์ ๋๋ค. (1.8 / 2.0 = 0.9)
ย ย ย ย - ์บ๋ฆญํฐ๋ ๊ฐ์ 1์ด ๋์ ๋ ๋๋ฆฐ ์๋๋ก ์์ง์ฌ 1.8m๋ง ์ด๋ํฉ๋๋ค.
ย ย ย ย - ๋ง์ฐฌ๊ฐ์ง๋ก, ์ ๋๋ฉ์ด์ ์ '์ฌ์ ์๋'๋ 1.0x์ ๋๋ค.
์ด์ฒ๋ผ ๊ณต๊ฐ(Space)์ ์๊ณก์์ผ, ์ ๋๋ฉ์ด์ ํด๋ฆฝ์ '๋์'์ ์ ์งํ๋ '์ด๋ ๊ฑฐ๋ฆฌ'๋ง ๋ชฉํ์ ์ ํํ ๋ง์ถฅ๋๋ค.
3. ํ์ ์ํ (Time Warping)
"์ ๋๋ฉ์ด์ ์ '์ด๋ ๊ฑฐ๋ฆฌ(Root Motion)'๋ ๋ฌด์ํ๊ณ , '์ฌ์ ์๋(Play Rate)' ์์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ๋๋ ๋๋ฆฌ๊ฒ ์กฐ์ ํ์ฌ, ํน์ ํ๋ ์์ด ์ ํํ '์๊ฐ'์ ์ฌ์๋๋๋ก ๋ง์ถ๋ ๊ธฐ์ "์ ๋๋ค.
์ด ๋ฐฉ์์ '์์น'๊ฐ ์๋๋ผ 'ํ์ด๋ฐ'์ด ์ค์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
(a) ์์ฃผ ์ฐ์ด๋ ์ผ์ด์ค (๋ชฉํ: ์๊ฐ ๋๊ธฐํ)
- ํจ๋ง / ์นด์ดํฐ ๊ณต๊ฒฉ (Counter):
ย ย - ์ ์ ๊ณต๊ฒฉ์ด 0.4์ด ๋ค์ ๋์๊ฒ ๋ฟ์ ์์ ์ ๋๋ค.
ย ย - ๋ด 'ํจ๋ง' ์ ๋๋ฉ์ด์ ์ '๋ฐฉ์ด ์ฑ๊ณต' ํ๋ ์์ 0.5์ด(30ํ๋ ์)์ ์์ต๋๋ค.
ย ย - ์ด๋๋ก๋ผ๋ฉด 0.1์ด ๋ฆ๊ฒ ๋ฐฉ์ดํด์ ๊ณต๊ฒฉ์ ๋ง๊ฒ ๋ฉ๋๋ค.
ย ย - ํ์ ์ํ์ด ์๋ํ์ฌ, 'ํจ๋ง' ์ ๋๋ฉ์ด์ ์ ์ฌ์ ์๋๋ฅผ 1.25๋ฐฐ๋ก ๋์ ๋๋ค. (0.5 / 0.4 = 1.25)
ย ย - ๊ทธ ๊ฒฐ๊ณผ, ๋ด '๋ฐฉ์ด ์ฑ๊ณต' ํ๋ ์์ด ์ ํํ 0.4์ด ๋ค์ ์ฌ์๋์ด ์ ์ ๊ณต๊ฒฉ์ ์๋ฒฝํ๊ฒ ๋ง์๋ ๋๋ค.
- ์ก๊ธฐ (Grabs): ์ ์๊ฒ ์ก๊ธฐ ๊ธฐ์ ์ ์๋ํ ๋, ์ ์ด ์ด์ง ํํผํ๋ ๋ชจ์ (0.6์ด)์ ์ฌ์ํ์ต๋๋ค. ๋ด ์ก๊ธฐ ์ ๋๋ฉ์ด์ ์ '์์ด ๋ฟ๋' ํ๋ ์(0.5์ด)์ ์ ์ ํํผ๊ฐ ๋๋๋ 0.6์ด์ ์ ํํ ๋ง์ถ๊ธฐ ์ํด, ๋ด ์ ๋๋ฉ์ด์ ์๋๋ฅผ 0.83๋ฐฐ๋ก *๋๋ฆฌ๊ฒ* ์ํํ์ฌ ํ์ด๋ฐ์ ๋ง์ถ ์ ์์ต๋๋ค.
- ํ๋ ์ํธ์์ฉ (Co-op Interaction): ๋ ํ๋ ์ด์ด๊ฐ ๋์์ ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋ ์ ์ํ๋ ์ ๋๋ฉ์ด์ ์ ์ฌ์ํ ๋, ๋ ์ฌ๋์ ์ ๋๋ฉ์ด์ ์์ ์๊ฐ์ด ๋ฌ๋ผ๋ '์์ด ๋ง๋ฟ๋' ํ๋ ์์ ๋์ผํ ์๊ฐ์ ์ฌ์๋๋๋ก ์ฌ์ ์๋๋ฅผ ์กฐ์ ํฉ๋๋ค.
(b) ์ ํํ ์๋ ๋ฐฉ์
1)ย ๋ชฉํ ์๊ฐ ์ค์ (Warp Target Time): ๊ฒ์ ๋ก์ง์ด '์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ผ ํ๋ ์ ํํ ์๊ฐ' (์: 0.4์ด ๋ค)์ ๊ณ์ฐํฉ๋๋ค.
2)ย ๋๊ธฐํ ์ง์ ์ค์ (Sync Point): ์ ๋๋ฉ์ดํฐ๊ฐ ๋ชฝํ์ฃผ์ 'ํต์ฌ ์ด๋ฒคํธ ํ๋ ์' (์: ํจ๋ง ์ฑ๊ณต ํ๋ ์)์ ๋งํนํฉ๋๋ค. ์ด ํ๋ ์์ ์๋ณธ ์๊ฐ(์: 0.5์ด)์ ์์คํ ์ด ์๊ณ ์์ต๋๋ค.
3)ย ์ํ (Warping) ์คํ: ์์คํ ์ด '๋ชฉํ ์๊ฐ'(0.4์ด)๊ณผ '์๋ณธ ์๊ฐ'(0.5์ด)์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค.
4)ย ๊ฒฐ๊ณผ: ์ ๋๋ฉ์ด์ ์ ์ฒด์ ์ฌ์ ์๋(Play Rate)๋ฅผ '์๋ณธ ์๊ฐ / ๋ชฉํ ์๊ฐ' (0.5 / 0.4 = 1.25๋ฐฐ)๋ก ๋ณ๊ฒฝํ์ฌ ๋ชฝํ์ฃผ๋ฅผ ์ฌ์ํฉ๋๋ค.
4. ์ธ๋ฆฌ์ผ ์์ง์์์ ๊ตฌํ
- ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ์ Motion Warping Component๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ(Montage)์ย Add Motion Warp Window ๋ ธํฐํ์ด๋ฅผ ์ถ๊ฐํ๊ณ , Warp Target Name (์: "VaultTarget")์ ์ง์ ํฉ๋๋ค.
- ๋ฃจํธ ๋ชจ์ ์ํ (Space):
ย ย - ์บ๋ฆญํฐ BP์์ ๋ด๋ฒผ๋ฝ ์์น๋ฅผ ๊ณ์ฐํ ๋ค, AddOrUpdateWarpTargetFromLocation ๋ ธ๋๋ฅผ ํธ์ถํ์ฌ "VaultTarget"์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ํด๋น ์์น ์ขํ๋ฅผ ๋ฑ๋กํฉ๋๋ค.
ย ย - ์ดํ ๋ชฝํ์ฃผ๋ฅผ ์ฌ์ํ๋ฉด, ์ปดํฌ๋ํธ๊ฐ ์์์ ํด๋น ๋ ธํฐํ์ด ๊ตฌ๊ฐ์์ ๋ฑ๋ก๋ "VaultTarget" ์์น๋ก ๋ฃจํธ ๋ชจ์ ์ ์๊ณกํฉ๋๋ค.
- ํ์ ์ํ (Time):
ย ย - AddOrUpdateWarpTargetFromLocation ๋์ , AddOrUpdateWarpTargetFromProvider ๋ฑ์ ์ฌ์ฉํ๊ณ ํน์ ํ์ด๋ฐ ๊ณ์ฐ ๋ก์ง์ ๋ฐ์ธ๋ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค. (๋ค์ ๋ ๋ณต์กํ ์ค์ ์ด ํ์)
Unreal Animation Framework (UAF)
1. ๊ธฐ์กด ๊ธฐ์ (์ํ, ๋งค์นญ)์ ํ๊ณ์
๋ชจ์ ๋งค์นญ๊ณผ ๋ชจ์ ์ํ์ ํ ์บ๋ฆญํฐ๊ฐ ํ๊ฒฝ์ด๋ ๋ชฉํ ์ง์ ๊ณผ ์ํธ์์ฉ(๋ด๋ฒผ๋ฝ ๋๊ธฐ, ์ ์๊ฒ ์ ๊ทผํ๊ธฐ)ํ๋ ๋ฐ๋ ํ์ํ์ต๋๋ค. ํ์ง๋ง ์์ง์ด๋ ๋ค๋ฅธ ์บ๋ฆญํฐ์ ํฝ์ ๋จ์๋ก ์ ํํ๊ฒ ์ํธ์์ฉํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
- ๋ฌธ์ (Takedown / ์ก๊ธฐ ๊ธฐ์ ):
ย ย 1.ย ์์ ์์น ๋ฌธ์ : ํ๋ ์ด์ด๊ฐ ์ ๋ค์์ '์ก๊ธฐ'๋ฅผ ์๋ํฉ๋๋ค. ๋ชจ์ ์ํ์ ์ฌ์ฉํด ํ๋ ์ด์ด๊ฐ ์ ์ ๋ฑ ๋ค ํน์ ์ขํ๊น์ง๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
ย ย 2.ย ๋๊ธฐํ ๋ฌธ์ : ํ์ง๋ง ํ๋ ์ด์ด๊ฐ ์ก๋ ์๊ฐ, ์ ๋ํ '์กํ๋' ์ ๋๋ฉ์ด์ ์ ์ ํํ ๊ฐ์ ํ์ด๋ฐ์ ์ฌ์ํด์ผ ํฉ๋๋ค.
ย ย 3.ย '๋ถ๋ฆฌ' ๋ฌธ์ : ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ์ ๋๋ค. ํ๋ ์ด์ด๋ '์ก๊ธฐ' ๋ชฝํ์ฃผ(๋ฃจํธ ๋ชจ์ ํฌํจ)๋ฅผ, ์ ์ '์กํ๋' ๋ชฝํ์ฃผ(๋ฃจํธ ๋ชจ์ ํฌํจ)๋ฅผ ๊ฐ์ ์ฌ์ํฉ๋๋ค. ๋ ์ ๋๋ฉ์ด์ ์ ์๋ ํ๋์ ์ธํธ๋ก ์ ์๋์์ง๋ง, ๋ฏธ์ธํ ์ค์ฐจ๋ ๋ฌผ๋ฆฌ ์ถฉ๋, ์งํ์ ์์ ๋จ์ฐจ๋ก ์ธํด ๋ ์บ๋ฆญํฐ๊ฐ ๋ถ๋ฆฌ๋๊ฑฐ๋(Drift Apart), ํ ๋ช ์ด ๋ ์ ๋ฌปํ๊ฑฐ๋, ์์ด ์ด๊นจ๋ฅผ ๋ซ๋(Clipping) ํ์์ด ๋ฐ์ํฉ๋๋ค.
- ํต์ฌ ํ๊ณ: ๋ ๊ฐ(์ด์)์ ๋ ๋ฆฝ์ ์ธ ์ค์ผ๋ ํ ๋ฉ์ ์กํฐ๊ฐ ์ ๋๋ฉ์ด์ ์ด ์ฌ์๋๋ ๋ด๋ด ์๋ฒฝํ๊ฒ ๋๊ธฐํ๋ ์ํ๋ฅผ ์ ์งํ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
2. UAF์ ํด๊ฒฐ ๋ฐฉ์
UAF๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด "์ํธ์์ฉ์ด ์์๋๋ฉด, ๋ ์บ๋ฆญํฐ๋ฅผ ์ผ์์ ์ผ๋ก ํ๋์ ์ ๋(Unit)์ฒ๋ผ ๋ฌถ์ด๋ฒ๋ฆฌ์"๋ผ๋ ์์ด๋์ด๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ ๋จ์ผ ๋ ธ๋๊ฐ ์๋๋ผ, ๋ชจ์ ์ํ, ์ปจํธ๋กค ๋ฆญ(IK), ๋์ ๋ถ์ฐฉ(Attachment) ๊ธฐ์ ์ ์ ๊ธฐ์ ์ผ๋ก ๊ฒฐํฉํ '๊ตฌํ ๋ฐฉ์์ ์ฝ์(Framework)'์ ๋๋ค.
ํต์ฌ์ ์ํธ์์ฉ์ ์ฐธ์ฌํ๋ ์บ๋ฆญํฐ๋ค์๊ฒ '์ญํ (Role)'์ ๋ถ์ฌํ๋ ๊ฒ์ ๋๋ค.
- ์ฃผ๋์ (Lead): ์ํธ์์ฉ์ ์์ํ๊ณ ์ ์ฒด ์์ง์์ ์ด๋๋ ์บ๋ฆญํฐ (์: ์ก๊ธฐ๋ฅผ ์๋ํ๋ ํ๋ ์ด์ด)
- ์ถ์ข ์ (Follower): ์ํธ์์ฉ์ ๋ฐ์ํ๋ ์บ๋ฆญํฐ (์: ์กํ๋ ์ )
3. ์ ํํ ์๋ ๋ฐฉ์
"ํ๋ ์ด์ด(์ฃผ๋์)๊ฐ ์ (์ถ์ข ์)์ ๋ค์์ ์ก์ ๋์ด๋จ๋ฆฐ๋ค"๋ ์ํธ์์ฉ์ UAF์์ ๋ค์๊ณผ ๊ฐ์ 4๋จ๊ณ๋ก ์๋ํฉ๋๋ค.
a) ์ ๊ทผ (Approach) - (๋ชจ์ ์ํ)
- ํ๋ ์ด์ด๊ฐ '์ก๊ธฐ' ๋ฒํผ์ ๋๋ฆ ๋๋ค.
- ์์คํ ์ ์ ์ ์์น๋ฅผ Warp Target์ผ๋ก ์ค์ ํฉ๋๋ค.
- ํ๋ ์ด์ด๋ ๋ชจ์ ์ํ(Motion Warping)์ ์ฌ์ฉํด '์ก๊ธฐ ์ค๋น' ์ ๋๋ฉ์ด์ ์ ์ฌ์ํ๋ฉฐ ์ ์ ๋ฑ ๋ค๋ก ์ ํํ๊ฒ ์ ๊ทผํฉ๋๋ค. (์ฌ๊ธฐ๊น์ง๋ ์ด์ ๋จ๊ณ์ ๋์ผ)
b) ์ฒด๊ฒฐ (Engage) - (๋์ ๋ถ์ฐฉ ๋ฐ ์ญํ ํ ๋น)
- ํ๋ ์ด์ด์ ๋ชจ์ ์ด ์ ์๊ฒ ๋ฟ๋ '๋๊ธฐํ ์ง์ (Sync Point)'์ ๋๋ฌํฉ๋๋ค.
- UAF์ ํต์ฌ์ ๋๋ค:
ย ย 1.ย ์ญํ ํ ๋น: ํ๋ ์ด์ด๋ ์ฃผ๋์(Lead), ์ ์ ์ถ์ข ์(Follower) ์ญํ ์ ๋ถ์ฌ๋ฐ์ต๋๋ค.
ย ย 2.ย ๋์ ๋ถ์ฐฉ (Dynamic Attachment): ์ถ์ข ์(์ )๋ฅผ ์ฃผ๋์(ํ๋ ์ด์ด)์ ํน์ ๋ณธ(Bone)์ด๋ ์์ผ์ ์ผ์์ ์ผ๋ก ๋ถ์ฐฉ(Attach)์ํต๋๋ค.
ย ย 3.ย ๋ฃจํธ ๋ชจ์ ์ ์ด๊ถ ์ด์:
ย ย ย ย - ์ฃผ๋์(ํ๋ ์ด์ด)๋ '์ก๊ธฐ' ์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ๋ฅผ ์ฌ์ํฉ๋๋ค. ์ด ๋ชฝํ์ฃผ์๋ ๋ ์บ๋ฆญํฐ๊ฐ ํจ๊ป ๋์ด์ง๋ ์ ์ฒด ๋ฃจํธ ๋ชจ์ (Root Motion)์ด ํฌํจ๋์ด ์์ต๋๋ค.
ย ย ย ย - ์ถ์ข ์(์ )๋ '์กํ๋' ์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ๋ฅผ ์ฌ์ํฉ๋๋ค. ๋จ, ์ด ๋ชฝํ์ฃผ์ ๋ฃจํธ ๋ชจ์ ์ 0์ด๊ฑฐ๋ ์์ ํ ๋ฌด์๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ: ์ด์ ์ ์ ์์ ์ ๋ฃจํธ ๋ชจ์ ์ผ๋ก ์์ง์ด๋ ๊ฒ์ด ์๋๋ผ, ํ๋ ์ด์ด์๊ฒ '๋ถ์ฐฉ'๋ ์ํ๋ก ํ๋ ์ด์ด์ ๋ฃจํธ ๋ชจ์ ์ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค. ๋ ์บ๋ฆญํฐ๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋ ์ ์๋ ํ๋์ ์ ๋๋ฉ์ด์ ์ ๋์ด ๋ฉ๋๋ค.
c) ํฌ์ฆ ๋ณด์ (Pose Correction) - (IK / ์ปจํธ๋กค ๋ฆญ)
- ์ด์ ๋ ์บ๋ฆญํฐ๋ ์ฐฐ์น ๋ถ์ด์ ํจ๊ป ์์ง์ด์ง๋ง, ์ฌ์ํ ๋ฌธ์ ๊ฐ ๋จ์์์ต๋๋ค. ์ ์ด ํ๋ ์ด์ด๋ณด๋ค ํค๊ฐ ํฌ๊ฑฐ๋ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
- ํ๋ ์ด์ด์ '์ก๋ ์'์ ํ๊ณต์ ์ง๊ฑฐ๋, ์ ์ ์ด๊นจ๋ฅผ ํ๊ณ ๋ค(Clipping) ๊ฒ์ ๋๋ค.
- ์๋ ๋ฐฉ์:
ย ย 1.ย ์ฃผ๋์(ํ๋ ์ด์ด)์ ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ์์, ์ปจํธ๋กค ๋ฆญ(Control Rig)์ด๋ IK ๋ ธ๋๊ฐ ์ค์๊ฐ์ผ๋ก ์๋ํฉ๋๋ค.
ย ย 2.ย ํ๋ ์ด์ด์ ์ผ์ ์ปจํธ๋กค๋ฌ๊ฐ ์ถ์ข ์(์ )์ ์ด๊นจ ์์ผ ์์น๋ฅผ ์ค์๊ฐ์ผ๋ก ์ถ์ (Targeting)ํ๋๋ก ์ค์ ํฉ๋๋ค.
ย ย 3.ย ์ ์ ํค๊ฐ ํฌ๋ฉด ํ๋ ์ด์ด์ ์์ด IK์ ์ํด ์๋ณธ ์ ๋๋ฉ์ด์ ๋ณด๋ค ๋ ์๋ก ์ฌ๋ผ๊ฐ ์ด๊นจ๋ฅผ ์ง๊ณ , ํค๊ฐ ์์ผ๋ฉด ์์ด ๋ ๋ด๋ ค์ต๋๋ค.
- ๊ฒฐ๊ณผ: ๋ ์บ๋ฆญํฐ๊ฐ ํจ๊ป ์์ง์ผ ๋ฟ๋ง ์๋๋ผ, ์ค์๊ฐ IK ๋ณด์ ์ ํตํด ์๋ก ๋ค๋ฅธ ์ฒดํ์ด๋ ๋ฏธ์ธํ ์์น ์ฐจ์ด์๋ ๋ถ๊ตฌํ๊ณ ์๊ณผ ๋ชธ์ด ํญ์ ์ ํํ๊ฒ ๋ง๋ฟ์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. (์ด๋ฅผ ์ ๋๋ฉ์ด์ ์ํ(Animation Warping) ๋๋ ํฌ์ฆ ์ํ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.)
d) ํด์ (Disengage)
- '์ก๊ธฐ' ์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ๊ฐ ๋๋๋ ์ง์ ์ ๋๋ฌํฉ๋๋ค.
- ์ถ์ข ์(์ )์ ์ฃผ๋์(ํ๋ ์ด์ด) ๊ฐ์ ๋์ ๋ถ์ฐฉ(Attachment)์ ํด์ ํฉ๋๋ค.
- ๋ ์บ๋ฆญํฐ๋ UAF ์ํ๋ฅผ ๋ฒ์ด๋, ๋ค์ ๊ฐ์์ ์ผ๋ฐ์ ์ธ ์ ๋๋ฉ์ด์ ๋ก์ง(์: ๋ชจ์ ๋งค์นญ)์ผ๋ก ๋์๊ฐ '์ผ์ด๋๋' ์ ๋๋ฉ์ด์ ๋ฑ์ ์ฌ์ํฉ๋๋ค.
4. ์์ฝ
UAF๋ ๋ชจ์ ์ํ์ผ๋ก ์ํธ์์ฉ์ ์์ํ๊ณ , ๋์ ๋ถ์ฐฉ๊ณผ ๋ฃจํธ ๋ชจ์ ์ ์ด๊ถ ์ด์(์ฃผ๋์/์ถ์ข ์)์ผ๋ก ๋ ์บ๋ฆญํฐ๋ฅผ ํ๋๋ก ๋ฌถ์ด ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ์ค์๊ฐ IK/์ปจํธ๋กค ๋ฆญ์ผ๋ก ํฌ์ฆ๋ฅผ ๋ณด์ ํ์ฌ ํด๋ฆฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋, ๋ค์ ์บ๋ฆญํฐ ์ํธ์์ฉ์ ์ํ ์๋ฒฝํ '์ข ํฉ ํ๋ ์์ํฌ'์ ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
https://youtu.be/tNw9lD2PW3U?si=c_tW3xK05liafnZX
https://youtu.be/FLDXtAV7qsw?si=TMJccKy4R-8lWbjY
https://youtu.be/MIhnv29csSQ?si=Se4TcCh9M6mTadKA
https://youtu.be/kO6pz8ADgcU?si=D3miaEjIakrHTGcA
https://youtu.be/v4slYkeuJmg?si=0Qfwmysc-bfathPm
๋์์ด ๋์ จ๋ค๋ฉด ๊ฐ๋ฐ ์ค์ธ ๊ฒ์ ํ๋ก์ ํธ์ ์ ํฌ๋ธ ์ฑ๋ ๊ตฌ๋ ๋ถํ๋๋ฆฝ๋๋ค..
https://www.youtube.com/@goatzawal
๊ฐ๋ฐ์ผ์ง ๋ฐ ์ธ๋ฆฌ์ผ ํํ ๋ฆฌ์ผ ์์ฃผ๋ก ์ฌ๋ฆด ์์ ์ ๋๋ค.
UAF๋ ในใ ํ์ ์ด๋ค
@์์นจ๋นต ๋ฐํ ์์ ๋ด๋ ํฐ๊ฑฐ ์๋ค๋ ์์ผ๋ก ๋งํ๋๋ผ๊ณ ์ใ ใ
์ข์ ๊ธ ๊ฐ์ฌ ๊ทผ๋ฐ ํจ๋ง๋ง์ด์ผ ๋ณดํต ์์ธ๋ผ์ดํฌ์์ ์ ํํ ํ๋ ์ ๊ตฌ๊ฐ์ ์ ํ๋๊ฒ ์ผ๋ฐ์ ์ด์ง์์? ํจ๋ง ํ๋ ์์ ์กฐ์ํ๊ธฐ๋ํ๋? - dc App
ํจ๋ง์ด ์ฑ๊ณตํ๋ ์๊ฐ ๊ตฌ๊ฐ ๋์ค ๋๋ฅด๋ฉด ์ ์ ๊ณต๊ฒฉ์ด ๋ฟ๋ ์๊ฐ์ ๋ง์ถฐ ํจ๋ง์ด ๋๋ ์ํฉ์ ๋งํ๋ ๊ฒ ๊ฐ์์. ๋คํฌ์์ธ์ ์๋ ํจ๋ง์ด ํ์ด๋ฐ๋ ์งง๊ณ ์ฟจํ์์ด ๊ธธ์ด ์ฒด๊ฐ์ด ์๋๋ ๊ฒ ๊ฐ์๋ฐ, ์์ธ๋ผ์ดํฌ์์ ์ฝ๊ฐ ๋ฒ์ด๋ ์ธํค๋ก, ๊ณ ์ค์ฐ, ์ค๋ธ๊ฐ์ ๊ฒฝ์ฐ๋ ํจ๋ง ์ฑ๊ณต ๊ตฌ๊ฐ์ด ๋ ๋์ ๊ฒ ๊ฐ๊ณ ์. ์ ํํ๊ฑด ์ ๋ ๊ตฌํํด๋ณด๋ฉด์ ์์๊ฐ์ผ๊ฒ ๋ค์
์บฌ ์ ๋ณด์ถ
์ ๊ฐ์ถ - dc App