当前位置: 首页 > 面试题库 >

为什么我的OBJ分析器渲染这样的网格?

陆洛城
2023-03-14
问题内容

我本人已将OBJ解析器/导入器支持添加到我一直在努力的3D渲染引擎中。我遵循的规范发现这里几乎是“三通”,但当前的例外是将所有支持限制为组,面,顶点,法线和纹理坐标(因此,到目前为止还没有材料库或自由形式的多边形支持)
。我的目标是简单地逐行解析-随着我的进行,生成一个面向对象的,分层的树状场景图-
并允许开发人员通过很少的手动调用将数据自动绑定到着色器程序,以便开始操作和查看网格。最终结果是我的引擎成功解析了 大多数 (如果不是 全部)
)有效的OBJ格式文件,提取适当的数据并将其发送到基本着色器进行渲染。但是,即使数据似乎在场景图中正确表示,由于某种原因,也很少能正确呈现…

请注意,一个简单的平面(从3DS Max导出,仅包含4个顶点和2个面)可以很好地渲染,但是立方体或其他更高级的物体通常最终看起来像这样:

//youtu.be/1x6bnuhAXWY)

我无法分辨出哪里出了问题,AFAIK我的代码实际上应该可以正常解析和渲染基本几何图形了……那为什么不呢?为了方便起见,我在这里上传了我的项目。它包含一个NetBeans项目(具有我的引擎的最低版本)和一个Test应用程序。我还包括了OBJ立方体网格物体的3个不同版本和一个平面网格物体。可通过编辑Test.java顶部的值来配置该应用程序,唯一的输入控件是用于网格转换的A,S,W和D,以及用于网格旋转的鼠标移动。尽管我设法略微简化了项目,但最著名的类还是在文件顶部包含了额外的注释/信息。

考虑到所有事情,我将尽我所能………这肯定不会被人们欣赏!


问题答案:

我尚未下载您的项目。在编写用于用OpenGL渲染的OBJ导入代码时,人们最不愿意做的就是索引。正如@ratched_freak在他的评论中还怀疑的那样,这与多维数据集的视觉外观非常一致。

OBJ格式对位置,法线和纹理坐标使用单独的索引。对于OpenGL渲染,您需要一组索引。这意味着您需要为OBJ文件中的三角形所使用的位置/法线/纹理索引的每个唯一组合生成一个顶点,为该组合分配一个新索引,然后在OpenGL索引缓冲区中使用该索引。

编辑,以进一步说明问题。这是我在网上找到的“多维数据集”文件:

v  0.0  0.0  0.0
v  0.0  0.0  1.0
v  0.0  1.0  0.0
v  0.0  1.0  1.0
v  1.0  0.0  0.0
v  1.0  0.0  1.0
v  1.0  1.0  0.0
v  1.0  1.0  1.0

vn  0.0  0.0  1.0
vn  0.0  0.0 -1.0
vn  0.0  1.0  0.0
vn  0.0 -1.0  0.0
vn  1.0  0.0  0.0
vn -1.0  0.0  0.0

f  1//2  7//2  5//2
f  1//2  3//2  7//2 
f  1//6  4//6  3//6 
f  1//6  2//6  4//6 
f  3//3  8//3  7//3 
f  3//3  4//3  8//3 
f  5//5  7//5  8//5 
f  5//5  8//5  6//5 
f  1//4  5//4  6//4 
f  1//4  6//4  2//4 
f  2//1  6//1  8//1 
f  2//1  8//1  4//1

该文件有8个位置(v记录)和6个普通(vn记录)。该f记录的面孔,三角形在这种情况下。查看第一个三角形顶点,会1//2告诉您该顶点使用位置1和法线2。使用OpenGL索引数组时,不能为位置和法线使用单独的索引。因此,我们为此位置/法线对创建一个顶点,并为其分配第一个可用索引。与7//2和相同5//2,因此我们现在有3个OpenGL顶点(索引0、1和2)。

现在在第二个三角形上,我们1//2再次找到。我们已经为此组合创建了一个顶点,因此我们可以再次使用顶点0。3//2是新的,因此我们为其创建一个新的顶点(索引3)。7//2我们之前看到过,它与顶点1相同。

因此,我们得到了第一个2个三角形的4个OpenGL顶点。这是有道理的,因为两个三角形描述了立方体的一个面,并且我们需要4个顶点才能构成一个正方形。

如果在整个示例中继续执行此过程,最终将得到24个顶点,可以存储在OpenGL顶点缓冲区中,而索引缓冲区则包含36个条目(12个三角形,每个三角形3个角)。



 类似资料:
  • 此组件渲染两次并抛出错误。我知道这个错误是因为它们在reduce函数中没有返回语句。但我不明白的是,为什么它会渲染两次? 此外,当我删除代码时,它只呈现一次。据我所知,一个组件只能在四种情况下重新渲染 状态的变化 道具的变化 强制渲染 父母重新渲染。 在我的例子中,父组件没有重新渲染(我通过在父组件中使用console.log检查了它),并且这个组件是无状态的,没有道具被传递给它。有人能解释一下这

  • 问题内容: 我的React组件有问题。我组件的嵌套子代似乎没有渲染。这是我的代码: 我在此文件的顶部有以下两行: 这是我的组件: 我努力了: 以完整的HTML标记调用组件(打开和关闭) 将组件嵌套在组件中(在index.jsx文件中) 我知道嵌套组件是可能的。我已经看到了。由于某种原因,它对我不起作用。 问题答案: 要允许组件包含子项并正确渲染它们,必须使用。这是传递到所有组件与孩子为道具,包含组

  • 问题内容: 我有一个已创建的组件: 当我打开此页面时,我的中的每个页面都会被调用。如果我喜欢: 我还可以使用匿名函数: 然后它会按预期工作。为什么会这样? 问题答案: 您需要传递对函数的 引用 ,当您这样做时调用函数并传递给从返回的值。您可以使用以下三个选项之一: 1 。使用 2 。使用箭头功能 3 。或从返回函数

  • 我已经花了一个多小时试图解决这个问题,但我什么都没做。 当我试图使用Maven编译我的项目时,我得到了以下错误: [错误]无法执行目标组织。阿帕奇。专家插件:maven assembly插件:2.2-beta-5:single(默认cli)在GankALane项目上:无法解析mojo org的配置。阿帕奇。专家插件:maven assembly插件:2.2-beta-5:单参数存档:在组织中找不到

  • 在我的主类下面,我试图从搅拌机渲染一个obj. obj文件,在将其重新格式化为(据称)为我的渲染工作后,它会出现错误。我如何解决这个问题? 主要类: OBJLoader类: 类别模型: 类面: 对不起,如果这是过度的,我知道错误来自第85行,但我似乎不知道如何修复它。 OBJ文件示例(精简):

  • 我正试图按照本教程学习pygame。我正试图繁殖敌人的物体,但我认为我犯了一个错误,因为没有显示任何东西。 据我所知,我必须创建一个敌人类,然后添加一个事件来添加敌人(ADDENEMY)。当该事件被调用时(由于计时器的作用,每250毫秒一次),它应该会显示一个向左移动的敌人,直到它到达显示的末尾。 我有一组敌人精灵和一组所有精灵,我使用screen.blit和for循环将所有精灵中的每个实体渲染到