Spine animation - kuimoani/defold GitHub Wiki

Spine animation

์ด ๋งค๋‰ด์–ผ์€ ์ŠคํŒŒ์ธ(Spine)์ด๋‚˜ ๋“œ๋ž˜๊ณค ๋ณธ(Dragon Bone)์œผ๋กœ๋ถ€ํ„ฐ Defold๋กœ ์ŠคํŒŒ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Spine

์ŠคํŒŒ์ธ์€ Esoteric Software์—์„œ ๊ฐœ๋ฐœํ•œ ์„œ๋“œํŒŒํ‹ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํˆด์ด๋ฉฐ, ๊ณจ๊ฒฉ ๋ฆญ(skeletal rig)์˜ ์›€์ง์ž„์„ ์กฐ์ ˆํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ์›€์ง์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์บ๋ฆญํ„ฐ๋‚˜ ๋™๋ฌผ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ•˜๋Š”๋ฐ ํŠนํžˆ ์œ ์šฉํ•˜์ง€๋งŒ ๋ฐง์ค„, ์ž๋™์ฐจ, ๋‚˜๋ญ‡์žŽ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—๋„ ์ž˜ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Defold๋Š” ๋Ÿฐํƒ€์ž„ ํ‰๊ฐ€(runtime evaluation) ๋ฐ ์ŠคํŒŒ์ธ JSON ํฌ๋ฉง์œผ๋กœ ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Defold๋Š” ์—ญ๊ธฐ๊ตฌํ•™(IK = inverse kinematic)์„ ํฌํ•จํ•œ ์ŠคํŒŒ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋Šฅ ๋Œ€๋ถ€๋ถ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ, Defold๋Š” X ํ˜น์€ Y์ถ•(axis)์„ ๊ธฐ์ค€์œผ๋กœ ๋ผˆ๋Œ€๋ฅผ ๋’ค์ง‘๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ‚ค(animation keys)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Defolds๋Š” ๋ฉ”์‰ฌ(mesh) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜์ง€๋งŒ ์˜ค์ง ๋ผˆ๋Œ€๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹จ์ผ ๋ฒ„ํ…์Šค๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹จ์ผ ๋ฒ„ํ…์Šค(single vertices) ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ผˆ๋Œ€๋ฅผ ํ†ตํ•ด ๋ฒ„ํ…์Šค์—๋งŒ 100% ์—ฐ๊ฒฐ(bind)ํ•˜๊ณ  ๋ผˆ๋Œ€๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Concepts

Spine JSON data file

์ด ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ์Šค์ผˆ๋ ˆํ†ค, ๋ชจ๋“  ์ด๋ฏธ์ง€ ์Šฌ๋กฏ์˜ ์ด๋ฆ„, ์Šคํ‚จ, ์‹ค์ œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์„ ํƒํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ด ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”.

Spine scene

Defold ๋ฆฌ์†Œ์Šค๋Š” ์ŠคํŒŒ์ธ JSON ๋ฐ์ดํ„ฐ ํŒŒ์ผ๊ณผ ๋ผˆ๋Œ€ ์Šฌ๋กฏ(bone slots)์„ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ์ฑ„์šฐ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€ ์•„ํ‹€๋ผ์Šค๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Spine model

์ŠคํŒŒ์ธ ๋ชจ๋ธ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ๋ž˜ํ”ฝ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๊ณ , ์‚ฌ์šฉํ•  ์Šคํ‚จ๊ณผ ๋ชจ๋ธ์„ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”ํ„ฐ๋ฆฌ์–ผ์„ ์ง€์ •ํ•˜๋Š” ์Šค์ผˆ๋ ˆํ†ค ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ๊ณ„์ธต๊ตฌ์กฐ(skeleton game object hierarchy)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Spine Model ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Spine Node

GUI์”ฌ์—์„œ ์ŠคํŒŒ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ŠคํŒŒ์ธ ๋ชจ๋ธ ์ปดํฌ๋„ŒํŠธ ๋Œ€์‹  ์ŠคํŒŒ์ธ GUI ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ž์„ธํ•œ ๊ฒƒ์€ GUI Spine ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Animation tools

Defold๊ฐ€ ์ง€์›ํ•˜๋Š” ์ŠคํŒŒ์ธ JSON ๋ฐ์ดํ„ฐ ํฌ๋ฉง์€ Esoteric Software์˜ ์ŠคํŒŒ์ธ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๋“œ๋ž˜๊ณค ๋ณธ์Šค(Dragon Bones) ๋˜ํ•œ ์ŠคํŒŒ์ธ JSON ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ ์ต์ŠคํฌํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŒŒ์ธ์€ http://esotericsoftware.com ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Spine

๋“œ๋ž˜๊ณค ๋ณธ์Šค๋Š” http://dragonbones.com ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Dragon Bones

Importing a Spine character and animations

์ŠคํŒŒ์ธ์—์„œ ์ œ์ž‘ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋ชจ๋ธ์ด ์žˆ๋‹ค๋ฉด, Defold๋กœ ์ž„ํฌํŠธํ•˜๋Š” ๊ณผ์ •์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

  1. ์ŠคํŒŒ์ธ JSON ๋ฒ„์ „์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ต์ŠคํฌํŠธํ•จ
  2. ์ต์ŠคํฌํŠธ๋œ JSON ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ์•„๋ฌด๋ฐ๋‚˜ ๋ณต์‚ฌํ•จ
  3. ๋ชจ๋ธ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ํ”„๋กœ์ ํŠธ ์•„๋ฌด๋ฐ๋‚˜ ๋ณต์‚ฌํ•จ
  4. ์•„ํ‹€๋ผ์Šค ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ด๋ฏธ์ง€๋“ค์„ ์ถ”๊ฐ€ํ•จ (์•„ํ‹€๋ผ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ 2D graphics ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ )

