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

2023-12-29

我自己决定将 OBJ 解析器/导入器支持添加到我一直在开发的 3D 渲染引擎中。我已遵循规范在这里找到 http://www.martinreddy.net/gfx/3d/OBJ.spec几乎“到了发球台”,除了当前限制对组、面、顶点、法线和纹理坐标的所有支持(因此到目前为止还没有材质库或自由形式多边形支持)。我的目标是简单地逐行解析——生成一个面向对象的、层次化的树状场景图——并允许开发人员自动将数据绑定到着色器程序,只需很少的手动调用,以便开始操作和查看网格。最终结果是我的引擎确实成功解析了most(如果不all)有效的 OBJ 格式文件,提取适当的数据并将其发送到基本着色器进行渲染。然而,即使数据在场景图中似乎正确表示,由于某种原因它很少正确渲染......

请注意,一个简单的平面(从 3DS Max 导出,仅包含 4 个顶点和 2 个面)渲染得非常好,但立方体或任何更高级的东西通常最终看起来像这样:

http://youtu.be/1x6bnuhAXWY http://youtu.be/1x6bnuhAXWY

我不知道哪里出了问题,据我所知,我的代码实际上应该很好地解析和渲染基本几何图形......那为什么不是呢?为了方便,我上传了我的项目在这里 http://www.4shared.com/rar/PQOijNEQce/OGLImport.html。它包含一个 NetBeans 项目,其中包含我的引擎的最小版本和一个测试应用程序。我还包含了 3 个不同版本的 OBJ 立方体网格和一个平面网格。该应用程序可通过编辑 Test.java 顶部的值进行配置,唯一的输入控件是用于网格平移的 A、S、W 和 D,以及用于网格旋转的鼠标移动。尽管我已经设法大幅浏览该项目,但最值得注意的类在文件顶部包含额外的注释/信息。

考虑到所有因素,我会采纳我能想到的任何想法……而且它肯定不会被忽视!


我还没有下载你的项目。人们在编写用于 OpenGL 渲染的 OBJ 导入代码时最困难的是索引。正如 @ratched_freak 在他的评论中也怀疑的那样,这与你的立方体的视觉外观非常一致。

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

我用伪代码写了一个答案,概述了如何针对最近的类似问题执行此操作:OpenGL - 索引缓冲区困难 https://stackoverflow.com/questions/23349080/opengl-index-buffers-difficulties/23356738#23356738.

编辑,更多地说明问题。这是我在网上找到的一个“cube”文件:

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 and 5//2,所以我们现在有 3 个 OpenGL 顶点(索引 0、1 和 2)。

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

所以我们最终得到了前 2 个三角形的 4 个 OpenGL 顶点。这是有道理的,因为两个三角形描述了立方体的一个面,而一个正方形需要 4 个顶点。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 OBJ 解析器渲染网格是这样的? 的相关文章

