您的位置:首页 > 运维架构

Opengl教程之读取stl文件并绘制在picturecontrol控件内

2016-04-03 10:30 375 查看
Opengl教程之读取stl并绘制在picturecontrol控件内
By Cracent
作为机械专业方向的人员,我们经常需要用SolidWorks构建模型。有些时候我们被要求将这些模型通过OPENGL进行表达。STL 是三维模型常用的文件格式,其使用三角面片来表示三维实体模型。本文进行将进行STL模型可视化研究,并开放源代码。
 参考代码:http://download.csdn.net/detail/cracent/9758053
一、我们使用SolidWorks建立一个一字连接件并另存为STL格式



 


二、配置相应环境

三、建立CMyStatic类

2.1 添加类

2.2 类向导

2.2.1添加消息处理函数OnTimer()

2.2.2 重写虚函数PreSubclassWindow()

2.3 添加其他函数与变量

三、OpenGl使用 

3.1函数内容

3.2插入picture control控件, 并为其添加控制变量

 

以上几步请参考我的另一篇文章:《Opengl教程之读取obj并绘制在picturecontrol控件内》

 

四、stl文件读取

void
CMyStatic::GLFunc4()
{
    int max = 0;
    bool isbegin =
false;
    long size = 0;
    int nlines = 0;
    int count1 = 0;
    int count2 = 0;
    FILE* file = fopen("2.stl","r");
    fseek(file, 0L, SEEK_END);
    size = ftell(file);
    fclose(file);
    file = fopen("2.stl","r");
    for (int i = 0;i < size;i++)
    {
        if (getc(file) ==
'\n')
        {
            nlines++;
        }
    }
    num = nlines / 7;
    rewind(file);
    while (getc(file) !=
'\n');
    verts = new float[9 * num];
    vnorms = new float[9 * num];
    for (int i = 0;i < num;i++)
    {
        char x[200] =
"";
        char y[200] =
"";
        char z[200] =
"";
        if (3 != fscanf(file,
"%*s %*s %80s %80s %80s\n", x, y, z))
        {
            break;
        }
        vnorms[count1] = vnorms[count1 + 3] =vnorms[count1 + 6] = atof(x);
        count1++;
        vnorms[count1] = vnorms[count1 + 3] =vnorms[count1 + 6] = atof(y);
        count1++;
        vnorms[count1] = vnorms[count1 + 3] =vnorms[count1 + 6] = atof(z);
        count1 += 7;
        fscanf(file, "%*s %*s");
        if (3 != fscanf(file,
"%*s %80s %80s %80s\n", x, y, z))
        {
            break;
        }
        if (isbegin ==
false)
        {
            isbegin = true;
            max = atof(z);
        }
        verts[count2] = atof(x);
        count2++;
        verts[count2] = atof(y);
        count2++;
        verts[count2] = atof(z);
        count2++;
        if (3 != fscanf(file,
"%*s %80s %80s %80s\n", x, y, z))
        {
            break;
        }
        verts[count2] = atof(x);
        count2++;
        verts[count2] = atof(y);
        count2++;
        verts[count2] = atof(z);
        count2++;
        if (3 != fscanf(file,
"%*s %80s %80s %80s\n", x, y, z))
        {
            break;
        }
        verts[count2] = atof(x);
        count2++;
        verts[count2] = atof(y);
        count2++;
        verts[count2] = atof(z);
        count2++;
        fscanf(file, "%*s");
        fscanf(file, "%*s");
    }
 
}

五、STL文件显示

void
CMyStatic::GLFunc5()
{
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(-0.0f, -0.0f, -COpengl10基本环境Dlg::m_gltran-10);
    static
int RotateDegTriangle = 1;
    glRotatef(RotateDegTriangle++,RotateDegTriangle++, RotateDegTriangle++, 0.0f);
    glPushMatrix();
    int m_div = 1;
    for (int i = 0; i < 9*num; i++)
    {
        glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glNormal3f(vnorms[i] / m_div,vnorms[i+1] / m_div, vnorms[i+2] / m_div);
        glVertex3f((-verts[i]+ verts[1]) /m_div, (-verts[i+1]+ verts[2]) / m_div, (-verts[i+2]+ verts[3]) / m_div);
        i += 3;
        glColor3f(0.0f, 1.0f, 0.0f);
        glNormal3f(vnorms[i] / m_div, vnorms[i +1] / m_div, vnorms[i + 2] / m_div);
        glVertex3f((-verts[i] + verts[1]) /m_div, (-verts[i + 1] + verts[2]) / m_div, (-verts[i + 2] + verts[3]) / m_div);
        i += 3;
        //glColor3f(0.0f, 0.0f, 1.0f);
        glNormal3f(vnorms[i] / m_div, vnorms[i +1] / m_div, vnorms[i + 2] / m_div);
        glVertex3f((-verts[i] + verts[1]) /m_div, (-verts[i + 1] + verts[2]) / m_div, (-verts[i + 2] + verts[3]) / m_div);
        i += 2;
        glEnd();
    }
    glPopMatrix();
SwapBuffers(hdc); //利用双缓冲

}

六、运行程序,我们可以看到如下画面





至此,本次可视化研究告一段落,欢迎交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl stl 三维 可视化 MFC