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


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

By Cracent

本文转载自:http://blog.csdn.net/cracent/article/details/51049246

作为机械专业方向的人员,我们经常需要用SolidWorks构建模型。有些时候我们被要求将这些模型通过OPENGL进行表达。STL 是三维模型常用的文件格式,其使用三角面片来表示三维实体模型。本文进行将进行STL模型可视化研究,并开放源代码。

 

一、我们使用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); //利用双缓冲

}

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


至此,本次可视化研究告一段落,欢迎交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值