collision-detection - UE4 Mesh几个碰撞点检测
问题描述
当我的网格碰撞时,我需要找到所有命中点(顶点),因为使用 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 来加快此过程,但会在几帧碰撞后绘制球形扫描,因此您可以暂停/停止 actor 以获得准确的结果。
推荐阅读
- php - Laravel 模型集合不匹配 SQL
- python - 意外的负增量日期时间时间戳原因和可能的解决方案
- android - 为什么 datasnapshot 循环出现故障?
- ruby - 调用与 #each 迭代的 Gem 中的方法链接的参数时,yield 块的返回值是多少?
- c# - Codility 的 TapeEquilibrium 任务,未能通过 100% 的测试、性能和正确性(总分 76%)
- solr - Solr Atomic 更新无法通过 Java 运行
- bots - 如何在 Discord.js 机器人中创建动态聊天?
- javascript - 使用 HTML、CSS 和 JavaScript 在网站中添加动态横幅
- python - 如何更有效地应用 .axes - 'right' 和 'top' 的示例 axes.spines 单一代码?
- php - Laravel 中的 Ajax 帖子总是抛出错误