Motion Blending


22abd534f3db3db12ef7d9bb1ad82a38cfbf441b897e753010cd4bcec00a368cdcb1be21635e2ce31761b8328a5145952a14c3c9d156dc


๋ชจ์…˜ ๋ธ”๋ Œ๋”ฉ์€ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ฐ€์žฅ ๊ณ ์ „์ ์ด๊ณ  ๊ธฐ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํด๋ฆฝ์„ 'ํ˜ผํ•ฉ(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


2eb1d922e0dd07a36ab6c2ba04ee253eb0273b3c01d4cff7b1b98d7c5ea96d6bc223a27979fac050d56253ecce0de34e0b542ed6ab7178db2ef49574f8c43f06


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



2eb1d922e0dd07a36ab6c2ba04ee703c3eb5b7cc0fd43a43f934d6fb3d9b3e2de391299fb5968a195498158e94e1cd4b7addab54be4585f7a12a0612c8c91b42


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


goatzawalProject Canonical Solo developer indie gamewww.youtube.com


๊ฐœ๋ฐœ์ผ์ง€ ๋ฐ ์–ธ๋ฆฌ์–ผ ํŠœํ† ๋ฆฌ์–ผ ์œ„์ฃผ๋กœ ์˜ฌ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.