示例代码
覆盖所有支持数据类型的完整示例代码,可直接复制运行。
目录
点云可视化
彩色点云,支持逐点颜色、法向量和大小设置。
import pyviz3d as viz
import numpy as np
v = viz.Visualizer()
# 基本用法:位置 + 颜色
points = np.random.rand(5000, 3) * 5
colors = np.random.rand(5000, 3)
v.add_points("随机点云", points, colors)
# 带法向量的点云(影响光照着色)
normals = np.random.rand(5000, 3) * 2 - 1
v.add_points(
name="带法向量的点云",
positions=points,
colors=colors,
normals=normals
)
# 固定大小点(用于远处小目标)
v.add_points(
name="小点云",
positions=points[:100],
colors=colors[:100],
normal_scale=1.0, # 控制点大小
point_size=3 # 固定像素大小
)
v.save("point_cloud_demo")
多边形网格
加载 .obj 或 .ply 格式的 3D 网格模型。
import pyviz3d as viz
import numpy as np
# 方式一:手动提供顶点和面索引
vertices = np.array([
[0,0,0], [1,0,0], [0,1,0],
[0,0,1], [1,0,1], [0,1,1],
])
faces = np.array([[0,1,2], [3,4,5]])
v = viz.Visualizer()
v.add_mesh(
name="立方体",
vertices=vertices,
faces=faces,
colors=np.array([1,0,0]) # 红色
)
v.save("mesh_demo")
边界框
支持轴对齐边界框(AABB)和带旋转的 OBB。
v = viz.Visualizer()
# 轴对齐边界框
positions = np.array([
[0, 0, 0],
[2, 1, 0],
[-1, 2, 1],
])
sizes = np.array([
[1, 1, 1],
[0.5, 2, 0.5],
[2, 0.5, 3],
])
colors = np.array([
[1, 0, 0], # 红
[0, 1, 0], # 绿
[0, 0, 1], # 蓝
])
v.add_boxes(
name="检测框",
positions=positions,
sizes=sizes,
colors=colors,
alpha=0.2 # 透明度
)
# 带旋转的边界框
v.add_boxes(
name="旋转框",
positions=np.array([[3,0,0]]),
sizes=np.array([[2,1,1]]),
colors=np.array([[1,1,0]]), # 黄色
rotations=np.array([[0, 0, 45]]), # 绕 Z 轴旋转 45°
alpha=0.4
)
v.save("boxes_demo")
箭头
用于表示向量、方向和运动。
v = viz.Visualizer()
# 单个箭头:从位置沿向量延伸
v.add_arrows(
name="速度向量",
positions=np.array([[0, 0, 0]]),
vectors=np.array([[2, 1, 1]]), # 方向和长度
colors=np.array([[0, 1, 0]]) # 绿色
)
# 多个箭头(表示多个方向)
origin = np.array([[0,0,0], [0,0,0], [0,0,0]])
directions = np.array([
[1,0,0], # X 轴
[0,1,0], # Y 轴
[0,0,1], # Z 轴
])
colors = np.array([[1,0,0], [0,1,0], [0,0,1]])
v.add_arrows("坐标轴", origin, directions, colors)
v.save("arrows_demo")
标签
始终面向相机的 HTML 标签,适合标注物体和信息。
v = viz.Visualizer()
v.add_points("标注点", np.array([[0,0,0]]), np.array([[1,0,0]]))
# 添加文字标签
v.add_text(
name="文字标签",
text="这是起点",
positions=np.array([[0, 0.5, 0]]), # 标签位置
colors=np.array([[1, 1, 0]]) # 黄色
)
# 多个标签
labels = ["物体 A", "物体 B", "物体 C"]
positions = np.array([[0,0,0], [2,0,0], [0,2,0]])
colors = np.ones((3, 3))
v.add_text("物体标签", labels, positions, colors)
v.save("labels_demo")
多段线
连接线段,常用于轨迹可视化、路径规划、建筑平面图。
v = viz.Visualizer()
# 轨迹线(样条曲线)
t = np.linspace(0, 4*np.pi, 200)
trajectory = np.column_stack([
np.cos(t), np.sin(t), t/10
])
v.add_polygon(
name="螺旋轨迹",
vertices=trajectory,
colors=np.array([0, 1, 1]), # 青色
alpha=1.0
)
# 闭合多边形(地面轮廓)
square = np.array([
[0,0,0], [3,0,0],
[3,2,0], [0,2,0], [0,0,0],
])
v.add_polygon(
name="建筑平面",
vertices=square,
colors=np.array([1, 0.5, 0]), # 橙色
alpha=1.0
)
v.save("polyline_demo")
超二次曲面
参数化形状,支持锥化、弯曲与线框模式,适合表示近似椭球体。
v = viz.Visualizer()
# 基本超二次曲面
v.add_superquadrics(
name="椭球体",
positions=np.array([[0,0,0]]),
parameters={
'epsilon': [0.5, 0.5], # 圆润度参数
'size': [1.0, 0.8, 0.6], # 各轴缩放
'color': [1, 0.3, 0.8], # 粉紫色
}
)
# 锥化超二次曲面(类似金字塔)
v.add_superquadrics(
name="锥化形状",
positions=np.array([[2,0,0]]),
parameters={
'epsilon': [0.1, 0.1],
'taper': [0.3, 1.0], # 底部窄顶部宽
'color': [0.3, 0.8, 1], # 天蓝色
},
wireframe=True # 线框模式
)
v.save("superquadric_demo")
运动轨迹
带动画的箭头,适合展示物体运动方向和速度。
v = viz.Visualizer()
# 运动箭头:从起点到终点
v.add_motion_arrows(
name="运动轨迹",
positions=np.array([[0,0,0], [2,1,0]]),
vectors=np.array([[1,0.5,0], [0.5,0.5,0]]),
colors=np.array([[1,0,0], [0,1,0]]),
head_shaft_ratio=0.9,
head_width_ratio=0.3
)
v.save("motion_demo")
相机动画
录制相机轨迹,导出为视频或 GIF。
v = viz.Visualizer()
v.add_points("cloud", points, colors)
# 录制圆形相机轨迹
v.set_camera_animation(
mode="circle", # 或 "spline"
radius=15,
height=5,
look_at=[0, 0, 0],
frames=120, # 帧数
seconds=6 # 时长(秒)
)
# 保存为图片序列(用于 ffmpeg 转视频)
v.save_animation("frames/output_", width=1920, height=1080)
# Blender 导出(高质量)
v.save_blender("output.blend", animation=True)