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); //利用雙緩衝

}

六、運行程序,我們可以看到如下畫面


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章