VS+OpenGl 显示三维STL模型 代码

今天调出了用VS环境结合OpenGL glut工具包进行显示STL模型的模块,进行了渲染。效果:

如下,后期会进行进一步优化,先贴上:

#ifndef DATA_H
#define DATA_H
struct Point
{
	float x;
	float y;
	float z;
};
struct TriAngle
{
	Point vertex[3];
	Point NormDir;
};
#endif // DATA_H

#include "stdafx.h"
#include "glut.h"
#include <vector>
#include <iostream>
#include <fstream>
#include "data.h"
#include <string>
using namespace std;

GLfloat yRot = 0;
vector<TriAngle> TrangleVector;
void ReadStlModel()
{
	//ifstream infile("C:\\Users\\FrankFang\\Desktop\\stl.txt");
	ifstream infile("C:\\Users\\FrankFang\\Desktop\\mode.stl");
    if (!infile.is_open())
	{
		return;
	}
	string temp, modelname;
	
	char dump[256];
	int trinumber=0;
	TriAngle tempTriAngle;
	infile >> temp;
	int test = temp.compare("solid");
	if (test != 0)
	{
		return;
	}

	infile.getline(dump, 25);
	infile >> temp;
	while (temp.compare("facet") == 0)
	{
		trinumber++;//三角形数目
		infile >> temp;//get rid of "normal "
		infile >> tempTriAngle.NormDir.x;
		infile >> tempTriAngle.NormDir.y;
		infile >> tempTriAngle.NormDir.z;

		infile.getline(dump, 256); infile.getline(dump, 256);//get rid of "outer loop"
		for (int i = 0; i<3; i++)
		{
			infile >> temp;
			infile >> tempTriAngle.vertex[i].x;
			infile >> tempTriAngle.vertex[i].y;
			infile >> tempTriAngle.vertex[i].z;	
			//tempTriAngle.push_back(temppoint[i]);
		}
		TrangleVector.push_back(tempTriAngle);
		infile >> temp;
		infile >> temp;
		infile >> temp;
	}//while()
}
//用来画一个坐标轴的函数
void axis(double length)
{
	glColor3f(1.0f, 1.0f, 1.0f);
	glPushMatrix();
	glBegin(GL_LINES);
	glVertex3d(0.0, 0.0, 0.0);
	glVertex3d(0.0, 0.0, length);
	glEnd();
	//将当前操作点移到指定位置
	glTranslated(0.0, 0.0, length - 0.2);
	glColor3f(1.0, 0.0, 0.0);
	glutWireCone(0.04, 0.3, 8, 8);
	glPopMatrix();
}
void paint(void)
{

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(-200.0, 200.0, -200.0, 200.0, -100, 100);
	glPointSize(1);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1.3, 1.6, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

	//画坐标系
	axis(2);

	glPushMatrix();
	glRotated(90.0, 0, 1.0, 0);//绕y轴正方向旋转90度
	axis(2);
	glPopMatrix();

	glPushMatrix();
	glRotated(-90.0, 1.0, 0.0, 0.0);//绕x轴负方向旋转
	axis(2);
	glPopMatrix();

	glPushMatrix();//旋转除坐标轴之外的物体
	glRotated(yRot, 0.0, yRot, 0.0);
	glPushMatrix();
	glColor3f(0.0f, 0.0f, 1.0f);
	glTranslated(0.125, 0.125, 0.125);
	glutWireCube(0.25);
	glPopMatrix();

	///stl model
	glPushMatrix();//旋转除坐标轴之外的物体
	vector<TriAngle>::iterator it2;
	for (it2 = TrangleVector.begin(); it2 != TrangleVector.end(); it2++)
	{
		glBegin(GL_TRIANGLES);
			glNormal3f(it2->NormDir.x, it2->NormDir.y, it2->NormDir.z); 
			glVertex3f(it2->vertex[0].x, it2->vertex[0].y, it2->vertex[0].z);
			glVertex3f(it2->vertex[1].x, it2->vertex[1].y, it2->vertex[1].z);
			glVertex3f(it2->vertex[2].x, it2->vertex[2].y, it2->vertex[2].z);
		glEnd();
	}
	glPopMatrix();
	///stl end

	glPopMatrix();//用来整体绕y轴旋转
	glutSwapBuffers();
}
void Init()
{
	glClearColor(0.8, 0.8, 0.8, 1.0);


	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
	GLfloat mat_shininess[] = { 90.0 };
	GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_SMOOTH);

	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);


	GLfloat lmodel_ambient[] = { 0.8, 0.8, 0.7, 1.0 };
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1.3, 1.6, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void SpecialKeys(int key, int x, int y)
{
	if (key == GLUT_KEY_LEFT)
		yRot -= 5.0f;

	if (key == GLUT_KEY_RIGHT)
		yRot += 5.0f;

	if (key> 356.0f)
		yRot = 0.0f;

	if (key< -1.0f)
		yRot = 355.0f;
	glutPostRedisplay();
}
int main(int argv, char *argc[])
{
	ReadStlModel();

	glutInit(&argv, argc);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(400, 300);
	glutCreateWindow("3D空间绘制各种系统自带立方体");
	Init();
	glutDisplayFunc(paint);
	glutReshapeFunc(reshape);
	glutSpecialFunc(SpecialKeys);
	glutMainLoop();
}


  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
