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

news2025/4/16 16:42:19

文章目录

  • 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可以指定哪一个渲染器,不指定则默认为当前渲染器。

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指定哪个渲染器。

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()
删除当前渲染器中的全部灯光。

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模块组合的对象拆解开返回。
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平面(即窗口内部)保留内边距。

# 初始不重置相机
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)
移动相机,看向指定的焦点。

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')
移动相机,使其看向指定的笛卡尔平面。

创建一个便于观察的立方体:

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的效果:

# 输入'xy'等价于'yx'
plt.look_at('yz')
plt.show(c, labels, interactive=True, axes=14)

相机朝向笛卡尔平面

4.4.5 旋转相机

plt.azimuth(angle)
以焦点为中心,绕着相机上方方向旋转相机。
plt.elevation(angle)
以焦点为中心,绕着透视的反向和向上视图向量的叉积方向旋转相机。

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)
以焦点为中心,绕着透视方向旋转相机。
roll旋转

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值能产生广角镜头(鱼眼效果),低值产生的是远距镜头。

plt = vedo.Plotter()
plt.show(c, labels,  interactive=False)
plt.fov(10)
plt.render()
plt.interactive()

fov

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

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

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


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07篇(附)--仿射变换矩阵

此篇献给某些 头铁 的小只因们&#xff0c;认真钻研下面的数学式吧 原理示例 首先我们以最简单的一个点的旋转为例子&#xff0c;且以最简单的情况举例&#xff0c;令旋转中心为坐标系中心O&#xff08;0&#xff0c;0&#xff09;&#xff0c;假设有一点P0(x0,y0)&#xff0…

Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg

Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg 一、全屏截图并保存到StreamingAssets路径下 Texture2D screenShot;//保存截取的纹理public Image image; //显示截屏的Imagepublic void Jietu(){StartCoroutine(ScrrenCapture(new Rect(0, 0, Screen.width…

【2025最新计算机毕业设计】基于SprintBoot+Vue乡村振兴民宿管理系统【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

在Docker中运行MySQL的思考:挑战与解决方案

引言 在云计算和容器化技术日益普及的今天&#xff0c;Docker作为一种轻量级的容器化平台&#xff0c;已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而&#xff0c;并非所有应用都适合在Docker容器中…

【Linux网络】网络基础:传输层TCP协议(二)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 传输层UDP/TCP协议 确认应答机制超时重传机制连接管理机制理解 TIME_WAIT 状态 滑动窗口流量…

virtualbox 搭建ubuntu

环境&#xff1a;VirtualBox-6.1.32 1、下载安装virtualbox 略 2、新建ubuntu 3、配置ubuntu 选择虚拟盘 4、安装ubuntu 5、安装ssh sudo apt install openssh-server openssh-client 查看ip 6、安装samba sudo apt install samba 查看ssh启动状态 sudo systemctl stat…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高&#xff0c;生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间&#xff0c;人员误入或违规进入将带来严重的安全隐患。为了解决这一问题&#xff0c;迈尔微视推出了智能人体安全检测解决方案&#xff0c;为企业提供全方位的人员安全监…

Javaweb web后端maven介绍作用安装

自动导入到这个项目 src是源代码 main主程序&#xff0c;核心代码 java是Java源代码 resources是项目配置文件 test测试相关的 maven概述 介绍 依赖在本地仓库查找&#xff0c;如果本地仓库有&#xff0c;用本地仓库的依赖&#xff0c;本地没有&#xff0c;连接中央仓库&…

独家原创 | CEEMDAN-CNN-GRU-GlobalAttention + XGBoost组合预测

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…

网络基础概念

协议 协议在我的理解看来其实就是为了让全部计算机做通信而设计出来的一种约定 计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式 而制定协议这件事情并不是…

向量数据库Faiss C++

目录 1. Faiss简介2. FAISS 的主要特点2.1 高效性2.2 支持多种索引类型2.3 灵活性2.4 GPU 加速2.5 易于集成 3. 应用场景4. 安装4.1 安装依赖4.2 编译源码4.2.1 下载Faiss源码4.2.2 编译 5. Demo5.1 代码5.2 编译5.3 运行 1. Faiss简介 FAISS&#xff08;Facebook AI Similari…

群控系统服务端开发模式-应用开发-获取登录者今天操作日志

一、后端api开放路由 在根目录下route文件夹下app.php文件中&#xff0c;在perimission的group中添加如下代码&#xff1a; Route::get(member/personal_log,permission.Member/personalLog);// 获取个人信息操作接口 二、后端api添加方法 在根目录下app文件夹下controller文…

淘宝/天猫获得淘宝商品详情高级版 API 接口获取

要获取淘宝/天猫商品详情高级版API接口&#xff0c;您可以按照以下步骤操作&#xff1a; 注册淘宝开放平台账号&#xff1a; 访问淘宝开放平台官网&#xff0c;点击“开发者中心”&#xff0c;使用淘宝账号登录或注册新账号。这是获取API权限和密钥的第一步。 创建应用并获取AP…

腾讯云系统盘扩容

在腾讯云申请空间后&#xff0c;只要执行三行命令 云硬盘 在线扩展系统盘分区及文件系统-操作指南-文档中心-腾讯云 安装工具 yum install -y cloud-utils-growpart 给/eav/vda1扩分区 LC_ALLen_US.UTF-8 growpart /dev/vda 1 挂载扩容 ext4 文件系统 resize2fs /dev/vda1 …

数据结构 ——二叉树转广义表

数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树&#xff0c;转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根&#xff08;左子树&#xff09;&#xff08;右子树&#xff09;) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…

人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM

上一篇&#xff1a;《人工智能大语言模型起源篇&#xff08;一&#xff09;&#xff0c;从哪里开始》 &#xff08;5&#xff09;Howard 和 Ruder 于2018年发表的《Universal Language Model Fine-tuning for Text Classification》&#xff0c;https://arxiv.org/abs/1801.06…

设置笔记本同时连接内外网

原理&#xff1a;通过笔记本和手机相连&#xff0c;实现双网卡功能能。笔记本连接内网wifi、同时手机端开启usb网络共享&#xff0c;笔记本就有了两个网&#xff0c;然配置那个访问外网&#xff0c;那个访问内网。 1.笔记本wifi连接内网wifi 2.手机端共享网络。 手机打开 -【…

【Hexo】Hexo基本使用

Hexo官网&#xff1a;https://hexo.io/ Hexo Github: https://github.com/hexojs/hexo Hexo Awesome: https://github.com/hexojs/awesome-hexo 1、初始化 需要node 环境&#xff0c;不再赘述node安装过程 推荐使用cnpm进行安装 npm install -g cnpm --registryhttps://regi…

PPO系列4 - Reward模型训练

流程&#xff1a; 训练Reward模型 训练数据&#xff1a; 相比给每条回答进行打分&#xff0c;人类更容易给出两者的比较结果。这样标注出来的数据&#xff0c;准确性更高。 模型&#xff1a; 可以使用和生成模型能力差不多的模型&#xff08;或者更强的模型&#xff09;&#x…

5.11如何用PyTorch实现ResNet34

ResNet34是由16个残差块和一个全局平局池化层和一个全连接层组成&#xff0c;即32个卷积层1个pooling层1和fc层。 训练的数据集是cifar10数据集&#xff0c;训练次数5&#xff0c;损失函数为CrossEntropyLoss()&#xff0c;optimizer torch.optim.SGD。 1.先定义残差块&#…