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

时间:2014-01-16 18:31:50

标签: c++ opengl blender normals assimp

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

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

我不知道这是否与Assimp如何加载.obj文件,或者blender在导出时处理法线的方式有关,或者它与大型z-scale有关,因为它会破坏正常插值或其他什么?您可以在下面找到反转法线(左)和正确法线(右)的图像,其中反正常对象通过搅拌器完成大的z刻度。

incorrect and correct normals

<小时/> 的修改

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

Normals of pipes in blender

<小时/> 的修改

Oké我想出了什么。一旦我开始将正确点亮的管道缩放到与错误管道(左侧管道)完全相同的比例,然后再次反转正确管道的法线(在我的OpenGL程序中反转,在Blender中,法线仍然看起来很好)。所以气缸长度的刻度肯定与它们的法线相反有关,虽然我不知道那可能是什么。

1 个答案:

答案 0 :(得分:2)

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

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