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

13 篇文章 0 订阅
12 篇文章 0 订阅

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

//渲染模型
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++基础确实看的很辛苦!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值