Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录

  • [4 Plotter类的方法](#4 Plotter类的方法)
    • [4.3 渲染器内的物体操作](#4.3 渲染器内的物体操作)
      • [4.3.1 添加物体](#4.3.1 添加物体)
      • [4.3.2 移除物体](#4.3.2 移除物体)
      • [4.3.3 渲染器的内容列表](#4.3.3 渲染器的内容列表)
    • [4.4 相机控制](#4.4 相机控制)
      • [4.4.1 访问相机对象](#4.4.1 访问相机对象)
      • [4.4.2 重置相机状态](#4.4.2 重置相机状态)
      • [4.4.3 移动相机位置](#4.4.3 移动相机位置)
      • [4.4.4 改变相机焦点](#4.4.4 改变相机焦点)
      • [4.4.5 改变相机朝向的平面](#4.4.5 改变相机朝向的平面)
      • [4.4.5 旋转相机](#4.4.5 旋转相机)
      • [4.4.6 对齐相机的上朝向](#4.4.6 对齐相机的上朝向)
      • [4.4.7 缩放](#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)

plt.roll(angle)

以焦点为中心,绕着透视方向旋转相机。

4.4.6 对齐相机的上朝向

plt.reset_viewup(smooth=True)

把相机的上朝向设置为最近的正交方向。

正交方向,即与3维坐标轴平行的朝向,一共6个(x、y、z的正负方向)。

相机上朝向的向量默认是(0, 1, 0),即朝向 y 轴的正方向。使用roll方法时,该向量值会发生改变。

相机在使用azimuthelevationroll方法变换后,再使用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()

plt.zoom(zoom)

缩放当前相机视野。

plt.zoom的效果和plt.fov是一样的,如果这两个方法两个都做了调用,最后被调用的那个生效。

plt.dolly(value)

使相机靠近或远离焦点。value大于0为靠近,小于0是远离。
dolly在测试用例中无效果。


以上是在渲染器中增删物体和控制相机的方法。

更多关于数据可视化的内容参考:Python数据可视化笔记

相关推荐
web135085886351 小时前
Python大数据可视化:基于python的电影天堂数据可视化_django+hive
python·信息可视化·django
东方芷兰2 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
不会Hello World的小苗4 小时前
Java——列表(List)
java·python·list
m0_748235956 小时前
Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider
hadoop·python·flask
Dyan_csdn6 小时前
【Python项目】基于Python的Web漏洞挖掘系统
网络·python·安全·web安全
Minner-Scrapy6 小时前
DApp 开发入门指南
开发语言·python·web app
&小刘要学习&7 小时前
anaconda不显示jupyter了?
python·jupyter
jerry-897 小时前
jupyterhub_config配置文件内容
python
奔跑吧邓邓子7 小时前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
学长学姐我该怎么办7 小时前
年前集训总结python
python