gpt4 book ai didi

java - 3D 空间中的轴对齐边界框和三角形碰撞

转载 作者:行者123 更新时间:2023-12-01 15:11:38 24 4
gpt4 key购买 nike

我阅读了大量有关“分离轴测试”的内容,从所有帖子和文章中我了解到它们都是针对 2D 碰撞,而不是 3D。我听说它更像是 3D 空间的“分离平面定理”,但我不清楚在哪里可以找到有关此方法与 2D 版本有何不同的信息。

我应该使用 SAT,因为我正在尝试计算三角形是否与轴对齐边界框 (AABB) 相交。我不需要知道交集发生在哪里,只需要知道交集发生或未发生的 boolean 结果。

我在实现 SAT 方面的主要尝试位于此处:Implementation attempt .

如果 SAT 需要修改,那么需要修改什么才能在 3D 空间中成功实现?根据 Christer Ericson 在他的《实时碰撞检测》一书中的说法,目前有 13 个轴需要测试。如果SAT需要改变,那么我认为会有更多的轴需要测试,因为涉及到第三个轴。

  1. 来自 AABB 的三个面法线
  2. 一个面与三角形垂直
  3. 由两个边组合的叉积给出的九个轴

我需要了解 SAT 是否需要修改,以及修改的方向和原因。如果不需要修改,我错在哪里?谢谢!

最佳答案

在阅读了许多不同的帖子、文章和论文(其中最好的资源是 this 文章)之后,我现在知道无需对 SAT 进行任何修改即可进行 3D 碰撞检测。

尽管我的实现仍然存在一些问题,但我可以说,对于 AABB(立方体),您必须测试 3 个表面法线,分别对应于 x、y 和 z 轴。对于三角形,看起来需要 4 个法线,一个用于每条边,一个用于表面(我不完全确定三角形法线,因为我仍然需要测试。我尝试使用一个法线,并且有 80% 的工作)。

对于 AABB(立方体),法线是通过获取曲面的两条垂直边并获取这两条边的叉积来计算的。

// 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 轴(法线)上的投影,然后在三角形轴(法线)上重复此操作,如果任何一项测试检测到间隙,则不存在间隙碰撞。

关于java - 3D 空间中的轴对齐边界框和三角形碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com