如果我们想使用少量的约束使得三角网格变形,得使用相应的网格变形算法。Open3d实现了[SorkineAndAlexa2007] 中的尽可能严格的算法,以优化下面的能量函数: 这里的Ri表示 我们要优化的旋转矩阵,pi和pj分别表示优化前后的顶点位置。N(i)表示顶点i的邻域集合。权重wij表示余切权重(cot weights)。 Open3d实现的算法的接口是deform_as_rigid_as_possible。这个算法的第一个参数是一组constraint_ids,他是引用的三角网格的顶点。第二个参数constrint_pos定义了这些顶点优化后的位置。因为这个优化过程是一个迭代的过程,所以我们也能通过max_iter定义迭代次数。 mesh = o3dtut.get_armadillo_mesh()
vertices = np.asarray(mesh.vertices) static_ids = [idx for idx in np.where(vertices[:, 1] < -30)[0]] static_pos = [] for id in static_ids: static_pos.append(vertices[id]) handle_ids = [2490] handle_pos = [vertices[2490] + np.array((-40, -40, -40))] constraint_ids = o3d.utility.IntVector(static_ids + handle_ids) constraint_pos = o3d.utility.Vector3dVector(static_pos + handle_pos)
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm: mesh_prime = mesh.deform_as_rigid_as_possible( constraint_ids, constraint_pos, max_iter=50) print('Original Mesh') R = mesh.get_rotation_matrix_from_xyz((0,np.pi,0)) o3d.visualization.draw_geometries([mesh.rotate(R, center=mesh.get_center())]) print('Deformed Mesh') mesh_prime.compute_vertex_normals() o3d.visualization.draw_geometries([mesh_prime.rotate(R, center=mesh_prime.get_center())]) Original Mesh Deformed Mesh Open3d实现了ARAP目标的平滑版本,定义为: 这惩罚相邻旋转矩阵的偏差,α 是正则项的权衡参数,A是表面积。 资源 三维点云论文及相关应用分享 【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法 3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020) PCL中outofcore模块---基于核外八叉树的大规模点云的显示 更多文章可查看:点云学习历史文章大汇总 SLAM及AR相关分享 |
|