随机推荐

  • 将字节数组转换为双精度数的问题

    我在使用以下方法将字节数组转换为双精度数组时遇到问题BitConverter ToDouble 简而言之 我的程序将选择一个图像 然后将图像转换为字节数组 然后它将把字节数组转换为双精度数组 问题是 当我将字节数组转换为双精度数组时 我会在
  • 如果两个阶段使用相同的 RDD,spark 是否会读取同一个文件两次?

    在 Spark 中 如下代码 rdd sc textfile file path rdd1 rdd filter filter1 maptopair rdd2 rdd filter filter2 maptopair rdd3 rdd1 j
  • Android ProgressDialog 的样式

    我正在尝试定制ProgressDialog风格有类似的东西 我拥有的 我知道如何更改微调器的样式和颜色 但我不明白的是 如何制作圆角 我正在尝试使用android radius属性 但是没有任何变化 而且不知道如何减少padding 也许我
  • ASP.NET-MVC 2 数据注释字符串长度

    我可以使用 MVC 2 DataAnnotations 指定字符串字段的最小长度吗 有没有人这样做过或者他们创建了自定义属性 如果是的话 您介意分享源吗 如果您使用的是 asp net 4 0 则可以使用 StringLength 属性来指
  • 获取页面上选定的文本和选定的节点?

    当选择文本块 可能跨越许多 DOM 节点 时 是否可以使用 Javascript 提取所选文本和节点 想象一下这个 HTML 代码 h1 Hello World h1 p Hi b there b p 如果用户从 World 开始启动 mo
  • 在 IIS 10 中注册 asp.net

    我有一个与在 IIS 10 中注册 asp net 有关的问题 我的环境是Windows 10 IIS 10 安装了VS 2013和VS 2015 NET 3 5是Windows功能中的一个功能 我想在iis中使用nettcpbinding
  • Spring Security OAuth2 登录重定向到错误页面,尽管成功

    为了不泄露机密信息 提供商将被替换为 PROVIDER 授权有效 但它没有将我重定向到索引 而是将我重定向到 error 重现步骤 启动应用程序 进入任何页面 它会将我重定向到http localhost oauth login显示一个链接
  • 如何为每个箱线图设置不同的颜色

    我正在尝试在 VSCode 中制作 Seaborn 箱线图 我的代码基于这里的示例 here https github com bvalgard Boxplots blob master Boxplots ipynb 我专门制作了类似倒数第
  • Tkinter 帮助查看器

    我有一个简单的 Python Tkinter 应用程序 我想向其中添加帮助文档 将帮助查看器集成到应用程序的最简单方法是什么 最好是跨平台的 尽管我主要使用 Windows 我可以想象用纯 HTML 编写帮助 或者只是启动外部网络浏览器 使
  • 密码保护 Android 应用程序的启动

    我正在寻找一种在启动时用密码保护我的 Android 应用程序的方法 即当启动 恢复属于我的 apk 包的活动时 将显示密码对话框 我已经尝试了一些方法 扩展应用类 http developer android com reference
  • 在Excel中,使用VBA,如何获取“路径+文件名+扩展名”并更改扩展名?

    有一个动态生成 Excel 文件和 csv 的程序 excel 文件具有 加载时 加载 csv 数据的 VBA 代码 我想通过让 csv 文件具有相同的文件名但扩展名不同来动态调用该 csv 因此 根据我的理解 如果 xls 文件在这里 C
  • MS Access 直通查询到 SQL Server 需要什么字符清理

    我正在尝试将 MS Access 与 SQL Server 连接 并且我想确保我不会受到 SQL 注入攻击 我看到过使用 ADO 创建查询的参数化版本的建议 但我想了解如何通过 DAO 传递来清理我的输入 目前我正在转义单引号和反斜杠 VB
  • 在 Github 上分叉 Pull 请求

    有效分叉 Pull 请求的正确工作流程是什么 为了解释用例 我找到了一个存储库 其中包含一个添加了我需要的功能的拉取请求 不幸的是 拉取请求作者已经擅离职守 并且存储库所有者在编写测试之前不会接受拉取请求 我想 分叉 拉取请求并编写测试 以
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Windows 上具有大型数组的 Python 多处理

    我使用python的多处理模块在linux平台上编写了一个脚本 当我尝试在 Windows 上运行该程序时 它不能直接工作 我发现这与 Windows 上如何生成子进程有关 所使用的物品是否可以腌制似乎至关重要 我的主要问题是 我正在使用大
  • 通过 CLI 的 AWS DynamoDB put-item 类型无效(unicode v. dict)

    我想通过命令行向我的 DynamoDB 表添加一个项目 但遇到了类型错误 我尝试添加的数据非常简单 id 1 我运行的命令同样简单 aws dynamodb put item table name my table item id 1 我收
  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p
  • 为什么在 javascript 中列出类的实际构造函数很重要

    我正在阅读 javascript 花园http bonsaiden github com JavaScript Garden http bonsaiden github com JavaScript Garden 关于 javascript
  • 为什么我的 OBJ 解析器渲染网格是这样的?

    我自己决定将 OBJ 解析器 导入器支持添加到我一直在开发的 3D 渲染引擎中 我已遵循规范在这里找到 http www martinreddy net gfx 3d OBJ spec几乎 到了发球台 除了当前限制对组 面 顶点 法线和纹理