자동 눈 깜빡임
업데이트: 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에서는 가비지 콜렉션에 해방을 맡기는 방침이므로 파기 절차는 불필요합니다.