参考网址:https://blog.youkuaiyun.com/chaojiwudixiaofeixia/article/details/50498629
https://blog.youkuaiyun.com/qq_28057541/article/details/51362945
本次实验的对象是斯坦福大学著名的bunny模型(兔子模型)。本文主要介绍了如何如下两点:
- 使用openmesh读取obj文件
- 使用opengl重绘读取的文件
本文所用的3d模型示意图如下所示:
具体的实验步骤讲解如下所示:
- 利用openMesh读取obj文件
void readfile(string file) { //请求顶点法线 mesh.request_vertex_normals(); //如果顶点法线不存在则报错 if (!mesh.has_vertex_normals()) { cout << "Error:Standard Vertex Property 'Normals' Not Available!" << endl; return; } //读取obj文件 OpenMesh::IO::Options ort; if (!OpenMesh::IO::read_mesh(mesh, file, ort)) { cout << "Error:Cannot Read File:" << file << endl; return; } else { cout << "Success Read File:" << file << endl; } //如果不存在顶点法线,则计算顶点法线 if (!ort.check(OpenMesh::IO::Options::VertexNormal)) { //请求面法线 mesh.request_face_normals(); //利用面法线计算顶点法线 mesh.update_normals(); //释放面法线 mesh.release_face_normals(); } }
- 初始化顶点与面的绘制
//初始化顶点与面的绘制 void initGL() { //设置背景颜色值为黑色 glClearColor(0.0, 0.0, 0.0, 0.0); //设置清除深度缓存时使用的深度值为2 glClearDepth(2.0); //设置两点间颜色变化为过渡模式 glShadeModel(GL_SMOOTH); //开启深度缓冲区的功能,从而跟踪Z轴上的像素 glEnable(GL_DEPTH_TEST); //启用光源,利用当前的光照参数推导顶点颜色 glEnable(GL_LIGHTING); //启用1号光源 glEnable(GL_LIGHT0); //申请一个面的显示列表,从而实现加速显示 showFaceList = glGenLists(1); //申请一个线的显示列表,从而实现加速显示 showWireList = glGenLists(1); //获取网格中边的数量 int temp = mesh.n_edges(); /*绘制图像的线*/ //创建线的显示列表,并指定模式为编译模式 glNewList(showWireList, GL_COMPILE); //关闭光源 glDisable(GL_LIGHTING); //设定线的宽度 glLineWidth(1.0f); //设定线的颜色为灰色 glColor3f(0.5f, 0.5f, 0.5f); //将顶点作为线段进行处理,即双定点线段 glBegin(GL_LINES); for (MyMesh::HalfedgeIter he_it = mesh.halfedges_begin(); he_it != mesh.halfedges_end(); ++he_it) { //连接有向边的起点与终点 glVertex3fv(mesh.point(mesh.from_vertex_handle(*he_it)).data()); glV