Pose
最終更新: 2019年9月3日
概要
Poseは、Poseの設定形式の.pose3.jsonに記述されたパーツ群の表示状態を管理する機能です。
Poseを使用することで、「下ろした状態の腕」と「組んだときの腕」のように、画面には同時に表示させたくないパーツを管理することができます。
また、Poseを利用することで、PartのIDが異なるモデル(衣装替え等)にも対応することが可能です。
.pose3.jsonは、Cubism Viewer for OWで設定することができます。
パーツの設定方法などの詳細につきましては こちら をご覧ください。
OW方式でインポートしたモデルと、従来方式のモデルとを比較した場合、Poseによって以下の3点が変化します。
- [Prefabのルート]/Parts/ 以下のGameObjectに、CubismPosePartがアタッチされる。
- AnimationClip内のPartOpacityのカーブがSteppedで合った場合、Linearカーブに加工される。
- AnimationClipから、pose3.jsonに記述されていないOpacityカーブが削除される。
Poseでは、以下の処理を行います。
- Poseモーション内にSteppedで設定されたPartsのOpacity(不透明度)のカーブを加工
- Pose用パーツを特定
- 表示するPoseパーツを判別するためパーツのOpacityを保存
- Poseの計算と適用
- 不透明度の連動
Poseモーション内にSteppedで設定されたPartsのOpacity(不透明度)のカーブを加工
Editor マニュアルの ポーズの設定 に記述されている通り、Poseで扱うパーツの不透明度(PartOpacity)用のカーブは、カーブの種類はステップ(Stepped)を前提としております。
Cubism SDK for Unityでは、このカーブをリニア(Linear)に加工してAnimationClipに書き出します。
Stepped以外の種類のカーブを設定した場合、そのカーブは加工されずそのままAnimationClipに書き出します。
if(shouldImportAsOriginalWorkflow && poseJson != null && poseJson.FadeInTime != 0.0f) { animationCurve = ConvertSteppedCurveToLinerCurver(curve, poseJson.FadeInTime); }
このOpacityのカーブを加工する処理は、 CubismMotion3Json.ToAnimationClip() で行っています。
Pose用パーツを特定
CubismPosePartは、OW方式でモデルをインポートした時にアタッチされます。
アタッチするGameObjectは、[Prefabのルート]/Parts/ 以下に配置された、.pose3.jsonに記述されたIDと同名のものになります。
// Pose用パーツを取得 var part = parts.FindById(group[partIndex].Id); // CubismPosePartをアタッチ posePart = part.gameObject.AddComponent<CubismPosePart>(); // Poseの情報をCubismPosePartに設定 posePart.GroupIndex = groupIndex; posePart.PartIndex = partIndex; posePart.Link = group[partIndex].Link;
この処理は CubismPoseMotionImporter.InitializePosePart() で行っています。
表示するPoseパーツを判別するためパーツのOpacityを保存
現在のCubismPart.Opacityの値を、前フレームにキャッシュした値と比較することで、.pose3.jsonに記述されたグループ内の表示パーツを判別します。
値のキャッシュは CubismPoseController.SavePartOpacities() で行っています。
Poseの計算と適用
表示パーツの適用はAnimatinoClipで適用します。
非表示パーツの適用は CubismPoseController.DoFade() で行ないます。
CubismPoseController.DoFade()では表示パーツを探してから、非表示パーツOpacityを設定します。
非表示パーツのOpacityは表示するパーツの不透明度との関係で背景が透けないレベルで不透明度を低下させます。
不透明度の連動
不透明度の連動はPoseの適用後、OpacityをCubismPosePart.Linkに書かれた連動パーツは CubismPoseController.CopyPartOpacities でOpacityを設定します。