워크 플로우에 의한 모션 생성의 차이에 대해

업데이트: 2022/12/08

각 SDK의 모션에 관한 특징

  Workflow for Unity Original Workflow(Native, Web, Unity, Java)
사용 기구 Mecanim CubismMotionManager (Native, Web, Java),
CubismMotionController (Unity),
Mecanim (Unity)
모션 종료 후의 미지정 요소의 거동 초기값으로 리셋 모션 종료 시의 값
파츠 간의 정합성 보호 없음 있음
모션 전환 직선 보간에서의 전환
Mecanim에서 지정한 모션 단위
파라미터는 이징 보간
파츠 불투명도는 직선 보간
3개 구획에서의 페이드값 등록이 가능

Unity, Mecanim의 특징

Workflow for Unity의 모션 제어는 Unity의 빌트인 기능인 Mecanim으로 수행됩니다.
사용하는 컴포넌트는 Animator의 그래픽 환경에서 상태 천이의 형태로 모션 컨트롤을 만듭니다.
상태 천이의 전환 제어에는 Animator로 설정할 수 있는 파라미터를 사용하며
이 파라미터의 제어에는 스크립트나 AnimationClip에 Animator 제어용 커브 등을 사용합니다.

BlendTree는 OWSDK에 없는 모션끼리의 블렌딩이 가능합니다.
이 기능은 표정의 블렌드 등에 사용하면 강력합니다.

Mecanim에 대한 자세한 내용은 Unity 공식 매뉴얼의 애니메이션을 참조하십시오.

UnitySDK로 모션을 만들 때의 주의점

파츠 정합성

가장 주의해야 할 것은 전환 파츠의 정합성입니다.
Unity에서도 Original Workflow 방식에서는 포즈 기능에 의해 자동으로 정합성이 유지되지만,
Workflow for Unity에서는 파츠의 정합성을 유지하기 위해 모션에서 Animator상의 상태 천이까지 주의해야 합니다.

・전환 파츠 모두에 정합성이 확보된 값을 입력한다.

미지정 파라미터, 파츠의 값은 Write Defaults가 설정되어 있는 경우는 초기값으로 돌아가기 때문에 예상치 못한 동작을 할 수 있습니다.

또한 레이어 기능을 사용할 때 다른 레이어의 영향을 받을 수 있습니다.

・BlendTree에 전환이 있는 모션을 넣지 않는다.

파츠의 값이 어중간하게 영향을 주어 표시가 흐트러질 수 있습니다.

모션 전환 시 선형 보간

모션의 전환 시의 보간 방법은 NativeSDK가 이징(EaseInOutSine) 보간인 데 반해,
Unity의 Mecanim이 제공하는 보간 방법은 직선 보간입니다.
이 보간 방법은 투명도 등에서는 위화감이 없지만, 회전 디포머 등의 직선 보간에서는 기계적인 인상을 받습니다.

Original Workflow의 특징

Original Workflow는 Cubism Viewer (for OW)를 사용하여 .model3.json에 등록하고 코드 호출로 모션을 제어합니다.
그래픽 환경이 아닌 대신 포즈 기능을 통해 자동 및 실시간으로 전환 파츠의 정합성을 유지합니다.
모션 종료 후에 값이 남는 특성이 있기 때문에 최종 모션을 상태 천이로 사용할 수도 있습니다.
개별적으로 합성 방법을 지정할 수 있는 표정 모션도 이용할 수 있습니다.

프로그램 개조

Original Workflow의 특징으로 열거하는 항목은 모두 SDK에 포함되는 Framework와 샘플을 그대로 사용했을 경우의 특성입니다.
Framework를 그대로 사용하거나 샘플을 기반으로 프로그램을 작성한 경우에는 앞서 언급한 특성을 이어받습니다.
그러나 Cubism SDK는 Core 이외의 프로그램은 모두 공개되어 있으므로, 애플리케이션의 사양에 맞추어 SDK 측의 구현을 변경하는 것이 가능합니다.
최종적으로는 Live2D 모델을 사용하는 프로그램의 사양을 따르십시오.

