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();
}
VS+OpenGl 显示三维STL模型 代码的更多相关文章
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类 ...
- VTK中获取STL模型点的坐标以及对其进行变换
VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...
- 基于OpenGL的三维曲面动态显示实现
在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成. 1.基于OpenGL绘图的基本设置 1.1 设 ...
- VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维
VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维 2016年01月14日 11:40:28 博博有个大大大的Dream 阅读数:9375 版权声明:本文为博主原创文章,未经博 ...
- 第12课 OpenGL 显示列表
显示列表: 想知道如何加速你的OpenGL程序么?这一课将告诉你如何使用OpenGL的显示列表,它通过预编译OpenGL命令来加速你的程序,并可以为你省去很多重复的代码. 这次我将教你如何使用显示列表 ...
- 多路复用I/O模型poll() 模型 代码实现
多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...
- 读取STL模型
读取二进制格式的STL模型文件 std::ifstream fin;fin.open(stlFilePath, std::ios::in | std::ios::binary);bool isBina ...
- 一段显示隐藏列表HTML代码
一段显示隐藏列表HTML代码, 技巧在于把页面上的元素(“返回首页”)和控制显示/隐藏的元素(id=navs-menu)放在一个共同的div上,并在该div上绑定onmouseover和onmouse ...
随机推荐
- 学习:MessageBox API
函数功能: MessageBox 函数用于显示一个模态对话框,其中包含一个系统图标. 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息. 消息框中返回一个整数值,该值指示用户单击了哪个按钮. ...
- circus 做为批处理的守护进程
circus 是集成了zeromq,使用python编写的一个进程以及socket 管理工具,使用circus 的进程管理,我们可以用来进行批任务的 处理,同时又能保证任务的准确 项目使用docker ...
- python下浏览器静默运行驱动
此处以chromdriver为例,放置driver路径问题参看上一篇问题.和java处理差不多,python实现静默运行方式如下 首先解答为什么进行静默运行? 我们在本地一般便于调试可以用GUI界面运 ...
- JAVA中Stringbuffer的append( )方法
Stringbuffer是动态字符串数组,append( )是往动态字符串数组添加,跟“xxxx”+“yyyy”相当‘+’号. 跟String不同的是Stringbuffer是放一起的,String1 ...
- ICEM-哑铃
原视频下载地址:https://pan.baidu.com/s/1kVBKJbT ;密码: jqeh
- 第09组 Beta冲刺(2/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...
- 《The Boost C++ Libraries》 第一章 智能指针
Boost.SmartPointers中提供了多种智能指针,它们采用在智能指针析构时释放内存的方式,帮助管理动态分配的对象.由于析构函数在智能指针生命周期结束时被执行,所以由它管理的动态分配对象可以保 ...
- 微信小程序上架需要增值电信业务经营许可证ICP?
很多小程序的开发者最近都遇到了类似的问题,那就是辛辛苦苦开发出来的小程序上线不了,要求提供一些特殊资质,比方说:增值电信业务许可证(下面有数十种分类),网络文化经营许可证等类似证件,这对于创业团队来说 ...
- TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法
rwnd(窗口,代表接收端的处理能力).cwnd(拥塞窗口,从发送端看当前网络整体承载能力).ssthresh(快速增长切换成慢速增长的界限值) 1.慢启动,是指数增长(对面确认多少个包,就增加多少) ...
- java里的数组和list分别在什么情况下使用?
数组长度固定,List未限定长度,且支持的功能更多,最常用的ArrayList底层实际上也是使用数组实现. 不需要复杂功能和确定长度的情况下,使用数组效率更高,通常情况建议使用List.