Raycast (UE)

업데이트: 2024/09/05

이 페이지에는 알파 버전에 관한 설명이 포함되어 있습니다.

개요

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
    쏘려는 레이의 길이를 지정합니다.
이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.