解析了我的.obj文件,但它的显示很奇怪
Parsed my .obj file but it is being displayed weirdly
我遵循了如何在blender中创建城堡的教程,然后我将其导出为。obj文件并将其解析为如下格式:
GLfloat mesh01_coords[] = {
50, 0.1, 50,
-50, 0.1, 50,
-50, 0.1, -50,
50, 0.1, -50,
-9.6351, 9.94983, 17.4283,
-9.6351, 9.94983, 18.7616,
-9.07887, 9.94983, 18.7616,
-9.07887, 9.94983, 17.4283,
10.2729, 9.94983, 18.8564,
10.2729, 9.94983, 17.523,
9.71662, 9.94983, 17.523,
9.71662, 9.94983, 18.8564,
10.3075, 9.94983, 20.0883,
8.97417, 9.94983, 20.0883,
8.97417, 10.9498, 20.0883,
...
编辑:我已经设置了索引数组
GLubyte mesh01_indices[] = {
0, 2, 1,
0, 3, 2,
4, 6, 5,
4, 7, 6,
...
难道我的模型装载不就是
吗?glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, mesh01_normals);
glVertexPointer(3, GL_FLOAT, 0, mesh01_coords);
glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);
这将生成随机对象与我想要的结果一点也不接近
谢谢大家的帮助,我把它修好了。Obj文件使用索引。基本上,这意味着你可以通过指定三角形作为顶点数组的索引来消除重复的顶点,而不是直接指定带有顶点的三角形。
下面是一个绘制正方形(伪代码)的"朴素"方法的例子:
// Triangle 1
Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
// Triangle 2
Vertex v4 = (1, -1, 0)
Vertex v5 = (-1, 1, 0)
Vertex v6 = (1, 1, 0)
使用索引,这看起来像:
Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
Vertex v4 = (1, 1, 0)
indices = {v1, v2, v3, // First triangle
v3, v1, v4} // Second triangle
现在,因为你是加载你的数据"幼稚"的方式,你基本上跳过了一些三角形,将需要渲染(因此"缺失的方面")。此外,一些三角形将无法正确渲染,因为你是从顶点创建它们,这些顶点可能彼此没有关系。
使用GL_QUADS不能解决你的问题。您可以创建一个索引缓冲区,操作方式类似于第二个示例,或者存储顶点,然后循环遍历索引并从索引创建单个顶点到顶点数组,这将导致类似于第一个示例的结果。但是,使用后一种方式将导致更差的性能和更多的内存消耗,因为您要存储更多的顶点,因此需要向显卡传递更多的信息。
通过使用GL_UNSIGNED_INT作为我的索引,以及重新编译我的blender文件,以确保所有的东西都是三角形,我能够看到城堡
你的代码
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, mesh01_indices);
将只绘制一个三角形,因为它将只使用前3个索引。试着
glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);
其中n为mesh01_indices
的索引数
相关文章:
- 为什么我的程序不能显示斐波那契级数?
- 为什么我的 cout 在输出中没有显示字符串?
- 为什么在为其分配编号后无法显示我的字符串值?
- 你能帮我解决显示矩阵的问题吗?
- 我的期末考试遇到了麻烦.代码不断循环回到我的订购菜单,不会显示我的总价
- 如何重载运算符<<显示我的列表
- 为什么我无法显示我的链表?
- 为什么我的代码不显示我的 TButton 数组?
- 我如何显示我的字符串
- 如何在printf中显示我的源代码的行号
- 如何在Qt客户端应用程序中显示我的OSM磁贴
- 类,显示我的最终结果C++时出现问题
- 需要有关使用 for 循环显示我的数组的帮助
- 有没有一种方法可以在两列中显示我的素数列表输出
- 如何显示我的 Queue & Stack?
- 如何使用 OPENCV 显示我的代码中的图像
- 无法显示我的每个函数的结果
- 我如何让Anjuta突出显示我的构建系统(waf)产生的错误/行
- 如何在 GUI 输出窗口而不是 Visual Studio 2015 中的 cmd 控制台上显示我的C++程序输出
- 为什么 OpenGL 不显示我的火粒子