모션에 대해

[마지막 갱신일: 2022/01/06]

 

모션을 재생하기 전에 필요한 클래스

1. 모션 데이터를 보관 유지해, 모델에 대해서 조작하는 클래스

a. 인스턴스 생성(motion3.json 파일 로드)

b. 모션 재생 방법에 대한 설정

c. 인스턴스 폐기

2. 모션 관리 클래스

a. 인스턴스 만들기

b. 모션 재생

c. 모델의 파라미터 업데이트

d. 모션 종료

e. 사용자 트리거 수신

 

1-a. 모션 인스턴스 생성(.motion3.json 파일 로드)

모션 재생에는 ACubsimMotion 클래스에서 파생된 CubismMotion 클래스를 사용합니다.
모션에 이용하는 데이터는 확장자가 「.motion3.json」이 되고 있는 모션 파일입니다.
Cubism2.1의 「.mtn」은 사용할 수 없습니다.
이 .motion3.json 파일을 로드하려면 Native(C++)의 CubismMotion::Create 함수 또는 Web(TypeScript)의 CubismMotion.create 함수를 이용합니다.
json 파일을 한 번 로드한 다음 버퍼와 크기를 전달하여 로드합니다.

 

 

1-b. 모션 파일별 재생 방법 설정

모션에는 주로 다음 항목을 설정합니다.
이 설정은 수행하지 않고도 재생할 수 있습니다.

* 모션 시작시의 페이드 인 시간

Native(C++)의 AcubismMotion::SetFadeInTime 함수, 또는 Web(TypeScript)의 ACubismMotion.setFadeInTime 함수로 설정,
Native(C++)의 AcubismMotion::GetFadeInTime 함수, 또는 Web(TypeScript)의 ACubismMotion.getFadeInTime 함수로 얻을 수 있습니다.
페이드 인 시간을 초 단위로 지정합니다.

* 모션 종료시의 페이드 아웃 시간

Native(C++)의 AcubismMotion::SetFadeOutTime 함수, 또는 Web(TypeScript)의 ACubismMotion.setFadeOutTime 함수로 설정,
Native(C++)의 AcubismMotion::GetFadeOutTime 함수, 또는 Web(TypeScript)의 ACubismMoiton.getFadeOutTime 함수로 얻을 수 있습니다.
페이드 아웃 시간(초)을 지정합니다.

* 루프 재생 ON/OFF

Native(C++)의 void CubismMotion::IsLoop(csmBool loop) 함수, 또는 Web(TypeScript)의 CubismMotion.setIsLoop 함수로 설정,
Native(C++)의 csmBool CubismMotion::IsLoop() 함수 또는 Web(TypeScript)의 CubismMotion.isLoop 함수에서 현재 값을 얻을 수 있습니다.
true를 설정하면 종료시 처음부터 재생합니다.
다른 모션이 인터럽트되거나 종료 명령이 호출될 때까지 무한히 반복 재생합니다.
설정하지 않는 경우의 초기치는 false(루프하지 않는다)입니다.

※Framework의 루프 동작은 에디터의 루프 동작과 완전한 일치를 보증하지 않습니다.
※현재 Animator는 motion3.json 파일에 루프 설정을 반영시킬 수 없기 때문에,
Framework는 motion3.json 파일의 루프 설정을 무시하고 false를 설정합니다.

설정 예 (※이 설정은 모션 재생 전에 수행하십시오)

1-c. 인스턴스 파기

Cubism SDK for Web에서는 명시적으로 버릴 필요가 없습니다.

 

모션의 페이드 값을 파일로부터 설정하는 방법에 대해서는

A, .motion3.json 파일에 전체 값으로 설정하는 방법 (전체 페이드)

B, .motion3.json 파일에 파라미터 개별 값으로 설정하는 방법(파라미터 페이드)

C, .model3.json 파일을 전체 값으로 설정하는 방법

이 세 가지가 있으며 우선 순위는 B, C, A 순으로 적용됩니다.
지정하지 않으면 기본값인 1초가 설정됩니다.

 

 

 

2-a. 모션 관리 클래스의 인스턴스 생성

전항에서 작성한 CubismMotion 클래스의 인스턴스를 모델에 적용(애니메이션시킨다) 하기 위해서는 CubismMotionManager 클래스를 사용합니다.

 

 

2-b. 모션 재생

모션을 재생하려면 Native(C++)의 CubismMotionManager::StartMotionPriority 함수 또는 Web(TypeScript)의 CubismMotionManager.startMotionPriority 함수를 사용합니다.

첫 번째 인수: ACubismMotion 인스턴스, 모션 데이터

모션 데이터의 인스턴스를 전달합니다.
이 인수는 ACubismMotion의 파생 인스턴스인 CubismMotion 및 CubismExpressionMotion의 인스턴스를 지정할 수 있습니다.
일반적으로 하나의 모션 매니저가 취급하는 인스턴스 타입은 한쪽만으로 합니다.

두 번째 인수: Boolen, 자동 삭제 플래그

재생이 끝날 때 자동으로 모션 데이터를 삭제할지 여부를 나타내는 플래그입니다.
한 번만 재생되는 모션에 사용합니다.

세 번째 인수: Int, 우선순위

CubismMotionManager에서 관리하는 재생 시 우선 순위 설정을 지정합니다.
우선순위에 의한 재생 거부는 CubismMotionManager 의 외부에서 실시할 필요가 있습니다.
우선순위에 관해서는 페이지 하단에 있는 CubismMotionManager 항목을 참조하십시오.

