Open3D Transformation 变形

简介: Open3D Transformation 变形

Transformation 变形

Open3D 的几何类型具有许多变换方法。在本教程中,我们将展示如何使用translate 、rotate 、scale 和 transform。

Translate

我们要查看的第一个转换方法是translatet 。平移方法采用单个 3D 矢量作为输入,并通过此矢量平移几何的所有点/顶点。vt=v+t。下面的代码显示了网格在 x方向 中转换一次,在 y 方向上转换一次。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_tx = copy.deepcopy(mesh).translate((1.3, 0, 0))
mesh_ty = copy.deepcopy(mesh).translate((0, 1.3, 0))
print(f'Center of mesh: {mesh.get_center()}')
print(f'Center of mesh tx: {mesh_tx.get_center()}')
print(f'Center of mesh ty: {mesh_ty.get_center()}')
o3d.visualization.draw_geometries([mesh, mesh_tx, mesh_ty])

get_center方法返回TriangleMesh顶点的平均值。这意味着对于在原点创建的坐标系[0,0,0],get_center将返回[0.05167549 0.05167549 0.05167549]

该方法采用缺省设置为True的第二个参数relative。如果设置为False ,几何的中心将直接平移到第一个参数中指定的位置。

Rotation 旋转

Open3D的几何类型也可以使用rotate方法旋转。它采用旋转矩阵R作为第一个参数。由于 3D 中的旋转可以通过多种方式进行参数化,因此 Open3D 提供了从不同的参数化转换为旋转矩阵的便利功能:

从欧拉角转换为 get_rotation_matrix_from_xyz(其中xyz也可以是yzx ,zxy 、xzy ,zyx 和yxz)

从轴角表示转换为get_rotation_matrix_from_axis_angle

从四元数转换为get_rotation_matrix_from_quaternion

在下面的代码中,我们使用欧拉角旋转网格。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_r = copy.deepcopy(mesh)
R = mesh.get_rotation_matrix_from_xyz((np.pi / 2, 0, np.pi / 4))
mesh_r.rotate(R, center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_r])

该函数rotate具有第二个参数center,默认情况下设置为True 。这表示对象在应用旋转之前首先居中,然后移回其先前的中心。如果将此参数设置为False,则将直接应用旋转,使得整个几何围绕坐标中心旋转。这意味着在旋转后可以更改网格中心。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_r = copy.deepcopy(mesh).translate((2, 0, 0))
mesh_r.rotate(mesh.get_rotation_matrix_from_xyz((np.pi / 2, 0, np.pi / 4)),
              center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_r])

Scale 缩放

Open3D 几何体类型的顶点和点也可以使用scale , 进行缩放。vs=s⋅v

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_s = copy.deepcopy(mesh).translate((2, 0, 0))
mesh_s.scale(0.5, center=mesh_s.get_center())
o3d.visualization.draw_geometries([mesh, mesh_s])

scale方法还具有默认设置为True的第二个参数。center。如果将其设置为False ,则对象在缩放之前不会居中,因此对象的中心可以由于缩放操作而移动.

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_s = copy.deepcopy(mesh).translate((2, 1, 0))
mesh_s.scale(0.5, center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_s])

General transformation 一般变换

Open3D 还支持使用transform方法由4×4齐次变换矩阵定义的一般变换。

为什么是4x4的矩阵(而不是3x3)?可以参考https://xiaozhuanlan.com/topic/9285364071,仿射变换等解释。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
T = np.eye(4)
T[:3, :3] = mesh.get_rotation_matrix_from_xyz((0, np.pi / 3, np.pi / 2))
T[0, 3] = 1
T[1, 3] = 1.3
print(T)
mesh_t = copy.deepcopy(mesh).transform(T)
o3d.visualization.draw_geometries([mesh, mesh_t])
相关文章
|
前端开发 rax Python
Open3d系列 | 2. Open3d实现点云数据增强
Open3d系列 | 2. Open3d实现点云数据增强
4060 1
Open3d系列 | 2. Open3d实现点云数据增强
|
Android开发
Android5.0 Recovery源代码分析与定制(一)
Android5.0 Recovery源代码分析与定制(一)
409 0
|
缓存 API 数据库
Py之lmdb:lmdb的简介、安装、使用方法之详细攻略
Py之lmdb:lmdb的简介、安装、使用方法之详细攻略
Py之lmdb:lmdb的简介、安装、使用方法之详细攻略
|
存储 前端开发 数据可视化
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
**LeGO-LOAM**的全称是 Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 其中LeGO就是轻量级和利用地面优化,轻量级的实现就是通过两步的优化方式,利用地面优化的部分也在两步优化的第一步中。 和原始LOAM一样,通过前后两帧点云来估计两帧之间的运动,从而累加得到前端里程计的输出,和上述方法使用线面约束同时优化六自由度帧间位姿不同,LeGO-LOAM的前端分成两个步骤,每个步骤估计三自由度的变量。 通过这种方式进行帧间里程计的运算,可以提供运算效率,使得可以在嵌入式平台
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
|
8月前
|
自然语言处理 语音技术
Interspeech 2025「语音无障碍项目」挑战赛落幕
在针对言语障碍患者的语音识别比赛中,多支参赛队的ASR模型在性能上超过基线模型whisper-large-v2
323 0
|
JavaScript 算法 Linux
硬件工程师物料清单BOM对比工具
硬件工程师物料清单BOM对比工具
739 1
硬件工程师物料清单BOM对比工具
|
机器学习/深度学习 算法 数据可视化
Open3D Mesh 网格
Open3D Mesh 网格
841 2
|
API
No module named 'plotly.graph_objects'问题解决
No module named 'plotly.graph_objects'问题解决
739 0
No module named 'plotly.graph_objects'问题解决
|
安全 Linux 网络安全
自学黑客(网络安全)
【7月更文挑战第18天】
637 5