通过 OpenGL Assimp 加载的对象有时会反转法线

Posted

技术标签:

【中文标题】通过 OpenGL Assimp 加载的对象有时会反转法线【英文标题】:Object loaded via OpenGL Assimp sometimes inverses normals 【发布时间】:2014-02-05 20:19:06 【问题描述】:

目前,我正在尝试在搅拌机中制作的圆柱体对象上进行照明(在 z 轴上缩放的基本圆柱体,未进行进一步处理)并通过 Assimp 使用以下选项 aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs 加载此对象。在搅拌机的波前导出选项中设置了triangulate 选项。

问题在于在 cilinder 上进行了一些缩放(通常高于某个缩放阈值)我的 OpenGL 实现显示了反转的法线(我有一个显示法线的几何着色器)并且因为它反转了法线,所以照明是反转的以及。这只发生在这些具有一定缩放比例的圆柱状物体上(至少,只有在我发生这种情况时)。我场景中的所有其他对象都可以正常工作,除了这些圆柱体。

我不知道这是否与 Assimp 加载 .obj 文件的方式有关,或者与混合器在导出时处理法线的方式有关,或者可能与较大的 z 比例有关,因为它破坏了正常的插值或其他什么?在下面,您将找到一个反向法线(左)和正确法线(右)的图像,其中反向法线对象通过搅拌器完成了较大的 z 比例。


编辑

这次我手动对搅拌机中的圆柱体进行了三角测量,并验证了它们的法线。所有圆柱体的法线都正确,然后按原样导出。但是,一个管道现在具有正确的照明,但其他管道的法线仍然反转,而它们与工作管道具有相同的三角剖分,这令人困惑。下图显示了圆柱体的法线。


编辑

好吧,我想通了。一旦我开始将正确点亮的管道缩放到与不正确管道(左侧)完全相同的比例,然后再次反转正确管道的法线(在我的 OpenGL 程序中反转,在 Blender 中,法线看起来仍然很好)。因此,圆柱体长度的比例肯定与它们的法线反转有关,尽管我不知道那可能是什么。

【问题讨论】:

您是否尝试将aiProcess_FixInfacingNormals 添加到您的位掩码中? @AndonM.Coleman 不幸没有工作。还是一样的问题 默认情况下,blender 会创建一个带有 ngon 帽的圆柱体,您是否尝试在缩放或导出之前将它们更改为三角形? @mlvljr 这是一个相当古老的问题,我相信我已经解决了这个问题,但显然没有为这个问题提供答案。不均匀的尺度不是问题。问题是对象的反向缩放(在场景中不可见,因为反转的圆柱体仍然是同一个圆柱体)导致法线也被反转。我将为这个问题创建一个答案。 好的,有兴趣了解 【参考方案1】:

反法线的问题是由 Blender 中的反比例引起的。当缩小到0 阈值以下时,对象开始再次增长(负比例),由于反向缩放的圆柱体看起来与正常缩放的圆柱体相同,因此无法立即看到。

由于搅拌机缩放的工作原理,一些鼠标移动在缩放时往往会突然从正缩放跳到负缩放,这导致我的一些圆柱体被负缩放。将对象导出到 .obj 时,负比例圆柱体的法线反转。我会将此称为搅拌机中的错误,因为这在搅拌机本身显示的法线中是不可见的(它们看起来是正确的)。

【讨论】:

以上是关于通过 OpenGL Assimp 加载的对象有时会反转法线的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅Assimp库支持哪些3D模型格式?

我的OpenGL学习进阶之旅Assimp库支持哪些3D模型格式?

渲染在 OpenGL 中使用 Assimp 加载的动画模型时折叠的网格

Assimp里的一些知识

编译Assimp傻瓜教程

Opengl 顶点数组对象