• 大小: 14KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: C/C++
  • 标签: off文件  山东大学  

资源简介

读取off文件进行显示,支持平移,旋转等基本交互操作。(在vs2017中需要使用Release模式运行)

资源截图

代码片段和文件信息

// project2.1.cpp: 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include   
#include   
#include   
#include “GL\glut.h“
#include 
#include 
#include 
#include 


using namespace std;
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;

//鼠标交互有关的
int mousetate = 0; //鼠标当前的状态
GLfloat Oldx = 0.0; // 点击之前的位置
GLfloat Oldy = 0.0;
//与实现角度大小相关的参数,只需要两个就可以完成
float xRotate = 0.0f;
float yRotate = 0.0f;
float ty = 0.0f;
float tx = 0.0f;
float scale = 1;

//文件读取有关的
MyMesh mesh;
const string file = “1.off“;
int currentfile = 1;

GLuint showFaceList showWireList;
int showstate = 1;
bool showFace = true;
bool showWire = false;
bool showFlatlines = false;

//初始化顶点和面   
void initGL()
{
glClearColor(0.0 0.0 0.0 0.0);
//深度值小于2的就会被现实出来
glClearDepth(2.0);
/*
在使用顶点数据绘制几何图形时,如果为每个顶点指定了顶点颜色,
此时若使用GL_SMOOTH,每个顶点使用对应的顶点颜色来着色,
而顶点之间的片元颜色则使用差值的方式来计算获得,
结果就是渐变色;而若使用GL_FLAT,假设几何图形由n个三角形构成,
则只会使用顶点颜色数组中最后n个颜色进行着色。
*/
glShadeModel(GL_FLAT);
/*
启用了之后,OpenGL在绘制的时候就会检查,当前像素前面是否有别的像素,
如果别的像素挡道了它,那它就不会绘制,也就是说,OpenGL就只绘制最前面的一层。
*/
glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING); // 启用光照
GLfloat light_position[] = { 1.0 1.0 1.0 0.0 };//光源位置
GLfloat light_ambient[] = { 0.0 1.0 0.0 1.0 };//rgb下的环境光颜色
GLfloat light_diffuse[] = { 1.0 1.0 0.0 1.0 };//漫反射光的颜色
GLfloat light_specular[] = { 1.0 1.0 1.0 1.0 };//镜面光的颜色
glLightfv(GL_LIGHT0 GL_POSITION light_position);
glLightfv(GL_LIGHT0 GL_AMBIENT light_ambient);
glLightfv(GL_LIGHT0 GL_DIFFUSE light_diffuse);
glLightfv(GL_LIGHT0 GL_SPECULAR light_specular);
glEnable(GL_LIGHT0); // 启用指定光源
 //显示列表初始化
showFaceList = glGenLists(1);
showWireList = glGenLists(1);
int temp = mesh.n_edges();

/*
向边显示列表中添加元素,其后的OpenGL函数存入显示列表中,
直至调用结束表的函数glEndList(),用来绘制 wire
*/
glNewList(showWireList GL_COMPILE);
glDisable(GL_LIGHTING);//不启用光照
glLineWidth(1.0f);//控制线的宽度
glColor3f(0.5f 0.5f 0.5f);//控制线的颜色
glBegin(GL_LINES);//创建“线”类型元素,与glEnd()连用
for (MyMesh::HalfedgeIter he_it = mesh.halfedges_begin(); he_it != mesh.halfedges_end(); ++he_it) {
//glVertex函数用在glBegin和glEnd之间,用于指定顶点,链接这个有向边的起点和终点

glColor3f(0.0 1.0 0.0);//指定点的颜色
glVertex3fv(mesh.point(mesh.from_vertex_handle(*he_it)).data());
glColor3f(0.0 1.0 0.0);
glVertex3fv(mesh.point(mesh.to_vertex_handle(*he_it)).data());
}
glEnd();
glEnable(GL_LIGHTING);
glEndList();

// 绘制flat
glNewList(showFaceList GL_COMPILE);
for (MyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); ++f_it) {
glBegin(GL_TRIANGLES);//绘制三角形
for (MyMesh::FaceVertexIter fv_it = mesh.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {
//用来设置当前的法向量,这个法向量将被应用到紧接下来的glVertex*() 所定义的顶点上

glNormal3fv(mesh.normal(*fv_it).data());
glVertex3fv(mesh.point(*fv_it).data());
}
glEnd();
}
glEndList();
}

// 当窗体改变大小的时候
void myRes

评论

共有 条评论