文章目录
- 4 Plotter类的方法
- 4.3 渲染器内的物体操作
- 4.3.1 添加物体
- 4.3.2 移除物体
- 4.3.3 渲染器的内容列表
- 4.4 相机控制
- 4.4.1 访问相机对象
- 4.4.2 重置相机状态
- 4.4.3 移动相机位置
- 4.4.4 改变相机焦点
- 4.4.5 改变相机朝向的平面
- 4.4.5 旋转相机
- 4.4.6 对齐相机的上朝向
- 4.4.7 缩放
plotter
模块是管理对象和控制3D渲染的模块。
Plotter
实例可以用于显示3D图形对象、控制渲染器行为、操控相机、创建事件以及导出3D数据。几乎所有关于3D图形的操作,都是在Plotter
渲染的窗口进行的。
按照功能把Plotter
的方法分组整理,以下是渲染器内物体和相机的操作的方法。
参考:vedo官方文档
4 Plotter类的方法
4.3 渲染器内的物体操作
4.3.1 添加物体
plt.add(*objs, at=None)
把对象加到将被渲染的对象列表中。at
可以指定哪一个渲染器,不指定则默认为当前渲染器。
python">plt = vedo.Plotter(N=2)
s = vedo.Sphere(r=0.7)
# 添加到第一个渲染器
plt.add(s, at=0)
plt.show(interactive=True)
4.3.2 移除物体
plt.remove(*objs, at=None)
从将被渲染的对象列表中移除对象。被移除的对象可以由给它们分配的名字引用。
at
指定哪个渲染器。
python">s1 = vedo.Sphere(pos=(0, 0, 0), r=0.7)
s2 = vedo.Sphere(pos=(0.4, 0.4, 0), r=0.7)
plt = vedo.Plotter(N=2)
plt.add(s1, s2, at=0)
plt.add(s1, s2, at=1)
# 删除第二个渲染器s1球体
plt.remove(s1, at=1)
plt.show(interactive=True)
plt.pop(at=None)
从移除最后添加到某个渲染器的对象。不指定渲染器默认为当前渲染器。
一般在循环或回调函数中使用。
plt.clear(at=None, deep=False)
清空场景中的所有网格对象和体素对象。
plt.remove_lights()
删除当前渲染器中的全部灯光。
python">s = vedo.Sphere(r=0.7)
# 简易光源
lit = vedo.addons.Light((-3, 0, 0))
# 创建墙面
wall = vedo.Box((3, 0, 0), length=0.1, width=10, height=10)
plt = vedo.Plotter()
# 加阴影
plt.add(s, lit, wall).add_shadows()
plt.azimuth(-50)
plt.remove_lights()
print(plt.get_meshes())
plt.show(interactive=True)
移除灯光后,阴影消失。
4.3.3 渲染器的内容列表
plt.get_meshes()
返回指定的渲染器中的网格对象列表。参数如下:
at=None
,指定哪个渲染器,默认为当前渲染器。include_non_pickables=False
,是否包括不可选取的对象。unpack_assemblies=True
,是否要将assembly
模块组合的对象拆解开返回。
python">plt = vedo.Plotter(N=2)
s = vedo.Sphere(r=0.7)
c = vedo.Cube()
plt.add(s, at=0)
plt.add(c, at=1)
# 取某个渲染器的网格对象列表
print(plt.get_meshes(at=0))
print(plt.get_meshes(at=1))
打印的网格对象列表如下
[<vedo.shapes.Sphere object at 0x000001B61A837FA0>]
[<vedo.shapes.Cube object at 0x000001B61DA4E0E0>]
plt.get_volumes(at=None, include_non_pickables=False)
返回指定的渲染器中的体素对象列表。
plt.get_actors(at=None, include_non_pickables=False)
返回指定的渲染器中的actor列表。
上述代码中两个渲染器的actors列表:
[<vtkmodules.vtkRenderingOpenGL2.vtkOpenGLActor(0x00000164606382A0) at 0x00000164618286A0>]
[<vtkmodules.vtkRenderingOpenGL2.vtkOpenGLActor(0x0000016460638700) at 0x0000016461828940>]
plt.check_actors_trasform(at=None)
重置指定渲染器中所有actor对象的转置矩阵。
在渲染场景中使用交互器手动移动、旋转、缩放actor对象后,这个方法才会生效。
具体效果不明。
4.4 相机控制
4.4.1 访问相机对象
plt.camera
返回当前活动的相机。
返回类型是vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCamera
,包含相机的全部信息。
4.4.2 重置相机状态
plt.reset_camera(tight=None)
重置相机的位置和缩放。位置会重新按照渲染窗格的actors中心计算,缩放设为默认值1。
指定tight
时,缩放后会在xy平面(即窗口内部)保留内边距。
python"># 初始不重置相机
plt = vedo.Plotter(resetcam=False)
plt.add(vedo.Cube())
plt.show(interactive=False)
time.sleep(1)
# 重置相机
plt.reset_camera(tight=3)
plt.show(interactive=True)
相机未重置、重置相机以及使用不同tight
参数的效果:
4.4.3 移动相机位置
plt.move_camera(cameras, t=0, times=(), smooth=True, output_times=())
把相机位置插到输入的两个相机设置的中间。
输入相机可以是vtkCamera
或者相机字典。
在交互模式下按Shift-C
键可以导出当前相机的参数:
###################################################
## Template python code to position this camera: ##
cam = dict(pos=(0, 0, 6.68173),focal_point=(0, 0, 0),viewup=(0, 1.00000, 0),roll=0,distance=6.68173,clipping_range=(4.62492, 9.28696),
)
show(mymeshes, camera=cam)
###################################################
4.4.4 改变相机焦点
plt.fly_to(point)
移动相机,看向指定的焦点。
python">c1 = vedo.Cube(pos=(2, 2, 2))
c2 = vedo.Cube(pos=(0, 0, 0))
c3 = vedo.Cube(pos=(-2, -2, -2))
plt = vedo.Plotter()
plt.show(s1, s2, s3, axes=1, interactive=False)
plt.fly_to([2,2,2])
plt.show(interactive=True)
4.4.5 改变相机朝向的平面
plt.look_at(plane='xy')
移动相机,使其看向指定的笛卡尔平面。
创建一个便于观察的立方体:
python">c = vedo.Cube().compute_normals()
# 6个面设置编号
labels = c.labels('id', on='cells')
# 设置6个面的颜色
c.cellcolors = [(255, 0, 0), (255, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 255), (0, 0, 255)]
plt = vedo.Plotter()
plt.show(c, labels)
展示look_at
的效果:
python"># 输入'xy'等价于'yx'
plt.look_at('yz')
plt.show(c, labels, interactive=True, axes=14)
4.4.5 旋转相机
plt.azimuth(angle)
以焦点为中心,绕着相机上方方向旋转相机。
plt.elevation(angle)
以焦点为中心,绕着透视的反向和向上视图向量的叉积方向旋转相机。
python">plt = vedo.Plotter(sharecam=False, shape=(3, 3), size=(900, 900))
idx = 0
for ele in [40, 0, -40]:for azi in [-40, 0, 40]:plt.renderer = plt.renderers[idx]plt.azimuth(azi)plt.elevation(ele)plt.show(c, labels, vedo.Text2D(f"azimuth({azi})\nelevation({ele})", s=1), at=idx)idx += 1
plt.show(interactive=True)
3dcab637.jpeg#pic_center" alt="旋转相机" height="600" />
plt.roll(angle)
以焦点为中心,绕着透视方向旋转相机。
3d24b86aa9cb25e2bb5c5b1.jpeg#pic_center" alt="roll旋转" height="200" />
4.4.6 对齐相机的上朝向
plt.reset_viewup(smooth=True)
把相机的上朝向设置为最近的正交方向。
正交方向,即与3维坐标轴平行的朝向,一共6个(x、y、z的正负方向)。
相机上朝向的向量默认是(0, 1, 0)
,即朝向 y 轴的正方向。使用roll
方法时,该向量值会发生改变。
相机在使用azimuth
、elevation
、roll
方法变换后,再使用reset_viewup
方法,可以使相机的正上方朝向和最近的坐标轴朝向对齐。
4.4.7 缩放
plt.fov(angle)
设置相机的视野角度。这个角度是相机视锥在水平方向的角度。默认角度是30度。
高的angle
值能产生广角镜头(鱼眼效果),低值产生的是远距镜头。
python">plt = vedo.Plotter()
plt.show(c, labels, interactive=False)
plt.fov(10)
plt.render()
plt.interactive()
3d1d47f04868b4c2ffd562ab9dcd.jpeg#pic_center" alt="fov" />
plt.zoom(zoom)
缩放当前相机视野。
plt.zoom
的效果和plt.fov
是一样的,如果这两个方法两个都做了调用,最后被调用的那个生效。
plt.dolly(value)
使相机靠近或远离焦点。value
大于0为靠近,小于0是远离。
dolly
在测试用例中无效果。
以上是在渲染器中增删物体和控制相机的方法。