자동 눈 깜빡임

업데이트: 2022/10/06

눈 깜빡임에 사용할 파라미터 특정

자동 눈 깜빡임 효과 기능을 사용하면 모델에 임의의 눈 깜빡임 동작을 적용할 수 있습니다.
자동 눈 깜빡임 효과를 적용하려면 다음과 같이 처리하십시오.

・.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에서는 가비지 콜렉션에 해방을 맡기는 방침이므로 파기 절차는 불필요합니다.

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