【问题标题】:How to find out whether a triangle mesh is concave or not?如何判断三角形网格是否凹?
【发布时间】:2013-04-24 05:15:31
【问题描述】:

给定一个三维三角形网格,我如何判断它是凸的还是凹的?有算法可以检查吗?如果是这样,定义一个公差范围以忽略小凹面会很有用。

图片来源:http://www.rustycode.com/tutorials/convex.html

【问题讨论】:

  • 这是一个类似的问题。第二条评论应该对您有所帮助。 gamedev.stackexchange.com/questions/53142/…
  • 这是一个 NP Hard 问题,所以你只需要互相测试每个点。
  • @PeterWood。这是一个类似的问题,但在这里没有帮助。我的问题是关于 3d 网格,哪些顶点没有任何给定的顺序。
  • 3d 网格没有区别。只需确保每个面归一化向量都指向网格外部(使用逆时针点放置)

标签: c++ algorithm mesh convex non-convex


【解决方案1】:

凸多面体may be defined 是有限个半空间的交集。这些半空间实际上是分面定义半空间。

编辑:假设您的网格实际上定义了一个多面体(即有一个“内部”和一个“外部”)

你可以这样做(伪代码):

for each triangle
    p = triangle plane
    n = normal of p (pointing outside)
    d = distance from the origin of p
    //Note: '*' is the dot product.
    //so that X*N + d = 0 is the plane equation
    //if you write a plane equation like (X-P)*n = 0 (where P is any point which lays in the plane), then d = -P*n (it's a scalar).

    for each vertex v in the mesh
         h = v*N + d
         if (h > Tolerance) return NOT CONVEX
         //Notice that when v is a vertex of the triangle from which n and d come from,
         //h is always zero, so the tolerance is required (or you can avoid testing those vertices)
    end
end
return CONVEX

【讨论】:

  • 老实说,我对此不是 100% 确定的。
  • 谢谢 sbabbi,看起来很棒。是的,我的网格有内部和外部,否则它们根本不可能是凸的。但我不明白p * n + d = 0。平面不是由(x - p) * n = 0 定义的吗? d 是向量还是标量? p = triangle plane 是指p 是原点向量吗?顺便说一句,您的算法不需要容差,并且可以为零,因为允许非凹面网格包含共线顶点。但在我的情况下,有公差范围是很好的。
  • @danijar。编辑了一些澄清的答案。公差 is 要求为非零,因为由于浮点近似,当您测试构成平面的顶点时,您无法确定 h 将 完全 为零本身。
  • 感谢您的澄清,但飞机不是X * N - d = 0,而不是加号吗?了解浮点精度。
  • @danijar 是的,也解决了这个问题。
【解决方案2】:

对于您描述的简单多边形,您可以检查每个顶点的每个内角,并检查该角度是否低于 180 度。如果是这样,它就不可能是凹的。如果单个顶点超过 180°,则为凹。

编辑:对于 3D 网格,同样的想法也适用,但您必须在每个顶点处测试每个三角形彼此之间的角度是高于还是低于 180°

【讨论】:

  • 我阅读了您的编辑。假设我知道所有其他三角形的角度是高于还是低于 180 度,这如何导致凸面或凹面的分类?
  • 如果物体内部的角度小于180度,它是凸的。
猜你喜欢
  • 1970-01-01
  • 2014-08-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2021-09-04
相关资源
最近更新 更多