サンプル内容
概要
- アプリケーション実行中にリップシンク用コンポーネントを生成し、
キャラクターモデル向けに設定を行つつリアルタイムにリップシンクを行います。
操作方法
- [SetUp Component]ボタン
- リップシンク用コンポーネントCriWare.CriLipsDeformerForAtomSource のセットアップを行います。
- [Unsetup Component]ボタン
- リップシンク用コンポーネントCriWare.CriLipsDeformerForAtomSource のセットアップを解除します。
- [Playback Cue]ボタン
- 音声をCriAtomSourceによって再生します。
シーン情報
ミドルウェア | ADX LipSync(CRI Lips), CRI ADX (CRI Atom) |
サンプル | Expansionサンプル |
格納場所 | /cri/unity/samples/UnityProject/Assets/Scenes/criatom/expansion/LipSync |
シーンファイル | Scene_02_LipSync_ScriptAddComponent.unity |
ACFファイル | /cri/unity/samples/UnityProject/Assets/StreamingAssets/ADXLipSync/ForADXLipSyncSample.acf |
ACBファイル | /cri/unity/samples/UnityProject/Assets/StreamingAssets/ADXLipSync/ForADXLipSyncSample.acb |
プログラムの解説
- まず Start() 関数内で CriLipsDeformerForAtomSource コンポーネントを AddComponent() し
LipSyncライブラリの初期化や口形状解析機の生成を行わせます。
private void Start()
{
this.criLipsDeformer = this.gameObject.AddComponent<CriLipsDeformerForAtomSource>();
}
- キャラクターモデルの持つ各モーフターゲット情報を元に、CriWare.CriLipsMorphBlendShapeWidthHeight オブジェクトを生成し、
CriWare.CriLipsDeformerForAtomSource::LipsMorph へ登録します。
このとき、モーフターゲット名は GetBlendShapeIndex() などによって
インデックス値に変換してCriWare.CriLipsMorphBlendShapeWidthHeight::lipHeightIndex へ渡す必要があります。
CriLipsMorphBlendShapeWidthHeight lipsMorph = new CriLipsMorphBlendShapeWidthHeight();
lipsMorph.Target = skinnedMeshRenderer;
lipsMorph.lipHeightIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape.LipHeightOpen");
lipsMorph.lipWidthOpenIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape.LipWidthOpen");
lipsMorph.lipWidthCloseIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape.LipWidthClose");
lipsMorph.tongueUpIndex
= skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape.Tongue_Up");
criLipsDeformer.LipsMorph = lipsMorph;
- その後、CriWare.CriLipsDeformerForAtomSource をCriWare.CriAtomSource へ取り付けることで
取り付けたCriAtomSourceから再生される音声がADX LipSyncによって解析され、キャラクターモデルのモーフターゲットへ反映されます。
なお、取り付けたCriAtomSourceで再生予定の音声のサンプリングレートをCriWare.CriLipsDeformerForAtomSource::atomAnalyzer へ登録する必要があります。
criLipsDeformer.AttachToAtomSource(atomSource)
CriAtomEx.WaveformInfo waveformInfo;
CriAtom.GetAcb(atomSource.cueSheet).GetWaveFormInfo(atomSource.cueName, out waveformInfo);
criLipsDeformer.atomAnalyzer.SetSamplingRate(waveformInfo.samplingRate);