1. 程式人生 > >Opengl教程之讀取stl檔案並繪製在picturecontrol控制元件內

Opengl教程之讀取stl檔案並繪製在picturecontrol控制元件內

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

}

六、執行程式,我們可以看到如下畫面


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