【OpenMesh】文件读取和写入

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

原文出处:http://openmesh.org/Documentation/OpenMesh-Doc-Latest/mesh_io.html

这一节讲的是从文件中读取网格数据和写入网格数据到文件的方法。

响应的函数定义在名字空间OpenMesh::MeshIO中。这一节分成三部分。第一步给出例子讲述如何使用IOManager,第二步讲述IOManager的背景信息,第三步展示如何添加模块到IOManager。

第一步IOManager快速开始

复制以下代码到工程中。
注意:
  • 如果你静态链接OpenMesh,你必须添加OM_STATIC_BUILD到你的应用程序中。这保证读取器和写入器正确初始化。
  • IOManager使用文件名扩展名来决定哪一个写入器或者读取器被使用。比如,如果传送的文件是"inoutmesh.obj",OBJ-File 写入器和读取器会被使用来进行文件操作。
#include <OpenMesh/Core/IO/MeshIO.hh>
MyMesh mesh;
if (!OpenMesh::IO::read_mesh(mesh, "some input file")) 
{
std::cerr << "read error\n";
exit(1);
}
// do something with your mesh ...
if (!OpenMesh::IO::write_mesh(mesh, "some output file")) 
{
std::cerr << "write error\n";
exit(1);
}

第二步IOManager的理论

通常网格数据的读取器和写入器流程通常是直接写入数据结构和相对应的支持文件格式。这种方法有一个显著的缺点,就是目标是不同的数据结构或者添加的是另一种文件格式的时候会导致代码冗余。

IOManager扮演者接口的角色,通过读取器和写入器以及输入输出模块连接一边是持久性数据而另一边是任意数据结构。


任意格式的持久性数据首先被读取模块转化。数据之后通过特定的接口被传送到目标数据结构。写入数据的过程也是相似的。IOManager控制整个过程。读取器和写入器模块对用户是不可见的。然而输入输出模块必须被显示的指定,因为这些模块是针对特定的数据结构的。

数据结构和持久性数据的完全分离使得代码维护和功能扩展非常容易,第三步将会体现。

第三步如何扩展IOManager

添加支持新文件

添加支持新文件涉及到添加读取器和写入器模块。读取器模块继承于OpenMesh::IO::BaseReader。接口模块通常这样定义。
class BaseReader
{
public:
virtual std::string get_description() const = 0;
virtual std::string get_extensions() const = 0;
virtual std::string get_magic() const { return std::string(""); }
virtual bool read(std::istream& _is, BaseImporter& _bi) const = 0;
virtual bool read(const std::string& _filename, BaseImporter& _bi) const = 0;
...
};
基于文件扩展名和文件头信息,IOManager决定哪一个读取器模块被使用。读取器模块解析格式和信息会被传送到目标数据结构,通过继承类OpenMesh::IO::BaseImporter。
写入器模块继承自 OpenMesh::IO::BaseWriter以及和读取器一样的工作方法。

添加新的数据结构

输入器从读取器接收数据。读取器模块通过特定的接口传送信息:
class BaseImporter
{
public:
virtual void add_vertex (const OpenMesh::Vec3f&) {};
virtual void add_normal (const OpenMesh::Vec3f&) {};
virtual void add_texture (const OpenMesh::Vec2f&) {};
virtual void add_face (const FaceType&) {};
};
输入器负责填充目标数据结构。从数据结构输出信息更像是输入数据。写入器模块必须能够迭代全部的向量/坐标/面。因此一个输出器必须提供迭代器:
class BaseExporter
{
public:
virtual void update() = 0;

virtual PVertexIter const_vertices_begin() = 0;
virtual PVertexIter const_vertices_end() = 0;

virtual PTexCoordIter const_texcoords_begin() = 0;
virtual PTexCoordIter const_texcoords_end() = 0;
virtual PIdxFaceIter const_idx_faces_begin() = 0;
virtual PIdxFaceIter const_idx_faces_end() = 0;
virtual PFaceIter const_set_faces_begin() = 0;
virtual PFaceIter const_set_faces_end() = 0;
virtual unsigned int n_faces() = 0;
virtual unsigned int n_vertices() = 0;
virtual unsigned int n_texcoords() = 0;
};
这可能需要输出器缓存引用的数据。update()函数应该在每一个BaseWriter::save()之前被调用来确保缓存数据被更新。
更多信息参考OpenMesh的IO子目录。
opengl | openmesh 读取显示3d模型文件 操作鼠标控制物体旋转移动,滚轮缩放F1,F2,F3 可以更换显示文件 (file1:cow.obj file2:cactus.ply file3 : Armadillo.off)F4 更换显示模式 (wire,flat,flatlines)截图 使用命令行显示当前状态 准备openmesh的下载配置 下载最新的安装包 安装openmesh 配置vs工具-》选项-》项目解决方案-》VC++目录 阅读详情

相关推荐

