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

标签 c++ opengl blender normals assimp

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

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

我不知道这是否与 Assimp 加载 .obj 文件的方式有关,或者 blender 在导出时处理法线的方式,或者它可能与大的 z 尺度有关,因为它破坏了法线插值或其他任何东西?在下面,您会发现反转法线(左)和正确法线(右)的图像,其中反转法线对象具有通过混合器完成的大 z 尺度。

incorrect and correct normals


编辑

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

Normals of pipes in blender


编辑

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

最佳答案

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

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

关于c++ - 通过 OpenGL Assimp 加载的对象有时会反转法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21170027/

相关文章:

c# - 用于解析 C/C++ 函数声明的正则表达式

c++ - Opengl 性能问题,

python - 通过网络在 blender 中发送矢量对象

javascript - 如何导出 Blender 模型以在 THREE.js 中显示颜色

blender - 在独立项目中使用 Blender 中的 mathutils 模块

c++ - 在 C++ 中为 Rcpp 中的 predict() 输入创建数据框

c# - 从 C++ DLL 调用 C# 函数

c++ - 基于第一对的 "first"对 <std::pair<int, std::pair<int, int>>> 类型的 std::vector 进行排序的标准方法是什么

math - 在直线上找一个点

Java2D OpenGL 硬件加速不起作用