Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件

文章目录

  • 4 Plotter类的方法
    • 4.7 屏幕和场景中的坐标点转换
      • 4.7.1 屏幕坐标转为世界坐标
      • 4.7.2 世界坐标转为屏幕坐标
      • 4.7.3 屏幕坐标取颜色
    • 4.8 导出
      • 4.8.1 导出2D图片
      • 4.8.2 导出3D文件
    • 4.9 添加控件
      • 4.9.1 添加内嵌子窗口
      • 4.9.2 添加选择区
      • 4.9.3 添加比例尺
      • 4.9.4 为对象添加弹出提示
      • 4.9.4 悬浮时显示对象说明
      • 4.9.5 添加`addons`模块的附件


vedo是Python实现的一个用于辅助科学研究的3D可视化库。vedo的plotter模块是管理对象和控制3D渲染的模块。
plotter.Plotter实例可以用于显示3D图形对象、控制渲染器行为、操控相机、创建事件以及导出3D数据。几乎所有关于3D图形的操作,都是在Plotter渲染的窗口进行的。

参考:vedo官方文档


4 Plotter类的方法

按照功能把Plotter的方法分组整理,前面已经把主要的方法整理完了,剩下的是一些辅助方法,分为转换坐标、场景导出、添加附件三类。

4.7 屏幕和场景中的坐标点转换

有的方法需要以3D世界坐标系中的坐标作为参数,也有一些方法需要以屏幕坐标为参数。
这里提供了两种坐标互相转换的方法。

4.7.1 屏幕坐标转为世界坐标

plt.compute_world_coordinate()
把屏幕上的2D点转换为渲染场景中的3D点坐标。参数如下:

  • pos2D,2D屏幕坐标点;
  • at=None,渲染器序号;
  • objs=(),欲放置该点的网格对象列表;
  • bounds=(),指定边界框;
  • offset=None,指定偏移值;
  • pixeltol=None,屏幕容差;
  • worldtol=None,世界坐标容差;

4.7.2 世界坐标转为屏幕坐标

plt.compute_screen_coordinates(obj, full_window=False)
给定当前渲染器或整个窗口中的3D点,找到它的屏幕像素坐标。
obj是网格对象时,会计算其所有顶点坐标在屏幕上的位置。
obj也可以是三维坐标元组组成的序列。

c = vedo.Cube()
plt = vedo.Plotter()
# 将对象的顶点转为屏幕位置
p1 = plt.compute_screen_coordinates(c)
# 将指定的3维坐标点转为屏幕位置
p2 = plt.compute_screen_coordinates([(1, 1, 1), (2, 2, 2)])

上述的两个方法可以填超出屏幕大小或是超出窗口大小的坐标。

4.7.3 屏幕坐标取颜色

plt.color_picker(xy, verbose=False)
指定屏幕上的坐标位置,提取像素点的颜色,返回RGB格式的颜色。
选取的点在渲染窗口区域之外,返回None。
verbose为真时,会输出更详细的信息。

plt = vedo.Plotter()
p = plt.color_picker([200, 100], verbose=True)
print(p)

color_picker


4.8 导出

4.8.1 导出2D图片

plt.screenshot(filename='screenshot.png', scale=1, asarray=False)
对Plotter窗口截图。
scale为整数,设置图片的像素大小倍率。
asarray为真时,不生成图片,而是以numpy数组的格式返回。

c = vedo.Cube()
plt = vedo.Plotter()
plt.show(c, vedo.Text2D("scale=2", s=3), interactive=False)
plt.screenshot("kkk2.jpg", scale=2)
arr = plt.screenshot(asarray=True)
print(arr)
plt.interactive()

数组输出结果是