Obj文件与Off文件的转换(openmesh

在网上找的代码,接受off文件格式,但不接受obj文件格式。而我的数据是obj格式的,这时就需要做转换。 obj文件格式与off文件格式基本一致。如果你有openmesh库,这一需求很容易被满足,因为openmesh支持obj,off及ply多种格式。vs配好openmesh后, //OPENMESH #include #include #ifdef _DEBUG #pra

DannieGo的博客 5102

opengl+openmesh+obj

利用openmesh读取obj模型文件,利用opengl绘制模型文件,该模型文件为斯坦福大学的兔子模型文件。该代码可以直接在vs2015上运行,并且已经配置好了所需要的opengl\openmesh等所有的库。

opengl+openmesh重绘rabbit

参考网址:https://blog.csdn.net/chaojiwudixiaofeixia/article/details/50498629                   https://blog.csdn.net/qq_28057541/article/details/51362945 本次实验的对象是斯坦福大学著名的bunny模型(兔子模型)。本文主要介绍了如何如下两点: 使用...

LYKymy的博客 1507

OpenMesh快速入门使用文档

这是一个OpenMesh使用入门的快速文档,介绍了基本的操作,帮助我们很快的进入大OpenMesh的学习使用。对于三角网格化有很大的帮助。

C++ OpenMesh拉普拉斯光顺平滑网格模型

这篇博客针对C++ OpenMesh拉普拉斯光顺平滑网格模型编写代码,代码整洁,规则,易读。 学习与应用推荐首选。

alicema1111的博客 2271

OpenMesh】操作网格

介绍 在这篇指南中你会学到如何使用OpenMesh类库操纵网格。在之前的一章中(参考Mesh Iterators and Circulators),你已经学了如何迭代顶点,边,halfedge面,以及循环遍历某些结构比如1-ring。所以这篇指南中我们将会关注如何高效的使用halfedge数据结构其中有用的特性比如说边界标志(boundary flag)。我们假定你已经熟悉OpenMesh

3289

OpenMesh入门,安装,运行示例Hello World

环境 win10,qt5源码下载编译进入OpenMesh官网OpenMesh官网 https://www.graphics.rwth-aachen.de/software/openmesh/download/使用cmake gui注意:先安装qt5使用 CMake-Gui 构建 vs 2019 项目第一次configure 会报错,需要你填写QT5_DIR,如上图然后再次点击configure接着点击 generate然后用vs2019打开项目,生成。

fuyouzhiyi的博客 1631

OpenMesh】Windows下OpenMesh的安装使用

​ 了解OpenMesh,学会安装,尝试在c++里面使用OpenMesh,书写一个简单地例子。进入OpenMesh官网OpenMesh官网,下载下面的文件OpenMesh-9.0 需要 CMake 解编 提前配置 QT5_DIR 然后配置 VS 环境平台 ,推荐 点击 “Configure” 如果配置通过,再点击 “Generate”安装OpenMesh程序: 安装OpenMesh-9.0-VS2019-64-Bit–apps.exe程序 无脑直接往下:创建一个新的(空的 项目工程)解决方案

qq_43331089的博客 6781

OpenMesh学习笔记7 网格文件读写

网格文件读写  本文主要介绍用OpenMesh对网格文件进行读写的操作。   相应的函数定义在名称空间OpenMesh::MeshIO中。IOManager快速入门  文件读写的代码框架如下:#include <OpenMesh/Core/IO/MeshIO.hh> MyMesh mesh; if (!OpenMesh::IO::read_mesh(mesh, "some input file")

ydf 7706

OpenMesh-文件读取

这里写目录标题openmesh文件操作读文件文件修改文件1-read_data()读文件修改文件2- mesh_scaling()写文件 openmesh文件操作 //读文件 OpenMesh::IO::read_mesh(mesh, filename); //写文件 OpenMesh::IO::write_mesh(mesh, filename); 读文件 Mesh src_mesh; Mesh tar_mesh; std::string src_file; std::string tar_

朽木不通的博客 1325

OpenMesh 读写网格控制(读取写入纹理坐标,法向等)

OpenMesh读取网格默认是不自动读取obj网格中的法向,纹理坐标等信息的,写入网格同样也是。所以要读取(或写入)这些信息需要修改默认的选项。 先看一下其读写网格的函数 1   template<class Mesh> 2   bool OpenMesh::IO::read_mesh( 3   Mesh &_mesh, 4   const std...

weixin_34032779的博客 525

OpenMesh

OpenMesh.

Hunger's Blog 1242

OpenMesh】使用迭代器循环机

原文出处: http://openmesh.org/Documentation/OpenMesh-Doc-Latest/tutorial.html 这个例子展现: 如何使用迭代器 如何使用循环机 这个例子是第一个版本的平滑器。我们将会介绍迭代器(iterators)循环机(circulators)。 这两个概念提供线性枚举的功能,比如网格中所有的顶点,围绕一...

weixin_34235135的博客 185

OpenMesh入门文档中文版

OpenMesh中文教程,由官方文档理解翻译,内有5个基础的代码示例,包括OpenMesh+OpenGL,网格光滑处理等。 重点介绍了OpenMesh中的动态属性Traits类的定义使用。

使用opengl openmesh 读取obj文件,显示3d模型,并可以进行旋转、平移、缩放

本博客是使用opengl openmesh 读取obj文件,显示3d模型,并可以进行旋转、平移、缩放,并加入了环境光 一、操作 鼠标控制物体旋转移动,滚轮缩放,上下左右键可以控制模型的移动 F1,F2,F3,F4,F5,F6,F7,F8可以更换显示文件 Insert键 更换显示模式 (wire,flat,flatlines) 二、实验演示 按F1 读入 一个 cow的 ...

ding_programmer的博客 1万+

OpenMesh 网格数据读取写入

OpenMesh 网格数据读取写入

dayuhaitang1的博客 543

OpenMesh学习笔记5 OpenMesh+OpenGL的一个例子

OpenMesh学习使用过程中的系列笔记5,OpenMesh+OpenGL显示的一个例子

ydf 1万+
上一篇: 【OpenMesh】操作网格
下一篇: 【OpenMesh】一些基本操作:翻转和折叠
织田信长
博客等级 码龄17年 24粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值