UE4 Mesh几个碰撞点检测
UE4 Mesh several collision points detecting
我需要在我的网格碰撞时找到所有的命中点(顶点),因为在 OnHit 中只有 一个 结构中的撞击点并且只有一个(红色调试球体) ).有什么办法吗? (例如,在 Unity 中,碰撞结构有一个包含这些点的数组:collision.contacts
)
这是2个立方体与面接触的例子,接触点很多(不是1个)
碰撞会产生重叠事件,因此理论上您可以使用 OnComponentBeginOverlap
并获得 SweepResult
作为重叠事件。但是 SweepResult
不太可靠,所以我建议在重叠事件中做一个 Spherical Sweep
。
void Pawn::OnComponentBeginOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor && (OtherActor != this))
{
TArray<FHitResult> Results;
auto ActorLoc = GetActorLocation();
auto OtherLoc = OtherComp->GetComponentLocation();
auto CollisionRadius = FVector::Dist(Start, End) * 1.2f;
// spherical sweep
GetWorld()->SweepMultiByObjectType(Results, ActorLoc, OtherLoc,
FQuat::Identity, 0,
FCollisionShape::MakeSphere(CollisionRadius),
// use custom params to reduce the search space
FCollisionQueryParams::FCollisionQueryParams(false)
);
for (auto HitResult : Results)
{
if (OtherComp->GetUniqueID() == HitResult.GetComponent()->GetUniqueID()) {
// insert your code
break;
}
}
}
}
您可以尝试使用 FCollisionQueryParams 来加快此过程,但球形扫掠将在几帧碰撞后绘制,因此也许您可以 pause/stop 演员获得准确的结果。
我需要在我的网格碰撞时找到所有的命中点(顶点),因为在 OnHit 中只有 一个 结构中的撞击点并且只有一个(红色调试球体) ).有什么办法吗? (例如,在 Unity 中,碰撞结构有一个包含这些点的数组:collision.contacts
)
这是2个立方体与面接触的例子,接触点很多(不是1个)
碰撞会产生重叠事件,因此理论上您可以使用 OnComponentBeginOverlap
并获得 SweepResult
作为重叠事件。但是 SweepResult
不太可靠,所以我建议在重叠事件中做一个 Spherical Sweep
。
void Pawn::OnComponentBeginOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor && (OtherActor != this))
{
TArray<FHitResult> Results;
auto ActorLoc = GetActorLocation();
auto OtherLoc = OtherComp->GetComponentLocation();
auto CollisionRadius = FVector::Dist(Start, End) * 1.2f;
// spherical sweep
GetWorld()->SweepMultiByObjectType(Results, ActorLoc, OtherLoc,
FQuat::Identity, 0,
FCollisionShape::MakeSphere(CollisionRadius),
// use custom params to reduce the search space
FCollisionQueryParams::FCollisionQueryParams(false)
);
for (auto HitResult : Results)
{
if (OtherComp->GetUniqueID() == HitResult.GetComponent()->GetUniqueID()) {
// insert your code
break;
}
}
}
}
您可以尝试使用 FCollisionQueryParams 来加快此过程,但球形扫掠将在几帧碰撞后绘制,因此也许您可以 pause/stop 演员获得准确的结果。