파라미터 조작

[마지막 갱신일: 2019/01/18]

 

CubismIdHandle

Cubism에서 매개 변수를 궁극적으로 식별하려면 매개 변수의 순서 인 Index를 받아야 합니다.
ID로 특정하는 경우에는, 파라미터의 캐릭터 라인인 ID를 조합해 가게 됩니다.
Framework에서는 조합 계산 비용을 줄이기 위해 CubismIdHandle이라는 유형을 준비했습니다.

 

Native

CubismIdHandle 형의 실태는 CubismId 클래스의 포인터형으로, 관리 클래스의 함수 CubismIdManager::GetId 함수에 의해 취득할 수 있습니다.
CubismIdManager::GetId 함수는 동일한 문자열이면 동일한 포인터를 반환하기 때문에,
CubismIdHandle끼리를 비교해 같은 포인터 주소이면, 같은 캐릭터 라인인 보증을 할 수 있습니다.

CubismIdManager 인스턴스에는 static인 CubismFramework::GetIdManager 함수로 액세스할 수 있습니다.

값의 조작 함수는 Index에 의한 액세스와 CubismIdHandle에 의한 액세스의 2개의 방법이 준비되어 있습니다.

 

Web

CubismIdHandle 유형의 실제는 CubismId 클래스의 오브젝트 유형이며 관리 클래스의 함수 CubismIdManager.getId 함수에 의해 얻을 수 있습니다.
CubismIdManager.getId 함수는 동일한 문자열이면 동일한 인스턴스를 반환하므로,
CubismIdHandle끼리를 비교해 같은 객체이면, 같은 캐릭터 라인인 보증을 할 수 있습니다.

CubismIdManager 인스턴스는 static인 CubismFramework.getIdManager 함수로 액세스할 수 있습니다.

값의 조작 함수는 Index에 의한 액세스와 CubismIdHandle에 의한 액세스의 2개의 방법이 준비되어 있습니다.

 

파라미터 설정

매개 변수는 일반적으로 모션에서 재생되지만 직접 값을 지정할 수도 있습니다.
파라미터를 조작하는 함수는, 이하와 같이, 적용하는 값의 계산 방법마다 3 종류가 있습니다.

 

1. 값 덮어쓰기

Native(C++)의 CubismModel::SetParameterValue 함수 또는 Web(TypeScript)의 CubismModel.setParameterValueById 함수를 사용합니다.
제 1 인수에 파라미터의 ID 또는 인덱스, 제 2 인수에 값, 제 3 인수에 영향도를 설정합니다.
영향도는 선택 사항이며 이 경우 1입니다.
예를 들면 0.5로 하면 이전의 값의 영향을 50% 남긴 채로 설정하게 됩니다.

 

 

2. 현재 값에 가산

Native(C++)의 CubismModel::AddParameterValue 함수 또는 Web(TypeScript)의 CubismModel.addParameterValueById 함수를 사용합니다.
인수는 Native(C++)의 CubismModel::SetParameterValue 함수 또는 Web(TypeScript)의 CubismModel.setParameterValueById 함수와 동일합니다.
이 함수로 설정한 값은, 그 파라미터에 현재 설정되어 있는 값에 가산됩니다.

 

 

3. 현재 값에 곱하기

Native(C++)의 CubismModel::MultiplyParameterValue 함수 또는 Web(TypeScript)의 CubismModel.multiplyParameterValueById 함수를 사용합니다.
인수는 Native(C++)의 CubismModel::SetParameterValue 함수 또는 Web(TypeScript)의 CubismModel.setParameterValueById 함수와 동일합니다.
이 함수로 설정한 값은 그 파라미터에 현재 설정되어 있는 값에 곱해집니다.

또, 현재의 파라미터치의 취득에는 Native(C++)의 CubismModel::GetParameterValue 함수, 또는 Web(TypeScript)의 CubismModel.getParameterValueById 함수를 사용합니다.

 

파라미터의 인덱스에 의한 지정

파라미터의 ID 지정에는, 캐릭터 라인으로부터 생성하는 ID 형으로 지정하는 방법과 인덱스로 지정하는 방법이 있습니다.
인덱스를 미리 취득하는 등 캐쉬한 후에 인덱스를 사용하는 쪽이 고속이기 때문에, 호출 빈도가 많은 경우는 인덱스의 사용을 추천합니다.
파라미터의 인덱스는 Native(C++)의 CubismModel::GetParameterIndex 함수, 또는 Web(TypeScript)의 CubismModel.getParameterIndex 함수로 취득할 수 있습니다.

 

 

