[C++][CGAL]点云转OBJ模型(可导入Unity)

这篇具有很好参考价值的文章主要介绍了[C++][CGAL]点云转OBJ模型(可导入Unity)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、环境

        IDE:VS2017   X64
        工具库:Boost 1.7.1 、CGAL5.5.2

         简介:通过读取"xyz"格式的点云文件,将点云转换成三维模型。

二、代码

#pragma once
#include <array>
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>

//CGAL SDK
#include <CGAL/Surface_mesh.h>
#include <CGAL/disable_warnings.h>
#include <CGAL/Projection_traits_xy_3.h>//xy投影面
#include <CGAL/Delaunay_triangulation_2.h>//Delaunay三角剖分
#include <CGAL/Advancing_front_surface_reconstruction.h>
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>// 内核
#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point_3;
typedef Kernel::Vector_3  Vector_3;
typedef std::array<std::size_t, 3> Facet;
typedef CGAL::Surface_mesh<Point_3> Mesh;
typedef boost::graph_traits<Mesh>::vertex_descriptor  vertex_descriptor;


struct Construct
{
	Mesh& mesh;
	template < typename PointIterator>
	Construct(Mesh& mesh, PointIterator b, PointIterator e)
		: mesh(mesh)
	{
		for (; b != e; ++b)
		{
			boost::graph_traits<Mesh>::vertex_descriptor v;
			v = add_vertex(mesh);
			mesh.point(v) = *b;
		}
	}
	Construct& operator=(const Facet f)
	{
		typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
		typedef boost::graph_traits<Mesh>::vertices_size_type size_type;
		mesh.add_face(vertex_descriptor(static_cast<size_type>(f[0])),
			vertex_descriptor(static_cast<size_type>(f[1])),
			vertex_descriptor(static_cast<size_type>(f[2])));
		return *this;
	}
	Construct&
		operator*() { return *this; }
	Construct&
		operator++() { return *this; }
	Construct
		operator++(int) { return *this; }
};


class PointCloud2Mesh
{
public:
	PointCloud2Mesh();
	~PointCloud2Mesh();
public:
	static void CreateMesh(std::string xyzfile, std::string objfile = "mesh.obj");
};

#include "PointCloud2Mesh.h"

PointCloud2Mesh::PointCloud2Mesh()
{
}

PointCloud2Mesh::~PointCloud2Mesh()
{

}

void PointCloud2Mesh::CreateMesh(std::string xyzfile, std::string objfile)
{
	//加载点云数据
	std::string filePath = CGAL::data_file_path(xyzfile);
	std::ifstream in(filePath);
	std::vector<Point_3> points;
	std::copy(std::istream_iterator<Point_3>(in), std::istream_iterator<Point_3>(), std::back_inserter(points));
	in.close();

	//转行Mesh
	Mesh dsm_mesh;
	Construct construct(dsm_mesh, points.begin(), points.end());
	CGAL::advancing_front_surface_reconstruction(points.begin(), points.end(), construct);

	auto vnormals = dsm_mesh.add_property_map<vertex_descriptor, Vector_3>("v:normals", CGAL::NULL_VECTOR).first;

	CGAL::Polygon_mesh_processing::compute_vertex_normals(dsm_mesh, vnormals);

	std::ofstream dsm_ofile(objfile, std::ios_base::binary);
	CGAL::IO::set_binary_mode(dsm_ofile);
	CGAL::IO::write_OBJ(dsm_ofile, dsm_mesh);

	for (vertex_descriptor vd : vertices(dsm_mesh))
	{
		dsm_ofile << "vn " << vnormals[vd].x() << " "
			<< vnormals[vd].y() << " "
			<< vnormals[vd].z() << "\n";
	}
	dsm_ofile.close();
}

三、使用

#include <iostream>
#include "PointCloud2Mesh.h"

using namespace std;


#define PI 3.1415926

#define XYZ "points_3/zongzi.xyz"

void Ball();
void zongzi();

int main(int argc, char** argv)
{
	//
	//Ball();
	zongzi();

	PointCloud2Mesh::CreateMesh(XYZ);
	return EXIT_SUCCESS;
}

void Ball()
{
	float Scale = 10.0f;
	//
	float u = PI * 2;
	float v = PI;

	std::ofstream fout(XYZ, ios::out | ios::app);

	for (int i = 0; i < u *Scale; i++)
	{
		for (int j = 0; j < v*Scale; j++)
		{
			float x = cos(i) * sin(j);
			float y = sin(i) * sin(j);
			float z = cos(j);
			fout << x<<" "<<y<<" "<<z<< std::endl;
		}
	}
	fout.close();
}


void zongzi()
{
	float Scale = 10.0f;
	//
	float u = PI * 2;
	float v = PI;

	std::ofstream fout(XYZ, ios::out | ios::app);

	for (int i = 0; i < u *Scale; i++)
	{
		for (int j = 0; j < v*Scale; j++)
		{
			float x = cos(i);
			float y = cos(j);
			float z = cos(i+j);
			fout << x << " " << y << " " << z << std::endl;
		}
	}
	fout.close();
}

