자동 눈 깜빡임
업데이트: 2023/01/26
눈 깜빡임에 사용할 파라미터 특정
자동 눈 깜빡임 효과 기능을 사용하면 모델에 임의의 눈 깜빡임 동작을 적용할 수 있습니다.
자동 눈 깜빡임 효과를 적용하려면 다음과 같이 처리하십시오.
・.model3.json 파일에 기술된 자동 눈 깜빡임 효과 값을 적용하는 파라미터와의 매칭
・눈 깜빡임 시간 간격을 설정하고 업데이트 처리를 호출합니다.
이 중 .model3.json 파일에 기술된 자동 눈 깜빡임 효과와 파라미터를 연관시키는 정보는 ICubismModelSetting 인터페이스를 구현하는 CubismModelSettingJson 클래스를 활용하여 얻을 수 있습니다.
// C++
csmInt32 eyeBlinkCount = _modelSetting->GetEyeBlinkParameterCount();
for (csmInt32 i = 0; i < eyeBlinkCount; i++)
{
CubismIdHandle eyeblinkParameter = _modelSetting->GetEyeBlinkParameterId(i);
}
// TypeScript
let eyeBlinkCount: number = _modelSetting.getEyeBlinkParameterCount();
for(let i: number = 0; i < eyeBlinkCount; i++)
{
let eyeBlinkParameter: CubismIdHandle = _modelSetting.getEyeBlinkParameterId(i);
}
// Java
int eyeBlinkCount = modelSetting.getEyeBlinkParameterCount();
for(int i = 0; i < eyeBlinkCount; i++) {
CubismId eyeBlinkParameter = modelSetting.getEyeBlinkParameterId(i);
}
.model3.json 파일 안에 정의를 넣으려면 「눈 깜빡임 설정」을 확인하십시오.
Editor상에서 눈 깜빡임·립싱크 설정을 실시하고 나서 출력하면, .model3.json 파일에는 이하와 같이 기술됩니다.
{
... 생략 ...
"Groups": [
{
"Target": "Parameter",
"Name": "LipSync",
"Ids": [
"ParamMouthOpenY"
]
},
{
"Target": "Parameter",
"Name": "EyeBlink",
"Ids": [
"ParamEyeLOpen",
"ParamEyeROpen"
]
}
]
}
CubismEyeBlink 이용
실제로 눈을 깜빡이게 하기 위해서는 CubismEyeBlink 클래스를 이용합니다.
이 클래스는 ICubismModelSetting 인터페이스를 통해
.model3.json 파일에 기술된 눈 깜빡임용 파라미터에 대해
간격이 랜덤인 눈 깜빡임 동작을 제공합니다.
CubismEyeBlink 인스턴스 생성
CubismEyeBlink 인스턴스를 생성하려면 Native(C++)의 CubismEyeBlink::Create 함수 Web(TypeScript), Java의 CubismEyeBlink.create 함수를 사용합니다.
인수에 CubismModelSettingJson 인스턴스를 전달하여 .model3.json 파일의 설정을 자동으로 취득합니다.
생략하면 눈 깜빡임 ID가 지정되지 않습니다.
// C++
if (_modelSetting->GetEyeBlinkParameterCount() > 0)
{
_eyeBlink = CubismEyeBlink::Create(_modelSetting);
}
// TypeScript
if(_modelSetting.getEyeBlinkParameterCount() > 0)
{
_eyeBlink = CubismEyeBlink.create(_modelSetting);
}
// Java
if(modelSetting.getEyeBlinkParameterCount() > 0) {
eyeBlink = CubismEyeBlink.create(modelSetting);
}
눈 깜빡임 설정
Native(C++)의 CubismEyeBlink::SetBlinkingInterval 함수, Web(TypeScript), Java의 CubismEyeBlink.setBlinkingInterval 함수 및 Native(C++)의 CubismEyeBlink::SetBlinkingSettings 함수, Web(TypeScript), Java의 CubismEyeBlink.setBlinkingSettings 함수를 사용하여 눈 깜빡임 시간을 지정할 수 있습니다.
SetBlinkingInterval 함수로 설정하는 눈 깜빡임 사이의 시간은 0초에서 설정 시간의 2배까지의 랜덤성이 있습니다.
// C++ _eyeBlink->SetBlinkingInterval(6.0f); _eyeBlink->SetBlinkingSettings(0.8f, 0.2f, 0.8f);
// TypeScript _eyeBlink.setBlinkingInterval(8.0); _eyeBlink.SetBlinkingSettings(0.8, 0.2, 0.8);
// Java
eyeBlink.setBlinkingInterval(8.0f);
eyeBlink.setBlinkingSetting(0.8f, 0.2f, 0.8f);
또 Native(C++)의 CubismEyeBlink::SetParameterIds 함수, Web(TypeScript), Java의 CubismEyeBlink.setParameterIds 함수 및 Native(C++)의 CubismEyeBlink::GetParameterIds 함수, Web(TypeScript), Java의 CubismEyeBlink.getParameterIds 함수를 사용하여 눈 깜빡임 파라미터를 나중에 변경할 수 있습니다.
// C++
csmVector<CubismIdHandle> eyeBlinkList = _eyeBlink->GetParameterIds();
// 오른쪽 눈 개폐(ParamEyeROpen) 파라미터 제외
CubismIdHandle removeTarget = CubismFramework::GetIdManager()->GetId("ParamEyeROpen");
for (csmUint32 i = 0; i < eyeBlinkList.GetSize(); ++i)
{
if(eyeBlinkList[i] == removeTarget)
{
eyeBlinkList.Remove(i);
break;
}
}
// 제3의 눈 개폐(ParamEyeThirdOpen) 파라미터 추가
eyeBlinkList.PushBack(CubismFramework::GetIdManager()->GetId("ParamEyeThirdOpen"));
// 눈 깜빡임용 파라미터에 덮어씁니다. 오른쪽 눈은 개폐하지 않게 되고 신설한 제3의 눈이 대신 깜빡인다.
_eyeBlink->SetParameterIds(eyeBlinkList);
// TypeScript
let eyeBlinkList: csmVector<CubismIdHandle> = _eyeBlink.getParamterIds();
// 오른쪽 눈 개폐(ParamEyeROpen) 파라미터 제외
let removeTarget: CubismIdHandle = CubismFramework.getIdManager().getId("ParamEyeROpen");
for(let i: number = 0; i < eyeBlinkLIst.getSize(); ++i)
{
if(eyeBlinkList[i] == removeTarget)
{
eyeBlinkList.remove(i);
break;
}
}
// 제3의 눈 개폐(ParamEyeThirdOpen) 파라미터 추가
eyeBlinkList.pushBack(CubismFramework.getIdManager().getId("ParamEyeThirdOpen"));
// 눈 깜빡임용 파라미터에 덮어씁니다. 오른쪽 눈은 개폐하지 않게 되고 신설한 제3의 눈이 대신 깜빡인다.
_eyeBlink.setParameterIds(eyeBlinkList);
// Java
List<CubismId> eyeBlinkList = new ArrayList<CubismId>(eyeBlink.getParameterIds());
// 오른쪽 눈 개폐(ParamEyeROpen) 파라미터 제외
CubismId removeTarget = CubismFramework.getIdManager().getId("ParamEyeROpen");
boolean isRemoved = eyeBlinkList.remove(removeTarget);
// 오른쪽 눈 개폐 파라미터가 존재하고 올바르게 삭제되면 세 번째 눈 개폐(ParamEyeThirdOpen) 파라미터 추가
if (isRemoved) {
eyeBlinkList.add(CubismFramework.getIdManager().getId("ParamEyeThirdOpen"));
}
// 눈 깜빡임용 파라미터에 덮어씁니다. 오른쪽 눈은 개폐하지 않게 되고 신설한 제3의 눈이 대신 깜빡인다.
eyeBlink.setParameterIds(eyeBlinkList);
모델에 적용
눈 깜빡임을 적용하려면 Native(C++)의 CubismEyeBlink::UpdateParameters 함수, Web(TypeScript), Java의 CubismEyeBlink.updateParameters 함수를 사용하고, 제1인수에 대상 모델, 제2인수에 마지막 업데이트 이후의 차이 시간을 넣습니다.
// C++
if (_eyeBlink ! = NULL)
{
_eyeBlink->UpdateParameters(_model, deltaTimeSeconds);
}
// TypeScript
if(_eyeBlink ! = null)
{
_eyeBlink.updateParameters(_model, deltaTimeSeconds);
}
// Java
if(eyeBlink ! = null) {
eyeBlink.updateParameters(model, deltaTimeSeconds);
}
파기
모델이 해제되는 타이밍에 CubismEyeBlink 인스턴스도 파기해야 합니다.
// C++ CubismEyeBlink::Delete(_eyeBlink);
// TypeScript CubismEyeBlink.delete(_eyeBlink);
Java에서는 가비지 콜렉션에 해방을 맡기는 방침이므로 파기 절차는 불필요합니다.