从3D网格生成2D横截面多边形

时间:2010-05-09 11:05:38

标签: algorithm graphics 3d geometry 2d

我正在编写一个使用3D模型绘制场景的游戏(自上而下的正投影),但是使用2D物理引擎来计算对碰撞的响应等等。我有一些我想要的3D资源通过使用XY平面“切片”3D网格并从结果边缘创建多边形,能够自动生成命中框。

谷歌在这个问题上让我失望(也没有太多有用的材料)。建议?

我正在处理的网格将是所显示模型的简化版本,它们是连接的,封闭的,非凸的并且具有零属。

2 个答案:

答案 0 :(得分:6)

由于网格不是凸面,因此可能会断开生成的横截面,因此实际上由多个多边形组成。这意味着必须检查每个三角形,因此对于n个三角形至少需要O(n)次操作。

这是一种方法:

T <- the set of all triangles
P <- {}
while T is not empty:
  t <- some element from T
  remove t from T
  if t intersects the plane:
    l <- the line segment that is the intersection between t and the plane
    p <- [l]
    s <- l.start
    while l.end is not s:
      t <- the triangle neighbouring t on the edge that generated l.end
      remove t from T
      l <- the line segment that is the intersection between t and the plane
      append l to p
    add p to P

这将在O(n)时间内运行n个三角形,前提是您的三角形具有指向其三个邻居的指针,并且T支持常量时间删除(例如哈希集)。

与所有几何算法一样,魔鬼在细节中。例如,仔细考虑三角形顶点正好在平面中的情况。

答案 1 :(得分:2)

您可以通过查找与平面相交的所有多边形然后找到交叉点的确切线段来实现几何体的升级。这些段是您正在寻找的2D多边形的线条。