Pose (UE)
最終更新: 2024年9月5日
このページにはアルファ版に関する記述が含まれます。
概要
Poseは、Poseの設定形式の.pose3.jsonに記述されたパーツ群の表示状態を管理する機能です。
Poseを使用することで、「下ろした状態の腕」と「組んだ状態の腕」のように、画面には同時に表示させたくないパーツを管理することができます。
また、Poseを利用することで、PartのIDが異なるモデル(衣装替え等)にも対応することが可能です。
.pose3.jsonは、Cubism Viewer for OWで設定することができます。
パーツの設定方法などの詳細につきましては こちら をご覧ください。
コンポーネントの扱い方
Cubism SDK for Unreal Engine における Pose は CubismPoseComponent を CubismModel アクタの子コンポーネントに追加することで使用することができます。
.model3.json に .pose3.json のパスが設定されている場合は、インポートの際に自動的に CubismModel アクタに CubismPoseComponent が子コンポーネントとして追加されるため、ユーザー側での設定は不要です。
挙動
CubismPoseComponent はポーズの対象として設定されているパーツに対応するCubismPartComponent と同じIdをもつCubismParameterComponentの値を参照(存在しない場合は作成)し、その値が0でないパーツを表示するパーツとして選択します。
float VisiblePartOpacity = 1.0f;
// find the visible part in a group
for (const FCubismPosePartParameter& PartParam : PartGroup.Parts)
{
const TObjectPtr<UCubismPartComponent>& Part = PartParam.Part;
const TObjectPtr<UCubismParameterComponent>& Parameter = PartParam.Parameter;
if (!Part || !Parameter)
{
continue;
}
if (Parameter->Value > 0.0f)
{
VisiblePart = Part;
VisiblePartOpacity = Part->Opacity;
break;
}
}
選択された表示パーツの不透明度(VisiblePartOpacity)が1より小さい場合は、指定されたFadeInTimeの値に応じて増加させます。
VisiblePartOpacity = FMath::Min(VisiblePartOpacity + DeltaTime / FadeInTime, 1.0f);
一方、非表示パーツの不透明度(OtherPartOpacity)は、以下の計算式に基づき表示パーツの不透明度の変化に合わせて低下させていきます。
float OtherPartOpacity;
// decrease opacity of the other parts aligned with the visible part
{
if (VisiblePartOpacity < Phi)
{
OtherPartOpacity = VisiblePartOpacity * (Phi - 1.0f) / Phi + 1.0f; // a line through (0, 1) and (phi, phi)
}
else
{
OtherPartOpacity = (1.0f - VisiblePartOpacity) * Phi / (1.0f - Phi); // a line through (1, 0) and (phi, phi)
}
const float backOpacity = (1.0f - OtherPartOpacity ) * (1.0f - VisiblePartOpacity);
if (backOpacity > BackOpacityThreshold)
{
OtherPartOpacity = 1.0f - BackOpacityThreshold / (1.0f - VisiblePartOpacity);
}
}