Point-E 是 OpenAI 推出的文本生成三维点云模型,它输出的点云通常只包含三维坐标,没有颜色信息。直接显示这种灰白点云时,人眼很难快速分辨物体的前后遮挡与曲面朝向。基于法线方向与视角方向的伪彩色映射,就是把每个点的局部法线向量和当前相机观察方向做点积,用夹角大小映射成不同颜色,让点云的几何特征以色彩形式呈现出来。

法线方向估计与朝向统一
要进行法线视角映射,第一步是估算每个点的法线。点云法线一般通过邻域协方差矩阵的特征向量获得,取最小特征值对应的特征向量作为该点的法线方向。在 Python 中可以使用 Open3D 的 estimate_normals 方法,它会基于每个点的最近邻搜索构建局部平面并求解法线。
需要注意的是,特征向量求解出来的法线方向可能是任意翻转的,有的点朝内、有的点朝外。如果直接用于着色,会出现同一平面上颜色突变的问题。因此通常需要调用 orient_normals_consistent_tangent_plane 或者根据视角方向统一翻转法线,使大部分法线朝向相机一侧。这一步对伪彩色映射非常关键,否则视角点积结果会失去物理意义。
下面是一段使用 Open3D 估计并统一法线的示例代码,假设已经加载了 Point-E 输出的点云对象 pcd:
import open3d as o3d
# pcd 为 Point-E 生成的点云
pcd.estimate_normals(
search_param=o3d.geometry.KDTreeSearchParamHybrid(
radius=0.1, max_nn=30))
# 根据相机位置统一法线朝向
camera_pos = [0.0, 0.0, 3.0]
pcd.orient_normals_towards_camera_location(camera_pos)
normals = np.asarray(pcd.normals)
print(normals.shape)
视角方向向量与夹角计算
视角方向是指从相机位置指向当前点云中心或者具体某一点的方向。在伪彩色映射中,我们通常使用从相机到点的单位向量作为视角向量 V,法线向量为 N。两者都是单位向量,它们的点积 dot = N · V 等于夹角的余弦值,范围在负一到正一之间。
当点乘法线接近 1 时,说明该点正对相机,法线与视线同向;接近 0 时说明点在边缘或侧面;接近负 1 时说明该点背对相机。为了把这种关系变成颜色,我们常将余弦值从负一正一重映射到零到一,再乘以 360 度映射到 HSV 色环的色相,或者用蓝到红渐变表示。
以下代码演示如何批量计算视角向量并与法线求点积:
import numpy as np points = np.asarray(pcd.points) normals = np.asarray(pcd.normals) camera_pos = np.array([0.0, 0.0, 3.0]) # 计算视角方向并归一化 view_dirs = camera_pos - points view_dirs = view_dirs / np.linalg.norm(view_dirs, axis=1, keepdims=True) # 法线已为单位向量,直接点积 cos_angle = np.sum(normals * view_dirs, axis=1) # 重映射到 0~1 mapped = (cos_angle + 1.0) / 2.0 print(mapped.min(), mapped.max())
伪彩色映射与可视化实现
得到重映射后的数值后,就可以为每个点分配 RGB 颜色。一种简单方案是用 matplotlib 的 colormap,例如 viridis 或 jet,把零到一的值转成颜色数组,再写回点云的 colors 属性。这样在任意支持彩色的查看器中,点云都会随相机角度变化而呈现不同伪彩,帮助识别结构。
这种映射方式相比固定光照模型更轻量,不需要真实光源计算,也避免了 Point-E 原始点云因无颜色导致的扁平感。在 WebGL 前端中,也可以把法线和视角方向传入着色器,在 GPU 中实时计算伪彩,交互旋转时颜色会自然流动,体验更好。
下面的代码将映射值转为颜色并保存带色点云:
import matplotlib.cm as cm
# mapped 为上一步得到的 0~1 数组
colors = cm.jet(mapped)[:, :3]
pcd.colors = o3d.utility.Vector3dVector(colors)
o3d.io.write_point_cloud("point_e_colored.pcd", pcd)
o3d.visualization.draw_geometries([pcd])
在实际应用中,如果 Point-E 点云比较稀疏,法线估计会受噪声影响,可以适当增大邻域半径或先做下采样平滑。伪彩色映射虽不能替代真实纹理,但作为快速预览和理解三维形状的手段,性价比很高。