Assimp与MeshLab Wavefront Object(.obj)导入

时间:2014-09-24 18:50:12

标签: import 3d wavefront assimp meshlab

我想知道为什么当我使用Assimp库导入Wavefront Object文件(.obj)时,它会将某些顶点加倍,我在Assimp SourceForge讨论中找到了以下答案(http://sourceforge.net/p/assimp/discussion/817654/thread/026e9640/?limit=25#ba6c):

  

想象一下:您将一系列顶点上传到图形卡。然后通过索引缓冲区告诉GPU你希望第一个三角形由顶点3,6和7组成。第二个三角形则是1,2和6.会发生什么? GPU会为您绘制一个立方体,但立方体的每个角都会共享相同的UV数据,法线向量,顶点颜色或网格需要的任何其他颜色。

  现在我们如何获得一个立方角,但是在接触那个角落的所有侧面都会得到不同的UV映射?我们不能告诉GPU“使用顶点3,但是请使用UV坐标而不是该顶点的UV坐标。” GPU无法做到这一点。这就是为什么有必要在那个角落复制顶点。现在,您有两个顶点用于相同的位置,但具有不同的UV坐标。

  这就是阿西姆为你做的事情。如果确实指定了JoinIdenticalVertices,则会得到一个包含24个顶点的多维数据集。为什么?一个立方体有8个角,但每个角落有3个立方体侧面,每个立方体侧面都有为该角落设置的不同UV坐标,所以最终每个角落有3个版本。如果未指定JoinIdenticalVertices,则会获得一个普通的顶点数组,而不会重复使用。这意味着你需要2个三角形,每个立方体各有3个顶点,最后是36个顶点。

  另一种方法是使用3D uv coords和立方体贴图来纹理该立方体。这是一个特殊情况,只适用于多维数据集,但它可以工作。然后,GPU在内部映射到6个纹理。上面的描述是一般情况,对于您可能遇到的每个网格,它都是这样的。

确实有意义。
前提是我不知道MeshLab如何处理.obj导入操作怎么回事,如果我找到的答案是正确的,当我导入这样一个对象时顶点计数器没有'增加?这只是他们如何进行计数的问题,还是有办法导入.obj文件,而不必在它们有法线/切线/ UV时拆分顶点?

1 个答案:

答案 0 :(得分:2)

这不是特定于实现的(例如,它们有几个向量 - 每个变量一个),但逻辑是相同的。

Meshlab为每个3D坐标生成一个顶点,除了常见位置之外还有几个可能的“值”,用于变量,如法线和纹理。这些顶点存储在顶点矢量中。

这些多个值存储在一个单独的顶点数据向量中(我称之为VDV)。三角形面将指向VDV中的3个条目,但顶点可指向任意数量的条目。

在渲染时,VDV将用于索引目的,但在计算内容和计算顶点数时会使用实际顶点。他们在正常的东西上有单独的“组合”值,它们会考虑所有相邻的面孔。