### 回答1: 使用MFC和OpenGL来读取并显示STL三维模型需要以下几个步骤: 1. 创建一个新的MFC项目,选择对话框应用程序作为模板。 2. 将OpenGL库文件添加到项目中,并进行相关配置,以便在对话框中使用OpenGL绘图。 3. 在对话框中添加一个静态文本框和一个自定义的OpenGL绘图区域。 4. 创建一个自定义的OpenGL绘图类,用于在绘图区域中显示STL模型。在该类中,定义一个透视投影矩阵、模型矩阵和视图矩阵,通过OpenGL函数来加载和渲染STL文件中的三角形。 5. 在对话框类中,添加一个自定义的OpenGL绘图类的成员变量,并在OnInitDialog()函数中对其进行初始化。 6. 在OnInitDialog()函数中,调用自定义OpenGL绘图类的初始化函数,传入STL模型文件的路径,将模型加载到内存中。 7. 在OnPaint()函数中,调用自定义OpenGL绘图类的绘制函数,将模型渲染到OpenGL绘图区域。 8. 处理对话框中的事件,例如按钮点击事件,调用自定义OpenGL绘图类的相应函数进行操作,如旋转、平移等。 9. 在应用程序类的InitInstance()函数中,创建对话框类的对象,并显示对话框。 通过以上步骤,可以实现在MFC应用程序中读取并显示STL三维模型。 ### 回答2: MFC是Microsoft Foundation Classes的缩写,是一种用于Windows平台的C++应用程序框架。OpenGL是一种跨平台的图形API,用于开发图形和计算机视觉应用程序。STL(Standard Template Library)是C++的一部分,提供了一组通用的数据结构和算法。 要在MFC应用程序中读取并显示STL三维模型,可以按照以下步骤进行操作: 1. 首先,创建一个MFC应用程序项目,并在项目中添加OpenGL支持。这可以通过在项目属性中启用OpenGL选项来实现。 2. 在MFC应用程序中创建一个窗口,用于显示3D模型。这可以通过创建一个自定义的CStatic控件,并在其上绘制OpenGL图形来实现。 3. 接下来,编写代码来读取STL文件的数据。STL文件中包含三角形网格的顶点和法线信息。可以使用标准的文件处理函数来读取和解析STL文件的内容,并将其存储在一个适当的数据结构中。 4. 通过OpenGL的API函数,将STL模型数据绘制到窗口中。可以使用OpenGL的顶点数组和绘制函数来绘制三角形网格的各个面。 5. 最后,将OpenGL绘制的结果显示在MFC窗口中。可以通过重载绘图消息处理函数,并在其中调用OpenGL的绘制函数来实现。 需要注意的是,由于MFC和OpenGL都是底层的图形库,对于初学者来说,可能需要一定的编程经验和对图形编程的理解。这个过程可能需要一些时间和尝试来完善和调试。 ### 回答3: 在 MFC 中使用 OpenGL 来读取并显示 STL 三维模型可以通过以下步骤实现: 1. 添加准备创建 OpenGL 窗口的代码。在 MFC 的窗体类中,可以使用 `COpenGLControl` 类或 `CView` 类来实现 OpenGL 窗口。 2. 创建一个函数来读取 STL 三维模型文件。你可以使用 STL 文件解析库,例如 `std::ifstream` 类来读取 STL 文件的内容。 3. 在创建的 OpenGL 窗口中,使用 OpenGL 函数来绘制三维模型。你可以使用 `glBegin`、`glEnd` 和 `glVertex3f` 等函数来绘制模型的顶点和三角面片。 4. 在 OpenGL 窗口中,将读取到的 STL 三维模型数据传入 OpenGL 函数来进行绘制。你可以使用 `glColor3f` 函数来设置模型的颜色。 5. 在 MFC 的窗体类中,实现绘制 OpenGL 窗口的函数。通过重写 `OnDraw` 或 `OnPaint` 函数,调用 OpenGL 窗口的绘制函数。 6. 在 MFC 的窗体类中,重写 `OnCreate` 函数来初始化 OpenGL 窗口,调用读取和显示 STL 模型的函数。 7. 在 MFC 的窗体类中,为了在窗口中显示 OpenGL 窗口,重写 `OnSize` 函数,并调用 OpenGL 窗口的调整大小函数。 通过上述步骤,你可以在 MFC 中使用 OpenGL 来读取并显示 STL 三维模型。你可以进一步优化代码,例如添加相机控制、光照设置等来增强模型显示效果。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值