관리 메뉴

개발자의 코드 노트

포즈의 구조 및 동작 원리 본문

프로그래밍/Live2D

포즈의 구조 및 동작 원리

IODES 2015. 12. 20. 04:15



Live2D의 모델 파일에는 레이어의 개념으로 여러개의 포즈가 겹쳐있기 때문에,

렌더링시에는 포즈들이 겹쳐보이지 않도록 모션에 따른 적절한 처리가 필요합니다.


포즈에 관한 구체적인 설명과 예제는

공식 홈페이지의 가이드(http://goo.gl/fZIg9l)를 참고하실 수 있고,

C++ 코드를 그대로 사용한다면 프레임워크를 통해 매우 손쉽게 관리가 가능합니다.


하지만, 프레임워크를 사용하지 않는다면 이야기가 조금 달라지는데요...

현재 진행중인 프로젝트는 조금 특수하기 때문에, 프레임워크를 사용할 수 없어서,

결국 어쩔 수 없이 프레임워크를 뜯어서 포즈의 작동 원리를 알아보게 되었습니다.


참고로, 아직 저또한 포즈의 구조를 완벽하게는 이해하지 못했기 때문에,

본 포스팅에서는 포즈의 구조와 기본값, 모션에 따른 포즈 렌더링만 다루도록 하겠습니다.



포즈의 구조





포즈는 model.pose.json 등의 이름으로, JSON 형식을 취하고 있습니다.

해당 파일을 문서 편집기등으로 열어보면 group, id, link 정보를 확인할 수 있습니다.

각 그룹에 왼쪽과 오른쪽에 해당하는 파츠 아이디가 적혀있고, 그룹 안에는 포즈에 따른 파츠 목록이 있습니다.


쉽게 말해서,

A 포즈의 경우 PARTS_01_ARM_L_01 / PARTS_01_ARM_R_01 파츠를,

B 포즈의 경우 PARTS_01_ARM_L_02 / PARTS_01_ARM_R_02 파츠를 표시하는겁니다.



포즈의 기본값


모션 파일을 로드하면 기본값으로는 어떤 포즈가 선택되야 할까요?

모델 파일에 설정값이 있지는 않을까? 특정 파츠에 기본값 플래그가 있을까?

...라고 생각을 하며 소스를 분석해보았지만, 특별한 기본값 개념은 없었습니다.

정말 단순하게도, JSON 파일에 적은 순서대로, 가장 먼저 적은 포즈가 기본 포즈가 됩니다.


즉, 위의 JSON 파일의 경우,

PARTS_01_ARM_L_01 / PARTS_01_ARM_R_01 파츠의 투명도는 1.0

PARTS_01_ARM_L_02 / PARTS_01_ARM_R_02 파츠의 투명도는 0.0으로 설정됩니다.



모션에 따른 포즈 렌더링


마지막으로, 모션에 따른 포즈 렌더링입니다.

어떤식으로 구현해야지 특정 모션에 특정 포즈를 대응시킬 수 있을까요?

Live2D 레퍼런스 문서에도 나와 있지 않기 때문에, 프레임워크를 뜯어서 알아보았습니다.


특정 모션을 재생했을때, GetParamFloat(IDX) 결과값이 0이 나온다면,

해당 매개변수에 해당하는 파츠는 표시될 필요가 없는것을 의미하는데요.


특정 파츠에 해당하는 매개변수값은 GetParamIndex 함수를 통해서 알아낼 수 있습니다.

GetParamIndex("VISIBLE" + partsID)식으로 함수를 사용하면, 매개변수 값을 알려줍니다.


내용을 정리하면, 아래와 같은 코드를 실행했을때...

int paramIDX = GetParamIndex("VISIBLE" + partsID);

bool visible = (GetParamFloat(paramIDX) != 0);


visible 값이 true가 나온다면, 해당 파츠는 현재 모션 재생중에 필요한 파츠라는 뜻입니다.

반대로 false가 나온다면, 해당 파츠는 현재 모션 재생중에 숨겨져야할 파츠라는 뜻이겠지요?

이제 나머지는, 각자 SetPartsOpacity 함수를 통해 각각의 파츠 투명도를 제어해주면 되겠습니다.

'프로그래밍 > Live2D' 카테고리의 다른 글

Cubism 3의 DirectX SDK에 관하여  (2) 2018.04.22
Live2D DirectX SDK 컴파일 방법  (0) 2015.12.16
Comments