从 obj 文件绘制模型
Drawing a model from obj file
我正在尝试用openGl编写一个obj查看器。这个程序只需要画模型的脸线,所以我需要加载:
- 顶点:有时在 3D 中,有时在 4D 中;
- 面:索引列表,长度随机;
现在我只加载 obj 文件,每个面有 3 个元素,所以我可以在GL_TRIANGLE模式下绘制元素,但我在某些模型上遇到了一些麻烦:
http://people.sc.fsu.edu/~jburkardt/data/obj/icosahedron.obj
加载阶段似乎工作正常,我认为问题出在 render() 函数中:
static void render(void)
{
glClearColor( 0.0f, 0.0f, 0.0, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, g_resources.vertex_buffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(
3, /* size */
GL_FLOAT, /* type */
3*sizeof(GLfloat), /* stride */
(void*)0 /* array buffer offset */
);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_resources.element_buffer);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glDrawElements(
GL_TRIANGLES, /* mode */
theModel->face.size(), /* count */
GL_UNSIGNED_INT, /* type */
(void*)0 /* element array buffer offset */
);
glDisableClientState(GL_VERTEX_ARRAY);
glutSwapBuffers();
}
我也有一些问题:
- 从 1 或 0 开始?
- 关于 indeces 枚举是怎么回事?是顺时针风格吗? 对
- 超过 3 个 indeces 的面部进行三角测量是一个很好的解决方案吗?
- 指数从 1 开始
- 逆时针
- 是的
如果您只遇到某些模型的问题,请尝试禁用GL_CULL_FACE以查看顶点顺序的区别。
OBJ 中的索引从 1 开始,GL 中的索引从 0 开始,因此在创建缓冲区时需要 -1。
相关文章:
- QTableView:endMoveRows在模型中重置水平页眉大小
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- 将IBM Rhapsody模型集成到VS 2019中
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 旋转模型矩阵时的形状失真
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 成员函数调用和C++对象模型
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- OpenGL-绘制相机空间后,将模型放置在世界空间中
- 如何从3d点数组在Qt中绘制和保存3D模型
- 使用模具缓冲区绘制三维模型的轮廓
- 从 c++ 头文件绘制模型
- 从 obj 文件绘制模型
- 无法使用 OpenGL ES 1.x C++绘制加载的模型
- 为什么绘制的模型不在屏幕中央
- Directx9绘制模型的方法