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

相关推荐
小豆豆儿6 分钟前
【PyCharm】快捷键使用
ide·python·pycharm
hao_wujing17 分钟前
3D 视觉语言推理中的态势感知
3d
互联网杂货铺1 小时前
接口测试自动化实战(超详细的)
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
处女座_三月1 小时前
使用QQ登录(头条项目-09)
android·python·django
程序员陆通1 小时前
使用 Python 开发一个 AI Agent 自媒体助手示例
人工智能·python·媒体
最好Tony1 小时前
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
图像处理·python·opencv
zhangfeng11331 小时前
python mysql库的三个库mysqlclient mysql-connector-python pymysql如何选择,他们之间的区别
数据库·python·mysql
007php0072 小时前
深入了解计算机网络中的路由协议与性能优化
java·开发语言·数据库·后端·python·计算机网络·golang
互联网杂货铺2 小时前
接口测试(postman/jmeter)
自动化测试·软件测试·python·测试工具·jmeter·测试用例·postman
最好Tony2 小时前
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换
图像处理·python·opencv