모션을 여러 번 동시에 재생하려면 CubismMotionManager 인스턴스를 늘리십시오.
이것은 오른손과 왼손의 모션을 따로 제어하는 등에 사용할 수 있습니다.
모션을 동시에 재생하려면 가능한 한 동일한 파라미터를 설정하지 마십시오.
이 경우 마지막으로 업데이트한 모션의 파라미터가 유효하게 됩니다.
또한, 페이드가 깨끗하게 걸리지 않는 경우가 있습니다.

 

2-c. 모델의 파라미터 업데이트

Native(C++)의 CubismMotionManager::StartMotionPriority 함수 또는 Web(TypeScript)의 CubismMotionManager.startMotionPriority 함수에서
모션을 재생한 것만으로는 모델이 애니메이션되지 않습니다.
현재 재생중인 모션의 파라미터를 모델로 설정하려면,
매 그릴 때 Native(C++)의 CubismMotionManager::UpdateMotion 함수 또는 Web(TypeScript)의 CubismMotionmanager.updateMotion 함수를 호출합니다.

첫 번째 인수: CubismModel 인스턴스, 모션을 적용하는 모델

파라미터 정보의 취득, 조작에만 사용됩니다.

두 번째 인수: Float, 마지막 런타임과의 차이 시간

Update 등으로 계산되는 차이 시간을 입력합니다.
Float 실수로 초 단위로 입력합니다. 60FPS에서 실행하면 1/60초에 0.016을 입력하고, 30FPS에서는 1/30초에 0.03을 입력합니다.

 

입력하는 deltaTimeSeconds를 조정하여 슬로우, 정지, 빨리 감기를 할 수 있습니다.
다만, 마이너스의 값을 사용한 역재생은 고려의 범위외의 설계가 되어 있습니다.

 

 

2-d. 모션 종료

모션은 재생 시간이 지나면 자동으로 종료되지만
임의의 타이밍으로 종료하고 싶을 때는 Native(C++)의 CubismMotionQueueManager::StopAllMotions 함수,
또는 Web(TypeScript)의 CubismMotionQueueManager.stopAllMotions 함수를 사용합니다.
페이드 중간 등으로 동시에 두 개 이상의 모션을 재생하는 경우 모두 종료합니다.

 

 

2-e. 이벤트 수령

모션으로 설정된 「이벤트」가 재생되면,
CubismMotionQueueManager에 Native(C++)의 SetUserTriggerCallback 함수,
또는 Web(TypeScript)의 setUserTriggerCallback 함수로 등록한 콜백으로 호출을 받을 수 있습니다.
등록할 수 있는 콜백은 하나뿐입니다.
인스턴스의 함수를 호출하고 싶을 때는 static인 함수를 인스턴스의 포인터와 함께 등록해,
static 함수로부터 등록해 둔 인스턴스의 포인터를 사용해 목적의 함수를 호출하도록 해 주세요.
복수의 동작을 시키고 싶을 때에는 하나의 콜백으로부터 순서대로 호출하도록 해 주세요.

CubismUserModel 클래스에는 표준으로 이 메커니즘이 내장되어 있습니다.
Native(C++)의 (CubismUserModel::UserTriggerEventFired 함수, CubismUserModel::CubismDefaultUserTriggerCallback 함수)
또는 Web(TypeScript)의 (CubismUserModel.cubismDefaultUserTriggerCallback 함수)

 

모션 자동 삭제

Native(C++)의 CubismMotionQueueManager::StartMotion 함수 또는 Web(TypeScript)의 CubismMotionQueueManager.startMotion 함수를 호출할 때 두 번째 인수 autoDelete에 true를 넣으면,
모션이 재생이 끝나면 CubismMotionQueueEntry가 삭제되면 모션도 삭제됩니다.
한 번만 재생되는 파일에 사용된다고 가정합니다.

 

 

CubismMotionQueueManager 클래스와 CubismMotionManager 클래스

모션의 관리 클래스에는 CubismMotionQueueManager 클래스와,
CubismMotionQueueManager 클래스를 상속한 CubismMotionManager 클래스가 있습니다.

 

CubismMotionQueueManager

CubismMotionQueueManager는 모션 값의 적용 정도에 페이드가 적용된 전환을 담당합니다.

Native(C++)의 LAppModel::StartMotion 함수, 또는 Web(TypeScript)의 LAppModel.startMotion 함수로 모션 재생 추가 시에 이미 재생하고 있는 모션군에 대해서
StartFadeout에 의해 종료 시간의 전도를 실시합니다.

이 조작에 의해 재생중의 모션이 페이드를 가지고 새로운 모션과의 전환을 실현합니다.

 

 

CubismMotionManager

CubismMotionManager 클래스는 재생하는 모션의 우선도를 보존하는 기능과, 지금부터 재생할 예정의 우선도를 정수로서 등록하는 기능이 있습니다.
이 기록된 우선순위와 비교하여 우선순위가 낮은 모션 재생을 규제하는 기능을 만들고자 합니다.
재생 규제를 하는 부분에 대해서는 CubismMotionManager의 외부에 준비할 필요가 있습니다.

Native(C++)의 LAppModel::StartMotion 함수, 또는 Web(TypeScript)의 LAppModel.startMotion 함수는 비동기 스레드로부터의 재생에 대응하고 있습니다.
함수의 시작 부분에서 재생 우선 순위를 SetReservePriority 또는 ReserveMotion에 의해 등록됩니다.
그런 다음 로드가 수행되지만 비동기적으로 이 함수를 호출하는 경우 처음에 우선순위가 등록되므로
로드하는 동안 다른 스레드에서 다른 낮은 우선 순위 재생은 규제되는 메커니즘입니다.

재생 종료 시에는 우선도가 0으로 설정되는 것은 고정이며, 그 외의 제어는 외부에 맡겨집니다.

© 2010 - 2022 Live2D Inc.