Export JSON from Spine

๋“œ๋ž˜๊ณค ๋ณธ์ฆˆ(Dragon Bones)์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ„๋‹จํ•˜๊ฒŒ Export Data Type์„ Spine์œผ๋กœ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Image Type์œผ๋กœ๋Š” Images๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด .json ํŒŒ์ผ๊ณผ ํ•„์ˆ˜์ ์ธ ๋ชจ๋“  ์ด๋ฏธ์ง€๊ฐ€ ํด๋”๋กœ ์ต์ŠคํฌํŠธ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์œ„์˜ ์„ค๋ช…๋Œ€๋กœ Defold์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Export JSON from Dragon Bones

Defold์—์„œ ์—๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ž„ํฌํŠธํ•˜๊ณ  ์…‹์—…ํ•œ ๊ฒฝ์šฐ, ์ŠคํŒŒ์ธ ์”ฌ ํŒŒ์ผ(Spine scene file)์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ƒˆ๋กœ์šด ์ŠคํŒŒ์ธ ์”ฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•จ (๋ฉ”์ธ ๋ฉ”๋‰ด์—์„œ New > Spine Scene File ์„ ํƒ)
  2. ์ŠคํŒŒ์ธ ์”ฌ ํŒŒ์ผ์—์„œ spine_json ๊ณผ atlas ์†์„ฑ์„ ์„ค์ •ํ•ด์„œ ์ž„ํฌํŠธ๋œ JSON ํŒŒ์ผ๊ณผ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์•„ํ‹€๋ผ์Šค ํŒŒ์ผ์„ ์ฐธ์กฐํ•จ

Setup the Spine Scene

Creating SpineModel components

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ž„ํฌํŠธํ•˜๊ณ  ์ŠคํŒŒ์ธ ์”ฌ ํŒŒ์ผ์„ ์ค€๋น„ํ•˜๋ฉด, ์ŠคํŒŒ์ธ ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ SpineModel ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Creating Spine GUI nodes

๋˜ํ•œ GUI์”ฌ์—์„œ ์ŠคํŒŒ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ GUI spine ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Animating Spine models and nodes

Defold๋Š” Lua ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ๋Ÿฐํƒ€์ž„ ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ Animation ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

Atlas caveats

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ์ดํ„ฐ๋Š” ๋ผˆ๋Œ€์— ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€๋ฅผ ํŒŒ์ผ ์ ‘๋ฏธ์‚ฌ(suffix)๊ฐ€ ์ƒ๋žต๋œ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŒŒ์ธ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ŠคํŒŒ์ธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ ํ•˜๋ฉด Images ์•„๋ž˜์˜ ๊ณ„์ธต์— ๋ฆฌ์ŠคํŠธ์—… ๋ฉ๋‹ˆ๋‹ค:

Spine images hierarchy

์ด ์˜ˆ์ œ๋Š” ํ‰ํ‰ํ•œ ๊ตฌ์กฐ(flat structure)๋กœ ๋ฐฐ์น˜๋œ ํŒŒ์ผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ํด๋”๋กœ ํŒŒ์ผ๋“ค์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ํŒŒ์ผ๋“ค์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””์Šคํฌ์˜ "head_parts/eyes.png" ํŒŒ์ผ์„ ์Šฌ๋กฏ์— ์‚ฌ์šฉํ•˜๋ฉด "head_parts/eyes"๋กœ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ด๋ฆ„์€ JSON ํŒŒ์ผ๋กœ ์ต์ŠคํฌํŠธ ๋˜์–ด๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, Defold ์ด๋ฏธ์ง€ ์•„ํ‹€๋ผ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ์ด๋ฆ„์„ ์•„ํ‹€๋ผ์Šค ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ผ์น˜์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Add Images๋ฅผ ์„ ํƒํ•˜๋ฉด Defold๋Š” ์ถ”๊ฐ€๋œ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฃน(animation group)์„ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€๋งŒ ํŒŒ์ผ๋ช…์˜ ์ ‘๋ฏธ์‚ฌ(suffix)๋Š” ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฃน์— "eyes.png" ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•œ ํ›„์—” "eyes"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ค์ง ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด "head_parts/eyes"๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ด๋ฆ„์„ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฃน์„ ์ถ”๊ฐ€(์•„์›ƒ๋ผ์ธ ์ฐฝ(Outline)์˜ Atlas ๋ฃจํŠธ ๋…ธ๋“œ์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ํด๋ฆญ ํ›„ Add Animation Group ์„ ํƒ)ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฃน์˜ ์ด๋ฆ„์„ "head_parts/eyes"๋กœ ๋ฐ”๊พธ๊ณ (๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๊ณ  / ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ„ ์ด๋ฆ„์ผ ๋ฟ) ์ด ๊ทธ๋ฃน์— "eyes.png"ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Atlas path names

์ŠคํŒŒ์ธ ๋ชจ๋ธ(Spine model)์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์›€์ง์ด๊ฒŒ ํ•˜๋ ค๋ฉด Animation ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.