C++ 将off格式文件转换成ply格式存储

news2024/9/20 18:34:07

文章目录

  • 引言
  • off格式文件
  • ply格式文件
  • C++标准库实现off转ply

引言

三维模型是计算机图形学中的一个重要概念,它是由一系列三维坐标点构成的点云或多边形网格。
OFF格式是一种用于描述三维模型的文件格式,它可以描述点云和多边形网格等不同类型的三维模型。
PLY是一种三维mesh模型数据格式,全名为多边形档案(Polygon File Format)或斯坦福档案。是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内非常多著名的模型数据,比方Stanford的三维扫描数据库,Geogia Tech的大型几何模型库等,最初的模型都是基于这个格式的。

off格式文件

OFF(Object File Format)格式是一种简单的三维模型描述文件格式,它由三部分组成:文件头、点坐标和面索引
文件头:包含模型的基本信息,如点数、面数等。
点坐标:包含模型的点坐标信息,每行包含了一个点的三维坐标信息。
面索引:包含模型的面信息,每行包含了一个面的顶点索引信息。

ply格式文件

ply主要用以存储立体扫描结果的三维数值,通过多边形片面的集合描述三维物体。它可以存储的信息包含:颜色、透明度、表面法向量、材质坐标与信息的可信度,并能对多边形的正反两面设定不同的属性。
在数据内容存储上PLY有两种版本:纯文字(ASCII)版本与二进制(binary)版本

C++标准库实现off转ply

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

//定义结构体Vertex,表示顶点的x、y、z坐标
struct Vertex {
    float x, y, z;
};
//定义结构体Face,表示面的三个顶点索引
struct Face {
    int v1, v2, v3;
};

void offToPly(const std::string& inputFileName, const std::string& outputFileName) {
    std::ifstream inputFile(inputFileName);
    if (!inputFile.is_open()) {
        std::cerr << "Error: Unable to open input file " << inputFileName << std::endl;
        return;
    }

    std::ofstream outputFile(outputFileName);
    if (!outputFile.is_open()) {
        std::cerr << "Error: Unable to create output file " << outputFileName << std::endl;
        return;
    }
    //从输入文件中,读取文件格式,顶点数量,面数量和边数量
    std::string format;
    int numVertices, numFaces, numEdges;
    inputFile >> format >> numVertices >> numFaces >> numEdges;

    if (format != "OFF") {
        std::cerr << "Error: Input file is not in OFF format" << std::endl;
        return;
    }

//创建存储顶点的向量
std::vector<Vertex> vertices(numVertices);
    for (int i = 0; i < numVertices; ++i) {
        inputFile >> vertices[i].x >> vertices[i].y >> vertices[i].z;
    }

//创建存储面的向量
std::vector<Face> faces(numFaces);
    for (int i = 0; i < numFaces; ++i) {
        int numVerticesInFace;
        inputFile >> numVerticesInFace;
        if (numVerticesInFace != 3) {
            std::cerr << "Error: Only triangular faces are supported" << std::endl;
            return;
        }
        inputFile >> faces[i].v1 >> faces[i].v2 >> faces[i].v3;
    }

    //打开输出文件后,写入PLY文件的头部信息,包括文件格式、顶点和面的数量
    outputFile << "ply" << std::endl;
    outputFile << "format ascii 1.0" << std::endl;
    outputFile << "element vertex " << numVertices << std::endl;
    outputFile << "property float x" << std::endl;
    outputFile << "property float y" << std::endl;
    outputFile << "property float z" << std::endl;
    outputFile << "element face " << numFaces << std::endl;
    outputFile << "property list uchar int vertex_indices" << std::endl;
    outputFile << "end_header" << std::endl;

    //将顶点向量中的坐标写入输出文件
    for (const Vertex& vertex : vertices) {
        outputFile << vertex.x << " " << vertex.y << " " << vertex.z << std::endl;
    }

    //将面向量中的坐标写入输出文件
    for (const Face& face : faces) {
        outputFile << "3 " << face.v1 << " " << face.v2 << " " << face.v3 << std::endl;
    }

    std::cout << "Conversion complete. Output saved to " << outputFileName << std::endl;
}

