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也可以是三维坐标元组组成的序列。

python 复制代码
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为真时,会输出更详细的信息。

python 复制代码
plt = vedo.Plotter()
p = plt.color_picker([200, 100], verbose=True)
print(p)

4.8 导出

4.8.1 导出2D图片

plt.screenshot(filename='screenshot.png', scale=1, asarray=False)

对Plotter窗口截图。
scale为整数,设置图片的像素大小倍率。
asarray为真时,不生成图片,而是以numpy数组的格式返回。

python 复制代码
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",嵌入框在被拖动时的颜色;
python 复制代码
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)

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

4.9.2 添加选择区

plt.pick_area(pos1, pos2, at=None)

由两个2D屏幕坐标点确定一个方框,选中其内的所有对象。

返回一个Mesh对象,带有可见的视图区。常用来用来选择场景中的对象。

python 复制代码
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()

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

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,线和文本的间隔;

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

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,消息弹出延时多少毫秒;
python 复制代码
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)

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的内容;
python 复制代码
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)

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

相关推荐
数据智能老司机20 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机21 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i21 小时前
drf初步梳理
python·django
每日AI新事件21 小时前
python的异步函数
python
这里有鱼汤1 天前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三1 天前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试