Qt实现读取显示obj文件——绘制数据

来源:互联网 发布:android精品源码 编辑:程序博客网 时间:2024/05/01 00:48

前面的工作做好之后,绘制的代码就没那么麻烦了,但是要注意纹理坐标和面的节点坐标是交替进行的,就是一个纹理坐标,一个节点坐标~否则显示不出来纹理!(成功的图就不发了,估计是要保密的~)

//渲染模型void _glDraw(_GLModel* model, size_t mode){    if (mode & _GL_FLAT && model->list_FaceNormal.size() == 0)    {        qDebug(T_QString2Char("Flat模式不可用!"));        mode &= ~_GL_FLAT;    }    if (mode & _GL_SMOOTH && model->num_Normals == 0) {        qDebug(T_QString2Char("Smooth模式不可用!"));        mode &= ~_GL_SMOOTH;    }    if (mode & _GL_TEXTURE && model->num_Textcoords == 0) {        qDebug(T_QString2Char("Texture模式不可用!"));        mode &= ~_GL_TEXTURE;    }    glPushMatrix();    //glTranslatef(model->Center[0], model->Center[1], model->Center[2]);    for (size_t i = 0; i < model->num_Faces; i++)    {        Face f = model->list_Faces[i];        if (mode&_GL_TEXTURE)        {            glEnable(GL_TEXTURE_2D);            if (f.index_Text != -1)//绘制指定的纹理一定要将对应的纹理先启动绑定                glBindTexture(GL_TEXTURE_2D, model->textureArray[f.index_Text]);        }        glBegin(GL_POLYGON);        //glBegin(GL_QUADS);        if (mode&_GL_FLAT)        {            FacetNormal fn = model->list_FaceNormal[f.index_Face];            glNormal3f(fn.NX, fn.NY, fn.NZ);        }        for (int k = 0; k < f.list_index_Points.size(); k++)        {            if (mode&_GL_TEXTURE)            {                TextCoords tc = model->list_Textcoords[f.list_index_TextCoords[k]];                glTexCoord2f(tc.U, tc.V);            }            if (mode&_GL_SMOOTH&&f.list_index_VertNormals.size()>0)            {                VertNormals vn = model->list_Normals[f.list_index_VertNormals[k]];                glNormal3f(vn._NX, vn._NY, vn._NZ);            }            Point3 p = model->list_Vertices[f.list_index_Points[k]];            glVertex3f(p._X, p._Y, p._Z);        }        glEnd();    }    glPopMatrix();}

全部的代码已经放在了GitHub上了,戳我;

代码较为初级和简陋,希望可以帮助到初学者;如果大家想学习更多的三维数据的相关知识,可以下载meshlab相关的源码进行研究,编译可以参考我写的相关文章:编译meshlab;

但是没c++基础确实看的很辛苦!!!

0 0
原创粉丝点击