如何将这个wavefront .obj数据放到平截头体上?

我终于想出了如何从.obj文件获取数据,并将顶点位置x,y,z存储到名为Points的结构中,其成员types为float 。 我想知道如何将这些数据放到屏幕上。

这是我的尝试:

 //make a fileobject and store list and the index of that list in ac string ifstream file (list[index].c_str() ); std::vector<int>faces; std::vector<Point>points; points.push_back(Point()); Point p; int face[4]; while ( !file.eof() ) { char modelbuffer[10000]; //Get lines and store it in line string file.getline(modelbuffer, 10000); switch(modelbuffer[0]) { case 'v' : sscanf(modelbuffer, "v %f %f %f", &p.x, &p.y, &p.z); points.push_back(p); cout << "Getting Vertex Positions" << endl; cout << "v" << px << endl; cout << "v" << py << endl; cout << "v" << pz << endl; break; case 'f': sscanf(modelbuffer, "f %d %d %d %d", face, face+1, face+2, face+3 ); cout << face[0] << endl; cout << face[1] << endl; cout << face[2] << endl; cout << face[3] << endl; faces.push_back(face[0]); faces.push_back(face[1]); faces.push_back(face[2]); faces.push_back(face[3]); } GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, points.size(), points.data(), GL_STATIC_DRAW); //glBufferData(GL_ARRAY_BUFFER,sizeof(points), &(points[0]), GL_STATIC_DRAW); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); glVertexPointer(3, GL_FLOAT, sizeof(points),points.data()); glIndexPointer(GL_DOUBLE, 0, faces.data()); glDrawArrays(GL_QUADS, 0, points.size()); glDrawElements(GL_QUADS, faces.size(), GL_UNSIGNED_INT, faces.data()); } 

正如你所看到的,我显然已经失败了,但是我真的不知道为什么它不把数据渲染到视锥体上? 有没有人有这个解决scheme?

我会留下我的其他答案,因为我认为这是更有价值的一般建议,人们可以分开考虑。

在代码中查看更多细节引发了以下问题,在获得工作代码之前,所有这些问题都需要得到解答。

  • 你为什么要调用glDrawArrays glDrawElements? 你应该做一个或另一个,取决于你如何组织你的数据。
  • 你为什么每一行画一个画? 只有一些线(面)包含你可以实际绘制的图元,甚至你想要把它们全部收集起来然后渲染,不加一个,然后渲染,然后添加另一个,然后渲染。 我将假设“vertexbuffer”声明中的所有内容实际上都被认为是在循环之外,而这只是一个input问题的拼写错误,否则代码就会被破坏。
  • 在glBufferData中,为什么按照指定的方式传递点数而不是数据缓冲区的大小(以字节为单位)?
  • 在glVertexAttribPointer中,为什么当你只有3个时,Point结构由4个GL_FLOAT组成?
  • 事实上,为什么你使用glVertexAttribPointer(因为你没有调用glEnableVertexAttribArray来启用它,你继续使用glVertexPointer)
  • 你为什么要告诉glVertexPointer你有一个步长与点数组的大小相等,而不是你实际上有0个字节?
  • 你是否使用glEnableClientState(GL_VERTEX_ARRAY,GL_TRUE)在其他地方启用顶点数组客户端状态? 和GL_INDEX_ARRAY?
  • 在glDrawArrays中,为什么要传递顶点的数量,而不是4 *的数量?
  • 为什么你的索引整数,而不是像你告诉glDrawElements无符号整数?

所有这些我在15分钟内find了OpenGL函数参考。 我想你会更好的服务,回头再看几个教程,说明使用顶点/索引数组和其他基本GL函数,然后再跳转到试图编写.OBJ渲染器。 另外,我建议谷歌search其他现有的OpenGL .OBJ实现(其中必须有几十),以供参考。

在任何情况下,我有一些裸露的骨骼几何渲染,但没有真正的基础设施,这是一些简单明了的东西,几何渲染部分实际上是罚款。 检查:

  • 您的相机/视图matrix实际上是在查看对象(移动对象或您的相机,直到您看到的东西 – 一个肮脏的animation循环,你轨道的相机或对象通常就足够了)
  • 您的投影matrix是明智的(FOV不是零,或者只是简单的未初始化)
  • 您的场景点亮(您不是在黑色背景上渲染黑色物体 – 更改背景颜色)