前面的工作做好之后,绘制的代码就没那么麻烦了,但是要注意纹理坐标和面的节点坐标是交替进行的,就是一个纹理坐标,一个节点坐标~否则显示不出来纹理!(成功的图就不发了,估计是要保密的~)
//渲染模型
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++基础确实看的很辛苦!!!