在三维模型上校正错误法线方向的算法

时间:2016-03-16 23:08:53

标签: c++ algorithm 3d openscenegraph

我是3D数学新手,但我遇到的问题是,当我将模型导入CAD程序时 - (单面光/开放场景图) - 网格中有很多面,黑色!

当我为每个面部手动翻转法线时,我得到了正确的材质和纹理。

我的问题是,如果我知道模型中每个网格的顶点表和法线表,我可以编写一个自动纠正所有错误法线方向的算法,我的意思是它必须检测错误的法线而没有任何帮助形式的用户和纠正他们。

我想到了一个需要图像处理的想法,我对图像处理一无所知,所以如果你可以从我应该从哪里开始实现这个目的:

首先我会假设每个黑脸都是错误的正常。

第二个我会将一个灯光从相机指向网格,如果所有像素都是黑色,则翻转法线。

并对所有网格物体执行此操作。

我想我会有一个速度问题但是我想到的一切。

感谢。

错误的红色飞机和黑色飞机,它们属于同一型号,并且它们都必须具有红色,但正如我所提到的那样,黑色的飞机翻转了它的法线。 enter image description here

2 个答案:

答案 0 :(得分:1)

OSG在osgUtil中有一个访问者类,可以为你计算所有顶点法线,称为smoothingVisitor。您只需在加载后将其指向模型,例如:

// recalculate normals with the smoothing visitor
osgUtil::SmoothingVisitor sv;
loadedModel->accept(sv);

这将破坏现有的顶点法线,或者如果它们不存在则创建新的法线。只是快速查看它,看起来它假设你的几何是三角形,而不是你画的四边形,但我可能是错的。

答案 1 :(得分:0)

我怀疑索引有问题,如果没有,那么完全忽略普通表可能会更好。我不确定细节,但我认为它是1个法线/顶点,所以接近它将涉及计算poligon法线,你可以用它来做:

normalize(cross_product(vert0 - vert1, vert0 - vert2));

之后平均共享顶点的poligons的法线应该这样做。 计算新计算的法线和原法线的点积将揭示原始法线是否偏离。

无论如何,对于您的问题,StackOverflow并不是真正的问题,还有其他Stack Exchange站点实际上专门针对类似的问题。此外,关于这个问题的信息太少,所以帮助也不容易。