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

ops/2024/12/15 21:54:34/

文章目录

  • 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方法时,该向量值会发生改变。

相机在使用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()

3d1d47f04868b4c2ffd562ab9dcd.jpeg#pic_center" alt="fov" />

plt.zoom(zoom)
缩放当前相机视野。
zoom

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

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


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

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


http://www.ppmy.cn/ops/142212.html

相关文章

在springBoot项目如何对本地配置文件和云服务配置文件独立配置

springBoot中配置文件本地和云服务配置文件独立配置 1.首先我们创建好一个springBoot项目后&#xff0c;需要再创建两个application.yml配置文件&#xff0c;如图 2.然后在各自的配置文件中配置各自环境的信息&#xff0c;注意的是在创建各自环境的yml文件时&#xff0c;必须…

WPF Combox使用 Text无法选择正确获取CHange后的Text

使用固定ComboxItem 无法通过 selectitem as object 来进行回去到 Content内的对香数据。那我只能这个样干&#xff1a; private void CBPaiweiLeixingSelect_Change(object sender, SelectionChangedEventArgs e){ ComboBox ThisBox sender as ComboBox;List<EDaxiaosuixi…

1125 子串与子列 (暴力搜索,PAT甲级中文版,C++实现)

子串是一个字符串中连续的一部分&#xff0c;而子列是字符串中保持字符顺序的一个子集&#xff0c;可以连续也可以不连续。例如给定字符串 atpaaabpabtt&#xff0c;pabt是一个子串&#xff0c;而 pat 就是一个子列。 现给定一个字符串 S 和一个子列 P&#xff0c;本题就请你找…

【Zabbix】解决乱码问题

1. 在控制面板-外观和个性化-字体里面找到楷体 2. 上传至/usr/share/zabbix/assets/fonts/&#xff0c;注意命名要小写 3. 修改/usr/share/zabbix/include/defines.inc.php内容 将defines.inc.php中的内容为simkai 4. 刷新页面解决

Linux 添加spi-nor flash支持

1. spi-nor flash简介 在嵌入式ARM开发过程中通常会使用到spi-nor flash&#xff0c;主要用于固化u-boot镜像以支持spi方式启动系统。目前常用的spi-nor flash有gd25wq128e、w25q128等flash芯片&#xff0c;下述以gd25wq128e为例进行讲解。 2.调试通常遇到的问题 无法识别到…

protobuf c++开发快速上手指南

1、环境准备 在c环境使用 protobuf&#xff0c;需要安装protobuf runtime以及protobuf的编译器&#xff1a;protoc&#xff0c;其作用如下表格&#xff1a; 需要安装的环境作用protoc将proto文件编译成c源码protobuf runtime编译c源码需要链接到protobuf库 注意&#xff1a;…

bain.js(十二):RNN神经网络实战教程 - 音乐乐谱生成 -人人都是作曲家~

系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;可以在浏览器运行的、默认GPU加速的神经网络库概要介绍&#xff08;二&#xff09;&#xff1a;项目集成方式详解&#xff08;三&#xff09;&#xff1a;手把手教你配置和训练神经网络&#xff08;四&#xff09…

如何实现后端返回excel文件,在前端下载功能

前言 简单记录一下&#xff0c;excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式&#xff0c;返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…