int main() {
    const std::string inputFileName = "E:\\.off";   
    const std::string outputFileName = "E:\\.ply"; 
    offToPly(inputFileName, outputFileName);
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音小程序开发教学系列(5)- 抖音小程序数据交互

第五章&#xff1a;抖音小程序数据交互 5.1 抖音小程序的网络请求5.1.1 抖音小程序的网络请求方式和API介绍5.1.2 抖音小程序的数据请求示例和错误处理方法 5.2 抖音小程序的数据缓存和本地存储5.2.1 抖音小程序的数据缓存机制和使用方法5.2.2 抖音小程序的本地存储和数据持久化…

【工作记录】MQTT介绍、安装部署及springboot集成@20230912

背景 近期公司可能会有物联网设备相关项目内容&#xff0c;提前对用到的mqtt协议做预研和初步使用。 最初接触到mqtt协议应该是早些年的即时通讯吧&#xff0c;现在已经是物联网设备最热门的协议了。 作为记录&#xff0c;也希望能帮助到需要的朋友。 MQTT介绍 《MQTT 协议规…

HAlcon例子

气泡思想 * This example shows the use of the operator dyn_threshold for * the segmentation of the raised dots of braille chharacters. * The operator dyn_threshold is especially usefull if the * background is inhomogeneously illuminated. In this example, *…

开源日报 0830 | 免费计算机科学自学路径:系统化教育与全球支持

ossu/computer-science Stars: 141.9k License: MIT 这个开源项目是一个自学计算机科学的免费路径。它提供了一套完整的在线教育材料&#xff0c;旨在为那些希望获得全面、扎实基础和良好习惯的人们提供支持。该课程按照本科计算机专业要求设计&#xff0c;并且选取了来自哈佛…

抖音小游戏运营攻略:运营能力、用户获取和用户留存

抖音小游戏运营攻略&#xff1a;运营能力、用户获取和用户留存 前言一&#xff0c;运营能力1.1 录屏分享1.2 分享设置 二&#xff0c;用户获取2.1 新游冷启计划2.2 游戏中心推广素材2.3 搜索关键词2.4 搜索结果图2.5 游戏特征2.6 剪映视频模板 三&#xff0c;用户留存3.1 游戏加…

Redis哨兵集群的介绍及搭建

Redis 是一款开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。然而&#xff0c;作为一个单点服务&#xff0c;Redis 在面临硬件故障或者网络问题时可能会导致服务不可用。为了解决这个问题&#xff0c;Redis 提供了哨兵模式&#xff0c;一个…

【玩玩Vue】使用elementui页面布局和控制页面的滚动

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、页面布局二、页面滚动1.禁用body的滑动2.禁用el-aside的滚动3.启动el-main的滚动 前言 一、页面布局 这里布局使用vueelementui&…

如何对安卓设备执行免Root设置?免Root后如何远程控制?

使用AirDroid个人版的远程控制功能时&#xff0c;对被控的安卓设备执行免Root设置是比较常用的一种方式&#xff08;安卓7.0及以上系统的设备可以选择通过辅助权限&#xff08;无障碍&#xff09;控制安卓设备&#xff09; 如何执行免Root设置&#xff1f; 前提条件 1&#…

每日一博 - Stack OveFlow Arch In Reality

文章目录 概述猜测 &#xff1f;Truth 概述 Stack Overflow 是一个与程序相关的 IT 技术问答网站&#xff0c;其技术架构主要采用微软的技术栈&#xff0c;包括 C#、ASP.NET、SQL Server 等。此外&#xff0c;Stack Overflow 还使用了一些开源框架&#xff0c;例如 HAProxy、R…

SpringBoot-logback不同业务模块输出不同的日志文件

工作中有些业务模块日志输出比较频繁&#xff0c;影响其他业务模块问题排查&#xff0c;可以使用logback实现根据不同的业务输出到不同的日志文件 1、在resource下创建文件logback-spring.xml 2、在logback.xml中添加如下配置 <?xml version"1.0" encoding"…

GIS入门:GIS到底是什么,GIS的概念、构成结构、功能和应用

地理信息系统&#xff08;Geographic Information System, 简称GIS&#xff09; GIS从广义上讲&#xff0c;是一门集地理学与地图学以及遥感和计算机科学等众多学科于一体的综合性前沿交叉学科&#xff1b; 从狭义上说&#xff0c;它是在计算机硬、软件系统支持下&#xff0c;对…

Java笔记041-反射/类加载、通过反射获取类的结构信息、通过反射创建对象、通过反射访问类中的成员

反射 类加载 基本说明 ClassLoad_ 反射机制是Java实现动态语言的关键&#xff0c;也就是通过反射实现类动态加载。 静态加载&#xff1a;编译时加载相关的类&#xff0c;如果没有则报错&#xff0c;依赖性太强动态加载&#xff1a;运行时加载需要的类&#xff0c;如果运行时…

C语言_指针进阶(下)

文章目录 前言一、函数指针数组二、指向函数指针数组的指针三. 回调函数四. qsort 函数五. 数组名的理解 sizeof5.1 数组名的理解&#xff08;二维数组)5.1.1 数组名的理解 strlen5.1.2 例题&#xff1a;例一.例二.例三.例四. 前言 一、函数指针数组 数组是一个存放相同类型数…

LVS负载均衡群集(NAT模式、IP隧道模式、DR模式)

目录 一、集群 1.1 含义即特点 1.2 群集的类型 1.3 LVS 的三种工作模式&#xff1a; 1.4 LVS 调度算法 1.5 负载均衡群集的结构 1.6 ipvsadm 工具 二、NAT模式 LVS-NAT模式配置步骤&#xff1a; 实例&#xff1a; 配置NFS服务器192.168.20.100 配置web1服务器192.168…

C++ istringstream类学习

istringstream类用于执行C风格的串流的输入操作&#xff1b; ostringstream类用于执行C风格的串流的输出操作&#xff1b; strstream类同时可以支持C风格的串流的输入输出操作&#xff1b; istringstream的构造函数原形如下&#xff1a; istringstream::istringstream(strin…

Tomcat Arbitrary Write-file Vulnerability through PUT Method (CVE-2017-12615)

漏洞描述 CVE-2017-12615 对应的漏洞为任意文件写入&#xff0c;由于配置不当&#xff08;非默认配置&#xff09;&#xff0c;导致可以使用 PUT 方法上传任意文件 。Tomcat设置了写权限&#xff08;readonlyfalse&#xff09;&#xff0c;导致可以使用PUT方法上传任意文件 影…

mysql 快速上传数据

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的&#xff0c;数据要整理成和表格一致&#xff0c;也就是说每条数据都是完整的一条&#xff0c;而不是一部分。 下面的示例我以***为分割符划分字段&#xff0c;以 \n来分割每条数据。 LO…

代码随想录笔记--贪心算法篇

1--贪心算法 主要思路&#xff1a; 通过局部最优推导全局最优&#xff1b; 2--分发饼干 主要思路&#xff1a; 基于贪心算法&#xff0c;每次都尽可能用大的饼干去喂胃口大的孩子&#xff0c;贪心地节省饼干&#xff1b; #include <iostream> #include <vector> #i…

5.后端·新建子模块与开发(自动模式)

文章目录 学习资料自动生成模式创建后端三层 学习资料 https://www.bilibili.com/video/BV13g411Y7GS?p11&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 自动生成模式创建后端三层 首先&#xff0c;运行起来若依的前后端整个项目&#xff0c;…

【Java 基础篇】Java 自然排序:使用 Comparable 接口详解

在 Java 编程中&#xff0c;我们经常需要对对象进行排序。为了实现排序&#xff0c;Java 提供了 java.lang.Comparable 接口&#xff0c;它允许我们定义对象之间的自然顺序。本篇博客将深入探讨如何使用 Comparable 接口来进行自然排序&#xff0c;包括接口的基本概念、使用示例…