Raycast (UE)
最終更新: 2024年9月5日
此页面包含有关Alpha版的描述。
概述
Raycasting是用于判定用户指定的Cubism网格是否与任意座标相交的功能。
可以获得单击/点击座标、场景中任意物体与指定网格之间的重叠检测。
如何处理组件
通过将CubismRaycastComponent添加到CubismModel Actor的子组件,可以使用Cubism SDK for Unreal Engine中的Raycast。
如果在.model3.json中设置了光线投射对象的图形网格ID,载入时CubismRaycastComponent会自动作为子组件追加到CubismModel Actor,所以用户端无需进行设置。
如何指定对象图形网格
如果在.model3.json中设置了光线投射对象的图形网格ID,载入时CubismRaycastComponent将作为子组件自动追加到CubismModel Actor中,但如果要手动追加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
指定尝试投射的光线长度。
请问这篇文章对您有帮助吗?
是否