如何检查是否所有的脸都朝外

问题描述 投票:0回答:1

情况:我正在使用Open3D python,网格生成算法(如球枢轴、泊松重建)依赖于法线方向。我在点云上使用了

estimate_normals 
orient_normals_consistent_tangent_plane 
方法来确保顶点法线朝外。生成网格后,我想检查面法线是否朝外。如果没有,我需要翻转它。

**帮助**:如何用数学方式表示面法线的“向外”条件。我可以从

mesh.triangle_normals
恢复正常脸部。

**上下文**:我是菜鸟工程师,所以任何理论或示例的链接都会帮助我理解。也欢迎 open3d 解决方案:)

我查看了 open3d 文档来检查现有方法。但不存在任何方法。

computational-geometry mesh normals open3d
1个回答
0
投票

我自己的镶嵌也遇到了类似的问题,并在博客代码中写了相关内容。这是我为解决该问题而设计的算法。该算法的两个要求是您知道网格中一个三角形的正确方向,并且相邻三角形共享一个公共顶点。

算法如下:

  1. 我们首先构建一个查找表,将每个三角形映射到其所有相应的邻居。这里我们可以偷懒,通过两个三角形是否共享一个公共顶点来将两个三角形定义为“邻居”。
  2. 然后,我们用要用作“向前”方向基础的三角形初始化一个队列,并开始处理。
  3. 为了处理队列中的一个项目,我们遍历它的每个邻居。如果邻居是我们已经处理过的三角形,我们会跳过它。如果三角形是我们尚未完全处理的三角形,我们会计算其法线方向及其反转法线方向。
  4. 如果三角形法线与其邻居法线之间的点积小于三角形法线与其邻居反转法线之间的点积,那么我们需要翻转邻居的顶点来改变其面向的方向。
  5. 对于我们处理的每个邻居,我们将它们添加到接下来要处理的队列中。
  6. 我们继续运行,直到队列为空。

生成的网格应该让所有三角形都面向正确的方向!

© www.soinside.com 2019 - 2024. All rights reserved.