//@2023.6.26
//info:针对破角修改
void zongzi_new()
{
	float Scale = 1.0f;
	//
	float u = PI * 2;
	float v = PI;

	std::ofstream fout(XYZ, ios::out | ios::app);

	for (float i = 0; i <= u *Scale; i += 0.01f)
	{
		for (float j = 0; j <= v*Scale; j += 0.01f)
		{
			float x = cos(i);
			float y = cos(j);
			float z = cos(i+j);
			fout << x << " " << y << " " << z << std::endl;
		}
	}
	fout.close();
}

效果图

点云数据怎么渲染出.obj模型,c++文章来源地址https://www.toymoban.com/news/detail-815252.html

到了这里,关于[C++][CGAL]点云转OBJ模型(可导入Unity)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity运行时程序动态加载外部.fbx.obj模型文件

    项目中有用到这个需求,为实现Unity程序运行状态下,从程序外部动态加载fbx或obj模型,所以研究了一下,目前TriLib比较靠谱,好用,多平台适用。会提供 下载插件地址。 unity运行时加载fbx 使用的插件 下载插件地址 将Trilib压缩包内容解压到Unity工程Assets文件夹下,返回工程等

    2024年02月16日
    浏览(48)
  • python读取点云文件(.stl文件、.obj文件)(以及转换为obj方法)

    代码如下 该代码可以直接将stl文件中对点直接都输出 改进版本 把输出的点转换为npy并且保存 .stl文件格式如下图所示: 那么读取该文件就需要知道stl的构成 stl是一种表示三角网格的文件格式 STL只能用来表示封闭的面或者体,stl文件有两种:一种是ASCII明码格式,另一种是二

    2024年02月08日
    浏览(38)
  • 超级好用的3D模型转点云数据方法

    第一步:Solidworks 构建三维模型(如果要表面点云,可以先对模型进行抽壳); 第二步:Solidworks 文件转STL 第三步:以网格文件打开STL模型(工具—插件中开启ScanTo3D) 第四步:另存为ScanTo3D(.obj) 第五步:5. Cmd 输入命令(先定位到pcl_mesh_samplingd.exe所在文件夹): pcl_mesh_samplin

    2024年02月11日
    浏览(43)
  • 从Unity导出Obj格式的地形(Terrian)

      保存程序,返回Unity。在Unity菜单栏会出现 会在 Assets 文件夹中生产  .obj  文件。 此时导出的文件未必满足我们的需求,可能需要删除一些部分。 我的方法比较笨,但可以实现 我用的是SketchUp(简称SU),但SU不能导入.obj文件,所以我们需要使用SU的一个插件:Skimp。插件安

    2024年02月08日
    浏览(35)
  • Unity场景素材导出为 OBJ文件的方法

    一、Unity场景素材导出为 FBX文件的方法:http://t.csdn.cn/Xyjxe 二、Unity场景素材导出为 OBJ文件的方法:http://t.csdn.cn/08RY3 三、Unity地形导出为 OBJ文件的方法 (大家可以打开我的博客主页进行查看此系列其它文章) 目录 系列文章目录 前言 一、Unity场景素材导出OBJ文件 安装插件

    2024年02月10日
    浏览(66)
  • qt加载obj格式的3D模型

    在 Qt 中加载 obj 格式的 3D 模型可以使用 Qt 3D 模块。 首先,你需要在你的工程文件中包含 Qt 3D 模块,方法是在工程文件的顶部添加以下行: 然后,在你的代码中包含 Qt 3D 的头文件: 接下来,你可以使用 Qt3DRender::QObjLoader 类来加载 obj 格式的 3D 模型。首先,创建一个 Qt3DRen

    2024年02月16日
    浏览(64)
  • 这款APP注册即可查看、编辑及分享三维模型、点云等数据

    很多行业用户想要在手机或平板上查看三维模型、正射影像、激光点云、数字高程模型等地理空间数据。现在就给大家介绍一款非常实用的地理空间数据管理软件——【四维轻云】。 【 四维轻云 】是一款轻量化的地理空间数据管理软件,支持地理空间数据的在线管理、编辑

    2024年01月24日
    浏览(62)
  • threejs加载.Fbx .OBJ 3D模型文件

    在threejs官网下载threejs的文件,可以选择直接下载,也可以跳转到GitHub拉取 拉取下来的完整文件就是这个样子 拉取成功后我们在本地安装启动服务,这样就能很快速的查看threejs的各种例子了 可以先看看官网里的例子,你想要的东西官方里面都有 后期在开发的时候需要用到b

    2023年04月08日
    浏览(44)
  • 基于QT使用OpenGL,加载obj模型,进行鼠标交互

    基于QT平台,使用OpenGL进行obj文件加载显示; 使用鼠标对场景进行缩放、移动、旋转交互;   OpenGL是基于C的,学习曲线比较抖,但是总的来说就是下面一幅图,   用语言简单的描述(个人理解,可能不太准确)是把 cpu里内存里的3D数据,传输到显卡的内存里,以及如何

    2024年02月04日
    浏览(51)
  • 3dmax模型完美转glb模型,gltf格式模型转fbx格式转obj格式

    现在好多模型都是3dmax模型,但是客户要求是glb或者gltf模型 这个时候好多人直接导出glb模型,是没有颜色贴图的,这样的 这个时候是不能用的,怎么办,咱们要回到3dmax,把VR材质一个个重新上普通材质 当然也可以用插件一键转换 没有插件可以联系QQ 424081801也可以制作glb模

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包