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"
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); //利用雙緩衝
}
六、執行程式,我們可以看到如下畫面
至此,本次視覺化研究告一段落,歡迎交流。