一尘不染

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

algorithm

我正在编写一个游戏,该游戏使用3D模型绘制场景(自上而下的正投影),但是使用2D物理引擎来计算对碰撞的反应等。我希望获得一些3D资源通过将3D网格与XY平面“切片”并从生成的边创建多边形来自动生成一个Hitbox。

Google在这方面让我失望(也没有关于SO的有用材料)。有什么建议吗?

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


阅读 245

收藏
2020-07-28

共1个答案

一尘不染

由于您的网格不是凸形的,因此所产生的横截面可能会断开,因此实际上是由多个多边形组成。这意味着必须检查每个三角形,因此您至少需要对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支持恒定时间删除(例如,哈希集)。

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

2020-07-28