[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 ...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

plt.toimage(scale=1)
从当前渲染器窗口生成一个Image对象。

4.8.2 导出3D文件

plt.export(filename='scene.npz', binary=False)
把场景导出为HTML、X3D或numpy文件,文件格式在filename参数中指定后缀即可。

  • HTML文件可以直接在浏览器渲染。
  • X3D文件(后缀x3d)可以被常用的3D建模软件兼容。
  • numpy文件(后缀npz)是Python独有的,体积小,可以快速读取。

4.9 添加控件

4.9.1 添加内嵌子窗口

plt.add_inset(\*objects, \*\*options)
往渲染器添加一个可拖动的嵌入空间。

  • at=None,渲染器编号;
  • pos=0,嵌入框的初始位置。范围1-4,分别表示窗格的左上、右上、左下、右下。
    也可以填(x,y)元组,x、y范围0-1,表示宽和高占渲染窗格大小的百分比。
  • size=0.1,方形嵌入空间占窗格大小的百分比;
  • draggable=True,为真时该子渲染控件可以被拖动;
  • c="lb",嵌入框在被拖动时的颜色;
c = vedo.Cube(pos=(1, 0, 0))
s = vedo.Sphere(pos=(-1, 0, 0), res=10)
plt = vedo.Plotter(bg="lb")
# 子窗格显示立方体
plt.add_inset(c)
plt.show(c, s)

子窗口中的立方体会与主场景中的立方体同步旋转。
inset

4.9.2 添加选择区

plt.pick_area(pos1, pos2, at=None)
由两个2D屏幕坐标点确定一个方框,选中其内的所有对象。
返回一个Mesh对象,带有可见的视图区。常用来用来选择场景中的对象。

c = vedo.Cube(pos=(1, 0, 0))
s = vedo.Sphere(pos=(-1, 0, 0), res=10)
plt = vedo.Plotter()
plt.show(c, s, axes=1, interactive=False)
pa = plt.pick_area([400, 400], [800, 800])
plt.add(pa)
plt.interactive()

要先展示对象,然后创建和添加选择区。否则会出现预料外的结果。
pick_area

4.9.3 添加比例尺

plt.add_scale_indicator()
添加一个比例尺。只在平行投影模式可用。

  • pos=(0.7, 0.05),在屏幕上的位置,以比例值表示;
  • s=0.02,文本的尺寸;
  • length=2,线的长度;
  • lw=4,线宽;
  • c="k1",颜色;
  • alpha=1,透明度;
  • units="",表示单位的字符串;
  • gap=0.05,线和文本的间隔;

比例尺下面的数值会随着图像的缩放自动变化数值。
scale

4.9.4 为对象添加弹出提示

plt.add_hint()
鼠标悬浮到某个对象上时,创建一个弹出消息。

add_hint(None)可以禁用所有弹出消息,add_hint(obj, False)可以禁用指定对象的弹出消息。

参数如下:

  • objMeshPoints的实例;
  • text="",消息内容;
  • c="k",消息文字颜色;
  • bg="yellow9",消息底色;
  • font="Calco",消息字体;
  • size=18,消息字号;
  • justify=0,对齐方式;
  • angle=0,消息文字逆时针旋转的角度;
  • delay=250,消息弹出延时多少毫秒;
c = vedo.Cube()
plt = vedo.Plotter(size=(900, 900))
plt.add_hint(c, "Another Cube hint.", c="r", angle=90, size=32)
plt.show(c)

hint

4.9.4 悬浮时显示对象说明

plt.add_hover_legend()
鼠标移到到任意对象上时,显示该对象的说明文字。
参数如下:

  • at=None,渲染器编号;
  • c=None,文字颜色;默认从黑色或白色中自动选择。
  • pos="bottom-left",文字位置;
  • font="Calco",文字字体;
  • s=0.75,文字缩放;
  • bg="auto",文本框的颜色;
  • alpha=0.1,文本框的透明度;
  • maxlength=24,每行允许的最大字符数;
  • use_info=False,可视化obj.info的内容;
c = vedo.Cube(pos=(1, 0, 0))
s = vedo.Sphere(pos=(-1, 0, 0), res=10)
plt = vedo.Plotter()
plt.add_hover_legend(s=1.75)
plt.show(c, s)

legend

4.9.5 添加addons模块的附件

addons模块包含了各种用于标示和操控的附件,Plotter的以下8个方法都是调用的addons模块的对应方法,具体参数也一样,后续看到这个模块时详述。
plt.add_slider()
添加一个vedo.addons.Slider2D对象。
plt.add_slider3d()
添加一个3D滑块控件。
plt.add_button()
在渲染窗口添加按钮。
plt.add_spline_tool()
为当前Plotter实例添加一个曲线工具。
曲线工具上的节点可以鼠标拖动,点击这条曲线可以添加一个额外的点。选中点后按del键可以移除该点。
plt.add_icon()
在渲染器上添加一个嵌入式图标的网格对象。
plt.add_global_axes()
在场景中绘制轴。
plt.add_legend_box()
在右上角添加图例。
plt.add_renderer_frame()
为渲染器子窗口添加边框。


以上是Plotter类中进行坐标转换、场景导出和添加控件的方法。

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

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

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

相关文章

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题,需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令,用于维护 go.mod 文件…

【CSS in Depth 2 精译_088】第五部分:添加动效概述 + 第 15 章:CSS 过渡特效概述 + 15.1:状态间的由此及彼

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼 ✔️15.2 定时函数 文章目录 第 5 部分 添加动效 Adding motion第 15 章 过渡 Transitions15.1 状态间的由此及彼 From here…

【翻译】大型 Transformer 模型推理优化

翻译原文:Large Transformer Model Inference Optimization | LilLog 原文作者:Lilian Weng 目录 方法概述蒸馏 Distillation量化 Quantization Transformer 量化的挑战训练后量化 (PTQ) 混合精度量化 Mixed-precision quantization细粒度量化量化的二…

【Leecode】Leecode刷题之路第88天之合并两个有序数组

题目出处 88-合并两个有序数组-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 88-合并两个有序数组-官方解法 方法1:直接合并后排序 思路: 代码示例&#xff1a…

Java图片拼接

最近遇到一个挺离谱的功能,某个表单只让上传一张图,多图上传会使导出失败。跟开发沟通后表示,这个问题处理不了。我... 遂自己思考,能否以曲线救国的方式拯救一下,即不伤及代码之根本,又能解决燃眉之急。灵…

bridge between Lua world and the .NET

一、新建项目&#xff1a;luademo 安装包&#xff1a;<PackageReference Include"NLua" Version"1.7.3" /> using NLua; using System;namespace luademo {internal class Program{static void Main(string[] args){Lua state new Lua();for (int …

跟着问题学23番外——反向传播算法理论(1)

前向传播与反向传播 在单层神经网络的优化算法里&#xff0c;我们讲到优化算法是为了寻找模型参数使得网络的损失值最小&#xff0c;这里详细介绍一下应用的基础——反向传播算法。 在神经网络中&#xff0c;梯度计算是通过反向传播算法来实现的。反向传播算法用于计算损失函…

Liveweb视频融合共享平台在果园农场等项目中的视频监控系统搭建方案

一、背景介绍 在我国的大江南北遍布着各种各样的果园&#xff0c;针对这些地处偏僻的果园及农场等环境&#xff0c;较为传统的安全防范方式是建立围墙&#xff0c;但是仅靠围墙仍然无法阻挡不法分子的有意入侵和破坏&#xff0c;因此为了及时发现和处理一些难以察觉的问题&…

华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…

开源轮子 - EasyExcel01(核心api)

EasyExcel01 - 核心api 本文整理自掘金大佬 - 竹子爱熊猫 https://juejin.cn/post/7405158045662576640 文章目录 EasyExcel01 - 核心api一&#xff1a;初相识EasyExcel1&#xff1a;写入excel入门2&#xff1a;读取Excel入门 二&#xff1a;数据模型注解1&#xff1a;读写通用…

实验13 C语言连接和操作MySQL数据库

一、安装MySQL 1、使用包管理器安装MySQL sudo apt update sudo apt install mysql-server2、启动MySQL服务&#xff1a; sudo systemctl start mysql3、检查MySQL服务状态&#xff1a; sudo systemctl status mysql二、安装MySQL开发库 sudo apt-get install libmysqlcli…

【java基础系列】实现数字的首位交换算法

在java中&#xff0c;手写实现一个数字的首位交换算法实现 实现效果 实现代码 核心业务代码 public static void main(String[] args) {int[] arr {1,2,3,4,5};int temp arr[0];for (int i 0; i < arr.length; i) {System.out.print(arr[i]);}System.out.println(&quo…

kubeadm一键部署K8S 集群架构

kubeadm一键部署K8S 集群架构(centos7) https://www.k8src.cn/ https://kubernetes.io/zh-cn/docs/home/ https://blog.csdn.net/m0_58709145/article/details/140128179 https://blog.csdn.net/jiaqijiaqi666/article/details/129745828 Kubeadm init报错[ERROR CRI]: contai…

【LeetCode: 876. 链表的中间结点 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】

开发环境搭建&#xff1a;Linux-Ubuntu下搭建ESP32的开发环境的步骤&#xff0c;使用乐鑫最新稳定版的esp-idf-CSDN博客 一、安装好开发环境后&#xff0c;在esp目录下再创建一个esp32的目录【用于编程测试demo】 二、进入esp32目录&#xff0c;打开终端【拷贝esp-idf的hello工…

单节点calico性能优化

在单节点上部署calicov3273后&#xff0c;发现资源占用 修改calico以下配置是资源消耗降低 1、因为是单节点&#xff0c;没有跨节点pod网段组网需要&#xff0c;禁用overlay方式网络(ipip&#xff0c;vxlan),使用route方式网络 配置calico-node的环境变量 CALICO_IPV4POOL_I…

基于鲲鹏服务器的打砖块小游戏部署

案例介绍 鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器&#xff0c;适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力&#xff0c;适合大数据分析、软件定义存储、Web等应用场景。 本案例将指导开发者如何在鲲鹏服务…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

机器学习基础算法 (一)-线性回归

python 环境的配置参考 从零开始&#xff1a;Python 环境搭建与工具配置 线性回归的 Python 实现 线性回归是一种经典的机器学习算法&#xff0c;用于预测连续的目标变量。它假设目标变量和特征之间存在线性关系。本文将详细介绍线性回归的原理、Python 实现、模型评估和调优&…

基于linux下实现的ping程序(C语言)

linux下实现的ping程序 一、设计目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP&#xff0c;使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道&#xff0c;ICMP是基于IP的一个协议&#xff0c;ICMP包通过IP的封装之后传递。 课程设…