호흡
업데이트: 2022/10/06
OW에서 모델에 호흡을 시키려면 CubismBreath를 이용합니다.
파라미터를 주기적으로 동작시킬 수 있으므로 호흡 외에 다양한 것에 응용시킬 수도 있습니다.
적용할 파라미터는 임의로 지정할 수 있습니다.
또 파라미터마다 주기, 파라미터값의 범위, 값을 적용할 때의 Weight값을 지정하는 것도 가능합니다.
CubismBreath 사용
CubismBreath 인스턴스 생성
CubismBreath 인스턴스를 생성하려면 Native(C++)의 CubismBreath::Create 함수 또는 Web(TypeScript), Java의 CubismBreath.create 함수를 사용합니다.
// C++ CubismBreath* breath = CubismBreath::Create();
// TypeScript let breath: CubismBreath = CubismBreath.create();
// Java CubismBreath breath = CubismBreath.create();
파라미터 지정
호흡을 설정할 파라미터를 지정하려면 Native(C++)의 CubismBreath::BreathParameterData 구조체 또는 Web(TypeScript), Java의 BreathParameterData 클래스를 사용합니다.
첫 번째 인수에 설정할 파라미터 ID를 CubismId* 형식(SDK for Web, SDK for Java의 경우 CubismId 형식)으로 전달합니다.
두 번째 인수는 주기 동작의 오프셋 값을 전달합니다. 호흡 주기 동작의 값은 사인파로 설정되며 시작 위치를 지정합니다.
세 번째 인수는 사인파의 최대 값을 설정합니다.
네 번째 인수는 사인파의 주기를 설정합니다.
다섯 번째 인수는 파라미터에 값을 적용할 때 가중치를 설정합니다.
// C++ csmVector<CubismBreath::BreathParameterData> breathParameters; breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleX"), 0.0f, 15.0f, 6.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleY"), 0.0f, 8.0f, 3.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamAngleZ"), 0.0f, 10.0f, 5.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamBodyAngleX"), 0.0f, 4.0f, 15.5345f, 0.5f)); breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId("ParamBreath"), 0.5f, 0.5f, 3.2345f, 0.5f)); breath->SetParameters(breathParameters);
// TypeScript const breathParameters: csmVector<BreathParameterData> = new csmVector(); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleX"), 0.0, 15.0, 6.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleY"), 0.0, 8.0, 3.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleZ"), 0.0, 10.0, 5.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamBodyAngleX"), 0.0, 4.0, 15.5345, 0.5)); breathParameters.pushBack(new BreathParameterData(CubismFramework.getIdManager().getId("ParamBreath"), 0.5, 0.5, 3.2345, 1)); breath.setParameters(breathParameters);
// Java List<CubismBreath.BreathParameterData> breathParameters = new ArrayList<>(); breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleX"), 0.0f, 15.0f, 6.5345f, 0 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleY"), 0.0f, 8.0f, 3.5345f, 0. breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamAngleZ"), 0.0f, 10.0f, 5.5345f, 0 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamBodyAngleX"), 0.0f, 4.0f, 15.5345 breathParameters.add(new CubismBreath.BreathParameterData(CubismFramework.getIdManager().getId("ParamBreath"), 0.5f, 0.5f, 3.2345f, 0. _breath.setParameters(breathParameters);
모델에 값 적용
호흡을 적용하려면 Native(C++)의 CubismBreath::UpdateParameters 함수, Web(TypeScript), Java의 CubismBreath.updateParameters 함수를 사용합니다.
첫 번째 인수는 대상 모델, 두 번째 인수는 마지막 업데이트 이후의 차이 시간을 넣습니다.
// C++ if (breath ! = NULL) { breath->UpdateParameters(cubismModel, deltaTimeSeconds); }
// TypeScript if (this._breath ! = null) { this._breath.updateParameters(this._model, deltaTimeSeconds); }
// Java if (breath ! = null) { breath.updateParameters(cubismModel, deltaTimeSeconds); }
CubismBreath 파기
모델이 해제될 때 CubismBreath 인스턴스도 파기해야 합니다.
// C++ CubismBreath::Delete(breath);
// TypeScript CubismBreath.delete(breath);
Java에서는 가비지 콜렉션에 해방을 맡기는 방침이므로 파기 절차는 불필요합니다.