首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >三维空间中的轴向包围盒与三角形碰撞

三维空间中的轴向包围盒与三角形碰撞
EN

Stack Overflow用户
提问于 2012-09-04 17:04:56
回答 1查看 2.6K关注 0票数 0

我已经读了很多关于“分离轴测试”的文章,从所有的帖子和文章中,我都认为它们都是二维碰撞的,而不是3D的。我听说这更像是3D空间中的“分离平面定理”,但是我不清楚在哪里可以找到这种方法与2D版本有什么不同的信息。

我应该使用SAT,因为我试图计算三角形是否与轴对齐边界盒(AABB)相交。我不需要知道交集发生在哪里,只是一个布尔结果,如果它发生了或没有发生。

我实现SAT的主要尝试位于这里:实施尝试

如果SAT需要修改,那么需要修改什么才能成功地在3D空间中实现?据克里斯特·埃里克森从他的书“实时碰撞检测”中说,由于目前有13根轴需要测试。如果需要改变SAT,我认为会有更多的轴需要测试,因为其中涉及到第三轴。

  1. AABB的三张脸法线
  2. 一张从三角形向外的脸
  3. 双边组合的交叉积给出的九个轴

我需要了解SAT是否需要修改,以及向何处修改和为什么修改的方向前进。如果不需要修改,我哪里出错了?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-08 01:00:44

在阅读了许多不同的文章、文章和论文(其中最好的资源是文章)之后,我现在知道,对于三维碰撞检测,不需要对SAT做任何修改。

虽然我的实现仍然有一些问题,但我可以说对于AABB (多维数据集),您必须测试3个曲面法线,对应于x、y和z轴。对于三角形,看起来需要4个法线,每个边一个,曲面一个(我不完全确定三角形法线,因为我还需要测试。我试了一个正常的,有80%的工作)。

对于AABB (立方体),通过得到曲面的两条垂直边和这两条边的交叉积来计算法线。

代码语言:javascript
代码运行次数:0
运行
复制
// Surface 1/3 (x, y, z - one surface for each)
Vector3d edge1 = new Vector3d();
Vector3d edge2 = new Vector3d();
Vector3d normal1 = new Vector3d();
// Get the edges, the two edges must be perpendicular to one another.
edge1.sub( point0, point1 );
edge2.sub( point0, point4 );
normal1.cross( edge1, edge2 );
normal1.normalize();

用同样的方法计算三角形曲面法线。

在此之后,SAT取AABB和三角形的投影,测试AABB轴(法线)上的投影,然后在三角形轴(法线)上重复这一点,如果其中任何一个测试检测到间隙,就不会发生碰撞。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12268200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档