모델에 관하여

Live2D 모델을 표시하기 위하 기본적인 흐름

1. 초기화
a. 인스턴스 생성 (moc 불러오기)
b. 텍스쳐 연결
c. 그래픽 환경 연동 (플랫폼에 따라서 필요 없을 수도 있음)
d. 표시할 위치와 크기를 지정 

2. 업데이트
a. 정점 갱신
b. 렌더링

이것이 초기화의 흐름이며 코드는 플랫폼에 따라 조금씩 다릅니다.
또한 위치, 크기의 기준도 환경에 따라 다릅니다. (샘플에서는 최대한 같을 수 있도록 작업되어있습니다)


1-a. 인스턴스 생성 (moc 불러오기)

일단 Live2D 모델의 인스턴스를 생성합니다.
생성한 인스턴스를 이용해 렌더링이나 애니메이션 조작을 할 수 있습니다.
플랫폼별로 Live2DModelXXX  (예를들어 iPhone이라면 Live2DModelIPhone)처럼 모델 클래스가 정의되어 있습니다.

moc 데이터로부터 불러오기 위해서는 각 Live2DModelXXX 클래스에 static으로 정의되어 있는 loadModel 함수를 이용합니다.
대부분의 플랫폼에는 '파일 경로를 입력 받아 읽기', '바이트 배열를 입력 받아 읽기' 이렇게 두 가지 함수가 제공됩니다.


Live2DModelXXX live2DModel = Live2DModelXXX::loadModel( path );

혹은

Live2DModelXXX live2DModel = Live2DModelXXX::loadModel( byteArray, size );

를 이용해서 불러옵니다.






1-b.텍스쳐 연결

moc파일과 텍스쳐 파일을 불러온 후에는 두 객체를 연결할 필요가 있습니다.
텍스쳐 설정은 setTexture 함수를 이용합니다.
첫번째 인수는 Modeler에서 설정한 모델 텍스쳐 번호입니다.
두번째 인수는 텍스쳐 입니다.
두번째 인수는 플랫폼(그래픽 환경)에 따라서 형식이 바뀝니다.
예를들어 OpenGL이라면 glGenTexture를 이용해 생성된 정수(texture name)입니다.


live2DModel->setTexture( 0 , texture_00 );
live2DModel->setTexture( 1 , texture_01 );
live2DModel->setTexture( 2 , texture_02 );



1-c. 그래픽 환경 연동

플랫폼에 따라서 렌더링할 때 그래픽 엔진에 직접 접근 해야할 필요가 있을 수 있습니다.
이 경우 모델에서의 설정이 필요합니다.
OpenGL이나 DirectX의 세부적인 초기화는 Live2D 내부에서는 수행하지 않기 때문에 외부에서 적절한 초기화는 필요합니다.

iPhone>  필요 없음

Android>
public void onDrawFrame(GL10 gl){
live2DModel->setGL( gl );
...
    
Flash>
live2DModel->setGraphicsContext( context3D );


DirectX>
LPDIRECT3DDEVICE9 g_pD3DDevice; 
live2DModel->setDevice(g_pD3DDevice) ;



1-d. 표시할 위치와 크기 지정

지금까지 설명한 설정만해도 모델을 렌더링할 수 있습니다만
대부분의 경우 표시 위치가 기본 좌표 기준과는 달라서 화면에 표시되지 않습니다.
아무것도 지정하지 않은 상태에서는, 모델은 왼쪽 상단을 원점으로 우측 하단으로 확장되며 이것이 Modeler에서 설정한 크기가 됩니다. (참고)
그렇기 때문에 setMatrix 함수로 행렬을 설정하여 위치와 크기를 지정합니다.
4x4 크기의 행렬을 사용합니다.
float형 16개 배열에, 순서는 OpenGL을 기준으로 삼습니다.
그리고, getCanvasWidth(),getCanvasHeight()으로 모델의 크기를 가져올 수 있습니다.

OpenGL에서의 화면 설정 예시
화면 중심으 원점으로 하여 좌측 상단(-1,1), 우측 하단(1,-1)
glViewport( 0, 0, deviceWidth, deviceHeight );
glMatrixMode( GL10.GL_PROJECTION ) ;
glLoadIdentity() ;
glOrthof( -1, 1, 1, -1, 0.5f, -0.5f );
모델의 위치 설정
화면 중심과 가로폭을 모델과 맞추는 설정
이 예에서는 직접 배열을 편집합니다만, 일반적으로는 행렬 클래스를 사용하여 설정합니다.
float matrix[16];
matrix[0]  =  2/live2DModel->getCanvasWidth();//x축 확대율
matrix[5]  =  2/live2DModel->getCanvasWidth();//y축 확대율
matrix[12] = -1;//x축 이동
matrix[13] =  1;//y축 이동
live2DModel->setMatrix( matrix );





2-a. 정점 갱신

정점 계산은 update함수에서 수행합니다. 그렇기 때문에 애니메이션을 실행하기 위해서는 매 프레임 호출해야합니다.

live2DModel->update();



2-b. 렌더링

draw함수로 모델을 렌더링합니다.

live2DModel->draw();