립싱크

입의 움직이기 위해서는 크게 3가지 방법이 있습니다.
후술할 방법들은 립싱크를 위해서 파라미터 「PARAM_MOUTH_OPEN_Y」가 준비되어 있을 것을 전제로 작성되어 있습니다.

1.실시간으로 음량을 가져와서 입의 움직임을 직접 설정하는 방식

model->setParamFloat("PARAM_MOUTH_OPEN_Y" , xxxx ) ;//.....(A1)

model->update() 업데이트 전에 setParamFloat()의 두번째 인수를 직접 0~1사이의 값을 설정하여 입의 움직입을 제어합니다.

iPhone / Android2.3이상(※)에서는 재생중인 음량을 실시간으로 가져올 수 있습니다.
가져온 음량을 0..1 범위로 가공한 후 그 값을 위의 방법대로 설정해 립싱크를 표현하는 것이 가능합니다.
(표준 파라미터 설정대로 입의 닫힘과 열림이 0부터 1까지로 표현되어 있어야합니다)
설정할 값이 0미만 혹은 1이상이 되더라도 에러가 나진 않습니다만 이 경우 립싱크가 정상적으로 작동하지 않을 수 있습니다. 

(※):Android2.2이전 버전에서는 재생중인 음량을 실시간으로 가져올 수 없습니다.
    그외에 플랫폼 (PSP 같은)에서도 실시간으로 음량을 가져올 수 있을지 없을지 여부는 사용하는 사운드 라이브러리에 따라 다릅니다.



2.립싱크용 음량 데이터를 가져와서 설정하는 방식
립싱크용 정보를 여러가지 방법으로 가져와서 1과 같은 방법으로 설정합니다.

※「립싱크용 음량 추출 도구」에서 「.mtn 익스포트」를 OFF로 하여 쓰여진 데이터를 이용하는 경우에도 이 방식입니다.


3.립싱크용 정보를 갖고 있는 모션(.mtn) 파일을 사용하는 방식
애니메이터 혹은 「 립싱크용 음량 추출 도구」로 립싱크 정보를 포함한 .mtn 파일을 만들어 모션을 재생함으로서 립싱크를 구현할 수 있습니다.

기본적으로는 일반 모션과 립싱크용 모션은 동시에 재생할 수 있습니다.
다른 모션과 립싱크가 분리하기 위하여 립싱크만을 따로 관리하는 M
otionQueueManager 인스턴스를 생성하여 사용합니다.
mtn파일을 라이브러리에서는 특별히 구별하지 않기 때문에 일반 모션 재생하는 부분을 복사해서 사용할 수 있습니다.
※이 방식의 경우, 위의 방식들과 같이 직접 "PARAM_MOUTH_OPEN_Y"를 갱신하는 코드가 있다면 일단 제거하는 편이 좋습니다.
 만약을 위해 Live2D에 관계되어 있는 소스코드 전체에서 「PARAM_MOUTH_OPEN_Y」를 검색해 확인하는 것을 권장합니다.
  또는 기존 모션 갱신에서 파라미터를 설정해 립싱크 모션에서 갱신한 파라미터가 덮어씌워졌을 가능성도 있습니다.


Java 스타일의 의사 코드는 아래와 같습니다.

---모션 관리 클래스 추가-------------------------------------------------------------
  1. private MotionQueueManager mainMotionMgr = new MotionQueueManager (); //일반 mtn용
  2. private MotionQueueManager mouthMotionMgr= new MotionQueueManager (); //립싱크 mtn용

---갱신 추가---------------------------------------------------------------------------------
  1.         
  2. mainMotionMgr->updateParam( model ) //메인 모션을 갱신
  3.  
  4. /* 립싱크용 모션을 갱신 */
  5. mouthMotionMgr->updateParam( model );
  6.  




---모션 재생-------------------------------------------------------------------------
  1. //립싱크용 mtn으로부터 가져온 모션을 재생. 방법은 일반 모션과 같음.
  2. mouthMotionMgr->startMotion( motion , false ) ;