You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Open3D中为点云赋予已知法向量并实现泊松重建

问题解决方法

错误原因

  1. 变量名不匹配:你定义的法向量变量是normals,但赋值时写成了normal,导致变量未定义。
  2. 法向量维度不匹配:点云有4个点,每个点必须对应一个3维法向量,而你提供的是单个3维向量,无法与点云的点数量对应,引发RuntimeError。

修正后的代码

import numpy as np
import open3d as o3d

# 点云数据
xyz = np.array([[36.1162223 , 22.13427368,  0.37597846],
                [36.1162223 , 22.13427368,  0.        ],
                [40.67849004, 22.13427368,  0.        ],
                [40.67849004, 22.13427368,  0.37597846]])

# 单个法向量扩展为与点数量匹配的数组
normals = np.array([0., -1., 0.])
# 重复4次,得到(4,3)的法向量数组
point_normals = np.tile(normals, (xyz.shape[0], 1))

# 构建点云并赋值法向量
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(xyz)
pcd.normals = o3d.utility.Vector3dVector(point_normals)
print(pcd)

# 泊松重建
with o3d.utility.VerbosityContextManager(
        o3d.utility.VerbosityLevel.Debug) as cm:
    mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        pcd, depth=9)
print(mesh)

额外说明

泊松重建通常需要足够多的点云数据来生成连续曲面,你当前只有4个平面点,重建结果可能不符合预期。如果是要可视化这4个点构成的平面,直接用凸包网格生成会更合适:

# 生成凸包网格替代泊松重建
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_convex_hull(pcd)
mesh.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh])

内容的提问来源于stack exchange,提问作者Nima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:50:15