[HMI] Open3D UV 贴图介绍

一、简介

1.1 概述

介绍基于 Python Open3D 库方法实现三维模型的 UV 贴图纹理。
 

1.2 Open3D

三维数据具有丰富的几何与结构信息,为了高效处理三维数据引入点云处理库 Open3D,Open3D 是一个开源的 3D 库,底层基于 C++ 并提供 Pyton 语言接口,依托于 Python 语言的易上手特性,加快了处理 3D 数据的开发,Open3D 已经应用于许多已发表的项目中。
 

1.3 MESH

一个三维物体通过网格细分算法可以拆解成网格体(mesh),网格体由多个彼此相连三角面组成(Triangle mesh)或是四边形网格(Poly mesh)组成。
而三角面与四边形网格则是由顶点和线组成,顶点决定了这个面的基本形状。

1.4 模型数据

通用的模型格式有 OBJ、FBX、3DS、PLY、GLTF、STL等等,三维模型保存后的文件格式是保存三模模型的坐标、mesh、材质、UV 坐标等等数据的集合。

打开一个 OBJ 格式的三维物体数据:

除了名字、文本信息外的主要三维数据
  • V - Point 顶点几何信息
  • Vt - triangle_uvs 纹理坐标
  • F - face 面(三角形的三个顶点)
  • Vn - 顶点法向量
 

二、UV map

2.1 UV 概述

UV 坐标是指所有的图象文件都是二维的一个平面,水平方向是U,垂直方向是V,通过这个平面的,二维的UV坐标系,可以定位图象上的任意一个象素,所以三维模型数据除了存储物体的物理空间信息,还需要包含贴图的二位空间坐标来对应模型与贴图。
 

2.2 UV 坐标轴

U、V 表示 2D 纹理的轴,因为 X、Y、Z 已用于表示模型空间中 3D 对象的轴,UV 坐标轴的范围在 (0,1)


2.3 UV 贴图

UV 纹理允许使用来自普通图像的颜色(和其他表面属性)绘制构成 3D 对象的多边形,该图像称为 UV 纹理贴图。
 

2.4 UV 映射

UV 映射是将 2D 图像投影到 3D 模型表面以进行纹理映射的 3D 建模过程。
 

2.5 展 UV

UV 展开主要目的,即将 3D 网格体转换为 2D 平面表示,获得 3D 网格体每个面在 2D 平面上面的坐标信息,从而可以在 2D 平面上绘制纹理,当 2D 平面 UV 映射至 3D 网格体获得 ”皮肤“。

展 UV 的好坏影响 UV 贴图的绘制难易,根据贴图的需求和使用场景采用不同的展 UV 的算法与方法。

 

三、Open3D UV Map

Open3D 简单添加一个几何体(这是一个轮胎圆柱体的模型)
import open3d as o3d

def draw_geometry(pcd):
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(pcd)
vis.run()
vis.destroy_window()

if __name__ == "__main__":
# 读取模型数据
pcd_mesh = o3d.io.read_triangle_mesh(r"D:\UV\tyre.obj")

draw_geometry(pcd_mesh)​

四、参考资料

【Open3D 0.18.0 documentation】
【Unity 渲染之展UV】
【Wikipedia UV_mapping】

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论