【问题标题】:Simple 3D AABB-Line Segment collision detection (intersection)简单的 3D AABB-Line Segment 碰撞检测(交叉点)
【发布时间】:2011-08-14 00:35:43
【问题描述】:

我只需要一种方法来告诉我 3D 中的轴对齐边界框是否与线段(不是射线)相交。我不需要交点。

盒子由两个对角定义,线段由起点和终点定义,如下所示:

Boolean intersection(Vector3 boxStart, Vector3 boxEnd, Vector3 segmentStart, Vector3 segmentEnd){...}

我做了很多研究,但还没有找到我可以理解或至少可以使用的代码(希望是 C# 或 Java)。我需要的是方法,而不是能够完成这项工作的库......

我的问题是它需要 100% 精确,并且如果片段刚刚接触到框(即它们共享一个点),它必须返回 false。例如,如果线段是盒子的边缘之一或通过一个角,它们不会相交。

谢谢

【问题讨论】:

  • gamedev.net/topic/338987-aabb---line-segment-intersection-test。如果您想排除“刚刚接触”的情况,请使用<> 测试。如果要包含它们,请使用 <=>= 测试。
  • @Merlyn 对此我唯一不明白的是 epsilon。我找到了,但在我看来它不是 100% 准确的,而且我不知道要使用什么 epsilon...
  • “epsilon 用于处理退化叉积,如果段几乎平行于框轴,就会发生这种情况。” - 如果您可以在不浪费大量周期的情况下检测退化情况,那么您可以避免使用 epsilon。
  • 如果段绝对平行怎么办? “几乎平行”的情况并没有让我太担心......如果我要使用它,我该如何定义 epsilon?只是一个双 epsilon = 0.000000000001; ?
  • 在 C# 中,double.Epsilonfloat.Epsilon 已经定义。不确定Java...

标签: c# java collision-detection computational-geometry aabb


【解决方案1】:

在 Java 中,intersects() 方法中的任何一个都是候选方法;但由于实施限制,您需要使用Line2D 对其进行测试。

【讨论】:

  • 是的,但那是 2D... 我如何将它用于 3D?
  • 啊,question changed,当时我正在研究原件。我想知道为什么其他有用的答案被删除了。您选择的 3D 库是否有相关的原语?
  • 你可以看看这个Java 3D tutorial中使用的getIntersection()方法。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多