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

文章目录

  • 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 缩放


vedo是Python实现的一个用于辅助科学研究的3D可视化库。vedo的plotter模块是管理对象和控制3D渲染的模块。

plotter.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数据可视化笔记

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mumu模拟器12开启ADB调试方法

在使用安卓模拟器进行开发或调试时&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;是一项不可或缺的工具。大多数模拟器默认开启了ADB调试功能&#xff0c;但在安装最新版的 Mumu模拟器12 时&#xff0c;可能会遇到 adb devices 无法识别设备的问题。 问题描述 …

【OpenCV计算机视觉】图像处理——平滑

本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点&#xff0c;希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么&#xff1f; 2、常见的图像噪声 &#xff08;1&#xff09;椒盐噪声 ​编辑&#xff08;2&#xff09; 高斯噪声 &a…

vue CSS 自定义宽高 翻页 剥离 效果

新增需求&#xff0c;客户需要类似PPT的剥离效果用于WEB页面翻页&#xff0c;查找资料后&#xff0c;参考下方的掘金博主的文章&#xff0c;并将HTML修改成vue的页面进行使用。其中宽度、高度改成了变量&#xff0c;样式style中的属性与宽高的关系整理成了公式进行动态计算。 …

单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”

在当今全球科技竞争日益激烈的背景下&#xff0c;技术自主可控的重要性愈发凸显。它不仅关乎国家安全&#xff0c;更是推动产业升级和经济发展的关键。特别是在一些特殊领域&#xff0c;如防爆通信&#xff0c;自主可控的技术更是不可或缺。遨游通讯推出了一款融合了单北斗、鸿…

Word2Vec:将词汇转化为向量的技术

文章目录 Word2Vec来龙去脉分层Softmax负采样 Word2Vec 下面的文章纯属笔记&#xff0c;看完后不会有任何收获&#xff0c;如果想理解这两种优化技术&#xff0c;给大家推荐一篇博客&#xff0c;讲的很好&#xff1a; 详解-----分层Softmax与负采样 来龙去脉 word2vec,即将词…

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色

websocket_asyncio

WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识&#xff0c;以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识&#xff0c;以及 asyncio 的特性和优势。 1. 什么是 WebS…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境&#xff1a;hadoop-3.4.0&#xff0c;jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址&#xff08;root权限&#xff09; 开启master&#xff0c;修改主机名为…

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…

【Linux】—简单实现一个shell(myshell)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff01; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&…

【Python爬虫系列】_032.Scrapy_全站爬取

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…

Showrunner AI技术浅析(四):多智能体模拟

多智能体模拟技术涉及多个智能体&#xff08;Agents&#xff09;在虚拟环境中的行为和互动&#xff0c;每个智能体都有自己的属性、目标和行为规则。 1. 多智能体模拟概述 多智能体模拟技术通过模拟多个智能体在虚拟环境中的互动来生成复杂的剧情和场景。每个智能体都有其独特…

创新性融合丨卡尔曼滤波+目标检测 新突破!

2024深度学习发论文&模型涨点之——卡尔曼滤波目标检测 卡尔曼滤波是一种递归算法&#xff0c;用于估计线性动态系统的状态。它通过预测和更新两个步骤&#xff0c;结合系统模型和观测数据&#xff0c;来估计系统状态&#xff0c;并最小化估计的不确定性。 在目标检测中&am…

USB模块布局布线

1、USB接口定义 2、USB模块常规分类介绍 3、USB常用管脚定义图示 4、USB模块布局布线分析 USB3.0高速线因为速度比较高&#xff0c;建议走圆弧线不能走钝角 5、总结 1、CTRL鼠标中间滑轮按下可以看线的长度 2、不懂差分类和规则的设置&#xff0c;可以看本人写的AD基础操作…

SpringCloud系列之分布式配置中心极速入门与实践

[toc] 1、分布式配置中心简介 在实际的项目开发中&#xff0c;配置文件是使用比较多的&#xff0c;很多项目有测试环境(TEST)、开发环境(DEV)、规范的项目还有集成环境(UAT)、生产环境(PROD)&#xff0c;每个环境就一个配置文件。 CSDN链接&#xff1a;SpringCloud系列之分布式…

【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…