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 ...
随机推荐
- django-模板变量forloop
在django的模板中,有forloop这一模板变量,颇似php Smarty中的foreach.customers, Smarty foreach如下: {foreach name=customer ...
- Haskell语言学习笔记(95)Semiring
semirings 模块 semirings 模块需要安装 $ cabal install semirings Installed semirings-0.2.0.1 Prelude> :m + ...
- 更丰富的符号工具包 Font Awesome
我时常想要在此类文档中通过一些图形符号来表达更丰富的含义或是对段落进行标注,例如使用 Emoji.然而 Emoji 在这方面仍然有存在一些不足,如: 颜色与文字风格不统一, 在不同系统的平台上显示不统 ...
- CCPC-Wannafly Summer Camp 2019 Day1
A - Jzzhu and Cities CodeForces - 449B 题意:n座城市,m条路,k条铁路啥的吧,然后要求最多能删多少条铁路保持1到$n$的最短路不变. 思路:因为铁路是从1出发的 ...
- Bootstrap内辅助类,响应式工具,组件的个人总结
辅助类(工具类): 文本颜色: <p class="text-muted">Fusce dapibus, tellus ac cursus commodo, torto ...
- c++ 字符串相加
1. append string a= "xxx"; string b="yyy"; a.append(b); 结果 a = “xxxyyy”;
- velero 备份、迁移 kubernetes 应用以及持久化数据卷
velero 是heptio 团队开源的kubernetes 应用以及持久化数据卷备份以及迁移的解决方案,以前的名字为ark 包含以下特性: 备份集群以及恢复 copy 当前集群的资源到其他集群 复制 ...
- 使用terraform v0.12 生成gitlab repo 创建部署tf 文件
以前写过一个使用模版引擎+ rest 接口的模式,生成tf 文件,v0.12 直接提供了方便的json 处理函数 我们可以直接结合http 以及templatefile providers 方便的 ...
- 洛谷 P5506 封锁
目录 题目 思路 \(Code\) 题目 P5506 封锁 思路 模拟 \(\large\text{读题一定要细心}\) 解释都在代码里. \(Code\) #include<bits/stdc ...
- Linux基础及常用指令
1.Linux目录结构 bin(usr/bin,user/local/bin) #存放常用指令,如cp.cat.chown等 sbin(usr/sbin,user/local/sbin) #高权限指令 ...