操作
鼠标控制物体旋转移动,滚轮缩放
F1,F2,F3 可以更换显示文件 (file1:cow.obj file2:cactus.ply file3 : Armadillo.off)
F4 更换显示模式 (wire,flat,flatlines)
截图
使用命令行显示当前状态
准备
openmesh的下载配置
- 下载最新的安装包
- 安装openmesh
配置vs
- 工具-》选项-》项目和解决方案-》VC++目录 配置 包含文件和库文件,分别是openmesh\include和openmesh\lib两个路径(比如:加C:\Program Files (x86)\OpenMesh 2.3\include和C:\Program Files (x86)\OpenMesh 2.3\lib目录)
- 在所建工程上右键-》属性-》预处理器-》预处理器定义添加_USE_MATH_DEFINE,同时在连接器-》输入-》附加依赖性中添加OpenMeshCored.lib和OpenMeshToolsd.lib
- 在我的配置时,还出现了一个问题就是:报错 1>c:\program files (x86)\microsoft visual studio11.0\vc\include\xutility(2176): error C4996: ‘std::_Copy_impl’: Function callwith parameters that may be unsafe - this call relies on the caller to checkthat the passed values are correct. To disable this warning, use-D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘CheckedIterators’ 这个的解决也是在预处理器重添加 _SCL_SECURE_NO_WARNINGS
openmesh使用和3d文件的原理
添加头文件即可:
#include <OpenMesh/Core/IO/MeshIO.hh> // 读取文件
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh> // 操作文件
mesh中3个关键元素:Face 面,Edge 边,Vertex 顶点
我们在绘图中就是遍历mesh文件中的这三种数据绘制的
制作
第一步:读取文件
读取文件代码如下:
// 读取文件的函数
void readfile(string file) {
// 请求顶点法线 vertex normals
mesh.request_vertex_normals();
//如果不存在顶点法线,则报错
if (!mesh.has_vertex_normals())
{
cout << "错误:标准定点属性 “法线”不存在" << endl;
return;
}
// 如果有顶点发现则读取文件
OpenMesh::IO::Options opt;
if (!OpenMesh::IO::read_mesh(mesh, file, opt))
{
cout << "无法读取文件:" << file << endl;
return;
}
else cout << "成功读取文件:" << file << endl;
cout << endl; // 为了ui显示好看一些
//如果不存在顶点法线,则计算出
if (!opt.check(OpenMesh::IO::Options::VertexNormal))
{
// 通过面法线计算顶点法线
mesh.request_face_normals();
// mesh计算出顶点法线
mesh.update_normals();
// 释放面法线
mesh.release_face_normals();
}
}
这个文件读取看起来比较繁琐,但是对比网上其他实现读取的方法,我觉的这样写文件读取更加安全一些
第二步:显示
这里我使用了 显示列表 (Display list)进行显示, 关于显示列表是什么,怎么用,可以阅读以下的博客链接: link
其主要优势就是 可以优化程序的性能
//初始化顶点和面
void initGL()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(2.