파라미터 값 저장 및 복원

모델의 현재 매개 변수 값을 일시적으로 저장하려면 Native(C++)의 CubismModel::SaveParameters 함수 또는 Web(TypeScript)의 CubismModel.saveParameters 함수를 사용합니다.
이렇게하면 모든 매개 변수 값을 일시적으로 저장 한 다음 Native (C ++)의 CubismModel:: LoadParameters 함수 또는 Web (TypeScript)의 CubismModel.loadParameters 함수를 읽을 때 복원됩니다.

 

 

LAppModel::Update에서 SaveParameters, LoadParameters를 사용하는 방법

API로서의 SaveParameters, LoadParameters는 값의 보존과 호출을 실시하는 것입니다만,
실제 LAppModel::Update 함수는 LoadParameter를 호출하여 이전 상태로 재설정하며
모션 재생을 적용한 다음 SaveParameter를 실행하고 있습니다.

 

이 방법의 목적은 모션이 재생되지 않았거나 모션 재생에 의해 지정되지 않은 파라미터에
Update의 다른 조작이 들어가기 전의 값으로 덧쓰기하는 것으로, 가산·승산 계산의 베이스를 만들어 내는 것에 있습니다.

이 기능이 없는 경우는 모션으로 지정이 없는 파라미터에 Add를 실시하면, 갱신 마다 값이 Add 되어 범위 외에 값이 나오게 됩니다.

모션 재생 전의 Load만이라도 가산·곱셈의 베이스는 작성할 수 있습니다만,
모션 재생 후 Save가 들어가면 모션의 마지막 상태를 유지할 수 있게 됩니다.

 

파츠 투명도 취득/설정

파트의 불투명도 설정은 Native(C++)의 CubismModel::SetPartOpacity 함수, 또는 Web(TypeScript)의 CubismModel.setPartOpacityById 함수를,
파트의 불투명도 취득은 Native(C++)의 CubismModel::GetPartOpacity 함수, 또는 Web(TypeScript)의 CubismModel.getPartOpacityById 함수를 사용합니다.

 

 

파라미터 적용 타이밍 및 비용

파라미터의 설정시에는 파라미터치를 재기록하는 것만으로 정점 계산은 실시하지 않습니다.
매개 변수 변경 후 Native(C ++)의 CubismModel::Update 함수 또는 Web(TypeScript)의 CubismModel.update 함수로 정점을 계산합니다.
그 후 Native(C++)의 CubismRenderer::DrawModel 함수, 또는 Web(TypeScript)의 CubismRenderer.drawModel 함수로 파라미터 적용 후의 모델이 렌더링 됩니다.

 

파라미터 계산 순서의 중요성

파라미터 조작에는 덮어쓰기, 덧셈, 곱셈의 3 종류가 있습니다.
곱셈을 먼저 계산해도 나중에 덧셈이나 덮어쓰기에 영향을 주지 않습니다.
마지막으로 덮어 쓰면 이전의 모든 계산 결과가 무시됩니다.
덮어쓰기, 가산, 곱셈과 적용하는 것이 일반적입니다.

프로그램 컴포넌트 등으로 계산 내용이 확인하기 어려운 상황에서는
어떤 작업이 어떤 계산을 하는지 파악하고 순서대로 컴포넌트의 적용 순서를 설정해야 합니다.

 

위의 Gif에 표시된 눈 열림의 차이가 어떤 코드의 차이로 발생하는지 살펴 보겠습니다.
SDK에 포함된 샘플 모델의 haru에 대해서 눈꺼풀과 표정을 적용하고 있는 예가 됩니다.
표정 설정에 관해서는 눈의 개폐를 2배로 여는 f06.exp3.json을 재생하고 있는 상태입니다.
계산 순서 만 문제로 인해 C ++ 코드 만 게시합니다.

덮어쓰기 동작의 자동 눈 깜빡임 후 곱셈 동작의 표정 설정을 수행하는 A의 Update

 

곱셈 동작의 표정 설정 후, 덮어쓰기 동작의 자동 깜박임을 하는 B Update

 

A에서는 눈꺼풀 뒤에 표정의 효과로 눈이 크게 펼쳐진 것을 확인할 수 있습니다.
한편 B의 계산에서는 눈꺼풀에 덮어쓰여 표준의 눈의 개폐에 억제되어 버리고 있습니다.
계산의 순서가 다른 것만으로 모델이 표현하는 뉘앙스는 크게 달라집니다.

모션이나 표정, 기능의 계산 순서는 디자이너와도 공유해 둡시다.

© 2010 - 2022 Live2D Inc.