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
쏘려는 레이의 길이를 지정합니다.