Skip to content

UV 映射

[参考:Wikipedia] UV 映射(UV mapping)是三维建模中将二维图像投影到三维模型表面以进行纹理贴图的过程。字母 “U” 和 “V” 表示二维纹理的坐标轴,因为 “X”、“Y” 和 “Z” 已经用于表示模型空间中三维物体的坐标轴。

UV 纹理贴图使得构成三维物体的多边形可以用普通图像中的颜色(以及其他表面属性)来绘制。该图像被称为 UV 纹理贴图(UV texture map)。

UV 映射坐标 (U, V) 以 std::vector<Eigen::Vector2d> 的形式存储,长度为 3 × 三角形数量。也就是说,每个三角形都有一组 3 个 (U, V) 坐标,分别对应其三个顶点。

可以认为 UV 映射将一个高度和宽度均为 1.0 的纹理图像映射到几何体上。因此,U 和 V 的取值范围是 0.0 到 1.0(包含两端)。

Open3D 提供的基本几何体默认 UV 映射速查

Section titled “Open3D 提供的基本几何体默认 UV 映射速查”

以下示例均假设有如下代码前置:

import open3d as o3d
import open3d.visualization.rendering as rendering
material = rendering.MaterialRecord()
material.shader = 'defaultUnlit'
material.albedo_img = o3d.io.read_image('/Users/renes/Downloads/uv1.png')

uv1.png

Box(将 UV 映射到每个面,false)

Section titled “Box(将 UV 映射到每个面,false)”
box = o3d.geometry.TriangleMesh.create_box(create_uv_map=True)
o3d.visualization.draw({'name': 'box', 'geometry': box, 'material': material})

uv2.png uv3.png uv4.png

box = o3d.geometry.TriangleMesh.create_box(create_uv_map=True, map_texture_to_each_face=True)
o3d.visualization.draw({'name': 'box', 'geometry': box, 'material': material})

uv5.png uv6.png uv7.png

tetra = o3d.geometry.TriangleMesh.create_tetrahedron(create_uv_map=True)
o3d.visualization.draw({'name': 'tetrahedron', 'geometry': tetra, 'material': material})

uv8.png uv9.png uv10.png

octo = o3d.geometry.TriangleMesh.create_octahedron(create_uv_map=True)
o3d.visualization.draw({'name': 'octahedron', 'geometry': octo, 'material': material})

uv11.png uv12.png uv13.png

ico = o3d.geometry.TriangleMesh.create_icosahedron(create_uv_map=True)
o3d.visualization.draw({'name': 'icosahedron', 'geometry': ico, 'material': material})

uv14.png uv15.png uv16.png

cylinder = o3d.geometry.TriangleMesh.create_cylinder(create_uv_map=True)
o3d.visualization.draw({'name': 'cylinder', 'geometry': cylinder, 'material': material})

uv17.png uv18.png uv19.png

cone = o3d.geometry.TriangleMesh.create_cone(create_uv_map=True)
o3d.visualization.draw({'name': 'cone', 'geometry': cone, 'material': material})

uv20.png uv21.png uv22.png

sphere = o3d.geometry.TriangleMesh.create_sphere(create_uv_map=True)
o3d.visualization.draw({'name': 'sphere', 'geometry': sphere, 'material': material})

uv23.png uv24.png uv25.png