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でないパーツを表示するパーツとして選択します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
}
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; } }
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の値に応じて増加させます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
VisiblePartOpacity = FMath::Min(VisiblePartOpacity + DeltaTime / FadeInTime, 1.0f);
VisiblePartOpacity = FMath::Min(VisiblePartOpacity + DeltaTime / FadeInTime, 1.0f);
VisiblePartOpacity = FMath::Min(VisiblePartOpacity + DeltaTime / FadeInTime, 1.0f);

一方、非表示パーツの不透明度(OtherPartOpacity)は、以下の計算式に基づき表示パーツの不透明度の変化に合わせて低下させていきます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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);
}
}
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); } }
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);
	}
}

この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。