Raycast (UE)

最終更新: 2024年9月5日

このページにはアルファ版に関する記述が含まれます。

概要

Raycastingは、ユーザが指定したCubismのメッシュと任意の座標とが交差するかどうかを判定する機能です。
クリック/タップされた座標や、シーン中の任意のオブジェクトと指定されたメッシュとの当たり判定を取得することが可能です。

コンポーネントの扱い方

Cubism SDK for Unreal Engine における Raycast は CubismRaycastComponent を CubismModel アクタの子コンポーネントに追加することで使用することができます。

.model3.json にレイキャストの対象となるアートメッシュのIDが設定されている場合は、インポートの際に自動的に CubismModel アクタに CubismRaycastComponent が子コンポーネントとして追加されるため、ユーザー側での設定は不要です。

対象となるアートメッシュの指定方法

.model3.json にレイキャストの対象となるアートメッシュのIDが設定されている場合は、インポートの際に自動的に CubismModel アクタに CubismRaycastComponent が子コンポーネントとして追加されますが、手動でRaycastの対象となるパラメータを追加したい場合は「詳細」タブから CubismRaycast を選択し、下部に表示されるリストから「Live2D Cubism」→「Parameters」を開き、新たにインデックスを挿入した際に作成されるインデックスリストの「Id」にパラメータの名称を手動で書き加えてください。

パラメータの適用

CubismRaycastComponent は Parameters の各要素に対し、個別の交差判定を行います。 Id に設定されたIDに該当するアートメッシュが交差判定の対象となります。

void UCubismRaycastComponent::Raycast(
	const FVector Origin,
	const FVector Direction,
	TArray<FCubismRaycastHit>& Result,
	const float Length
) const
{
	Result.Empty();

	for (const FCubismRaycastParameter& Parameter : Parameters)
	{
		if (!Parameter.bEnabled)
		{
			continue;
		}

		UCubismDrawableComponent* Drawable = Model->GetDrawable(Parameter.Id);

		if (!Drawable)
		{
			continue;
		}

		const FTransform& Transform = Drawable->GetComponentTransform();
		FVector HitPosition, HitNormal;
		float HitTime;

		const FBox Box = Drawable->CalcBounds(Transform).GetBox();
		const FVector NormDir = Direction.GetSafeNormal();
		const FVector Start = Origin;
		const FVector End = Start + NormDir * Length;

		if (!FMath::LineExtentBoxIntersection(
			Box,
			Start, End, FVector::Zero(),
			HitPosition, HitNormal, HitTime
		))
		{
			continue;
		}

		switch (Parameter.Precision)
		{
			case ECubismRaycastPrecision::BoundingBox:
			{
				// already checked

				break;
			}
			case ECubismRaycastPrecision::Mesh:
			{
				const TArray<int32> Indices = Drawable->GetVertexIndices();

				TArray<FVector> Positions;
				for (const FVector2D& Position : Drawable->GetVertexPositions())
				{
					Positions.Add(Model->GetRelativeTransform().TransformPosition(Drawable->ToGlobalPosition(Position)));
				}

				if (!RayMeshIntersection(
					Start, End,
					Positions, Indices,
					HitPosition, HitTime
				))
				{
					continue;
				}

				break;
			}
		}


		FCubismRaycastHit RaycastHit;

		RaycastHit.Drawable = Drawable;
		RaycastHit.Distance = HitTime * Length;
		RaycastHit.GlobalPosition = HitPosition;
		RaycastHit.LocalPosition = Transform.InverseTransformPosition(HitPosition);

		Result.Add(RaycastHit);
	}
}

対象となるアートメッシュを追加・削除したい場合は、コンポーネントの Parameters の要素を追加・削除します。

Enabled が true に設定されている場合に、レイとの交差判定が行われます。
交差判定の挙動は CubismRaycastParameter に用意されたパラメータで制御することができます。

  • Precision
    判定の精度を指定します。
    BoundingBox を選択した場合、交差判定はアートメッシュを取り囲むAABB、すなわち軸に沿った直方体に対して行います。これは、交差判定の精度が低くなる代わりに、計算負荷も小さくなります。
    このオプションを選択する場合は、AABBを最適化するために、モデルのなす平面をいずれかの座標軸と同じ方向に向けることを推奨します。
    Mesh を選択した場合は、交差判定はアートメッシュを構成するメッシュに対して正確に行います。これは、交差判定の精度が高くなる代わりに、計算負荷も大きくなります。

レイキャストの実行

CubismRaycastComponent に用意された関数を使うことで、設定した交差判定オブジェクトとの交差判定を行うことができます。

void Raycast(
	const FVector Origin,
	const FVector Direction,
	TArray<FCubismRaycastHit>& Result,
	const float Length = 10000.f
) const;
  • Origin
    飛ばそうとしているレイの原点を表す位置ベクトルを指定します。
  • Direction
    飛ばそうとしているレイの方向ベクトルを指定します。
  • Result
    交差判定の結果を格納するための配列を指定します。
  • Length
    飛ばそうとしているレイの長さを指定します。
この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。