포즈 기능을 올바르게 작동시키기 위해

포즈 기능은 해당 파츠에 대한 모션으로부터의 지정을 감시하고 최초에 0이 아닌 조작을 발견한 파츠를 표시 파츠로 인식하는 방식입니다.
Workflow for Unity에서 운용할 때와 마찬가지로 모든 전환 파츠에 값을 설정할 필요가 있습니다.
또한 작은 값이라도 남아 있으면 반응하므로 비표시에 대해 확실히 0을 설정하는 것이 중요합니다.

모션에서 포즈 기능 이외의 파츠 불투명도 조작 불능

포즈 기능을 통해 파츠의 불투명도를 조작하는 관계상
파츠 조작의 지정이 없는 파츠는 설령 모션 중에 지정이 있어도 조작이 반영되지 않습니다.
단일 파츠의 표시/숨기기를 조작할 때는 쌍이 될 빈 파츠를 준비해야 합니다.

모션의 호출 특성

우선순위

CubismMotionManager를 사용하여 모션을 재생할 때 재생 우선순위를 설정하는 항목이 있습니다.
또한 앞으로 재생할 때 우선순위를 예약할 수 있습니다.
재생 중, 예약 중의 우선순위와 모션 재생 요구의 우선순위를 비교하여 재생을 선별할 수 있습니다.

csmBool CubismMotionManager::ReserveMotion(csmInt32 priority)
{
    if ((priority <= _reservePriority) || (priority <= _currentPriority))
    {
        return false;
    }

    _reservePriority = priority;

    return true;
}

페이드 지정 우선순위

Original Workflow 방식에서는 페이드 시간 지정을 3개의 구획으로 등록할 수 있습니다.

우선순위 1 2 3 4
지정 파라미터 단위 모델에 모션 등록 모션 표준 미지정 표준값(1초)
설정 방법 「페이드 값 설정」 「모션 설정」 「페이드 값 설정」  

루프 설정

현재 Cubism Animator에서는 루프 설정을 할 수 없기 때문에 Motion 파일을 읽을 때 루프 설정은 기본 False로 고정되어 있습니다.

CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size)
{
    CubismMotion* ret = CSM_NEW CubismMotion();

    ret->Parse(buffer, size);
    ret->_sourceFrameRate = ret->_motionData->Fps;
    ret->_loopDurationSeconds = ret->_motionData->Duration;

    // NOTE: Editor에서 루프가 있는 모션 내보내기는 미지원
    // ret->_loop = (ret->_motionData->Loop > 0);

    return ret;
}

모션 파일로부터의 설정을 읽으려면 상기의 주석 처리 부분을 아래와 같이 변경해 복귀시키는 것으로 가능해집니다.

    ret->_isLoop = (ret->_motionData->Loop > 0);
주의

ret->_loop는 올바른 변수 이름이 아니므로 주석 처리를 제거하고 ret->_isLoop로 기술을 변경하십시오.

또한 현재 에디터에서는 설정할 수 없으므로 모션 파일의 설정을 변경하려면 텍스트 에디터에서 직접 .motion3.json을 가공해야 합니다.

덧붙여 루프 시의 페이드 인 설정에 관해서 false를 지정하면 에디터 같은 동작이 됩니다.
루프 시의 페이드 인 설정을 변경하려면 이전 루프 설정을 지정한 다음 아래와 같이 추가하십시오.

    ret->IsLoopFadeIn(false);

루프 시의 페이드 인 설정에 관해서는 현재 모션 파일 내에 설정 항목이 없는 것에 주의해 주세요.

Loop 설정은 전환에 페이드를 사용하고 싶지만 유휴 중에는 페이드를 적용하고 싶지 않은 경우에 유효한 설정입니다.

Loop 설정을 사용하지 않는 샘플의 유휴 동작은 작동 중인 모션이 없는 경우에만 유휴 모션을 재생하기 시작하는 메커니즘입니다.
이 때문에, 샘플로부터 그대로 파생시키는 형태로 프로그램 작성할 때는
유휴 모션 전환이 눈에 띄지 않도록 고려해야 합니다.

이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.