当前位置: 首页 > article >正文

Python的3D可视化库vedo 1-3 (visual模块)网格对象的线和面、图片的属性

文章目录

  • 4 MeshVisual
    • 4.1 线条
      • 4.1.1 线宽和颜色
      • 4.1.2 线条渲染为管
    • 4.2 曲面
      • 4.2.1 物体展示为实心或框架
      • 4.2.2 曲面插值
      • 4.2.3 面的剔除
    • 4.3 纹理
    • 4.4 相机跟随
  • 5 ImageVisual
    • 5.1 图片属性
      • 5.1.1 占用内存大小
      • 5.1.2 颜色标量范围
    • 5.2 渲染属性
      • 5.2.1 透明度
      • 5.2.2 亮度
      • 5.2.3 对比度

visual子模块包含了管理对象及其属性的可视化和外观的基类。
本文对visual模块的2个基类 MeshVisualImageVisual封装的方法做学习和测试。
MeshVisual是网格对象 Mesh的基类,几乎所有的3D立体图形都是 Mesh或是它的子类。
ImageVisualImage的基类,在需要往3D场景中放置2D图片时会使用 Image读取和显示图片。

4 MeshVisual

网格对象的可视化控制。

4.1 线条

4.1.1 线宽和颜色

c.linewidth(lw=None)
c.lw(linewidth=None)
设置或获取网格对象边线的线宽。

c.linecolor(lc=None)
c.lc(linecolor=None)
设置或获取网格对象边线的颜色。

c = vedo.Cube()
print(c.linewidth())
print(c.linecolor())

默认的线宽为1,线条颜色是黑色:

1.0
[0. 0. 0.]

4.1.2 线条渲染为管

c.render_lines_as_tubes(value=True)
可视化时,在线周围包裹管。这个效果在线条较粗时才能明显看到。

# 正方体的线渲染为管
c1 = vedo.Cube().wireframe().render_lines_as_tubes().lw(40)
# 正方体的线
c2 = vedo.Cube().wireframe().lw(40)
vedo.show(c1, c2, N=2)

线条渲染为管

4.2 曲面

4.2.1 物体展示为实心或框架

c.wireframe(value=True)
把网格对象表示为线框或实心的外观。

下图上侧为实心物体,下侧为用wireframe方法创建的框架物体:
实心和框架外观

4.2.2 曲面插值

c.flat()
栅格化多边形,不做曲面插值。
c.phong()
使用冯氏算法做曲面插值。它会在栅格化的多边形上内插表面法线,并根据内插法线和反射模型计算像素颜色。默认是该方式。

比较二者区别:

# 栅格化
s1 = vedo.Sphere(res=10, r=0.7).flat()
# 冯氏算法插值
s2 = vedo.Sphere(res=10, r=0.7).phong()
vedo.show([(s1, vedo.Text2D("flat")), (s2, vedo.Text2D("phong"))], N=3)

2种曲面插值方式

4.2.3 面的剔除

c.backface_culling(value=True)
背面剔除。
c.frontface_culling(value=True)
正面剔除。

绘制实心的图像时,构成图像的多边形,有一部分面向相机可以被看到,另一部分在背后看不到。
如一个正方体,不管相机在哪个方向,最多只能看到它的三个面。
另外三个看不到的面没有必要绘制。将看不到的面剔除(不进行绘制),可以提高程序的效率。

背面剔除和正面剔除的原理是根据多边形的法线相对于相机的方向进行判断和剔除。

# 两个正方体的透明度都是0.5
# 正常正方体
c1 = vedo.Cube(alpha=0.5)
# 背面剔除的正方体
c2 = vedo.Cube(alpha=0.5).backface_culling()
# 正面剔除的正方体
c3 = vedo.Cube(alpha=0.5).frontface_culling()

vedo.show([(c1, vedo.Text2D("normal", s=2)),
           (c2, vedo.Text2D("backface_culling", s=2)),
           (c3, vedo.Text2D("frontface_culling", s=2))], N=3)

背后的多边形本身无法被看到,只有在前面的多边形设置透明度的时候才能发现背后的多边形是否被绘制。
背面剔除和正面剔除
c.backcolor(bc=None)
c.bc(backcolor=None)
设置网格对象背面的颜色。
实际操作无效果。

4.3 纹理

c.texture()
为网格对象设置纹理。可以由图片文件设置或使用预设的纹理。
参数如下:

  • tname,将被应用的纹理。填None会禁用纹理。可以填numpy数组、图片文件路径或vedo的Image对象。
  • tcoords=None,uv纹理坐标数组。也可以写网格对象中现有的数组名称。
  • interpolate=None,渲染时是否开启纹理映射的线性插值。
  • repeat=None,是否在tcoords超过[0,1]范围后,重复纹理。
  • edge_clamp=False,在纹理坐标超过[0,1]范围后,是否开启纹理环绕。只有在repeat=False且显卡支持纹理环绕时才可以用。
  • scale=None,缩放纹理图片;
  • ushift=None,移动纹理的U坐标;
  • vshift=None,移动纹理的V坐标;

vedo提供了17种纹理图片,官网位置:https://vedo.embl.es/examples/data/textures/。
或者去这里下载:https://download.csdn.net/download/qq_42783188/90050775。
展示这些纹理的效果:

# 可以使用url,需要即时下载,慢
# textures_path = vedo.dataurl + 'textures/{}.jpg'
# 使用本地路径很快
textures_path = ".../{}.jpg"
texture_list = [
    'gold', 'grass', 'leather', 'water', 'clouds',
    'white', 'paper1', 'paper2', 'paper3', 'paper4',
    'marble', 'bricks', 'wood1', 'wood2', 'wood3',
    # 'earth0', 'earth1',
]

cubes = []
for t in texture_list:
    # 15种纹理使用立方体展示
    c = vedo.Cube().texture(textures_path.format(t))
    # 2种纹理使用球体展示
    # c = vedo.Sphere().texture(textures_path.format(t))
    txt = vedo.Text2D(t)
    cubes.append((c, txt))

vedo.show(cubes, N=15).close()
# vedo.show(cubes, N=2).close()

15种纹理
2种地球纹理

4.4 相机跟随

c.follow_camera(camera=None, origin=None)
设置物体跟随相机移动的对象。c.follow_camera(False)可以禁用该特性。

比较两种模式:

# 红色的跟随相机移动
c1 = vedo.Cube(c="red")
c1.follow_camera()
# 绿色的不跟随相机移动
c2 = vedo.Cube(c="green")
c2.follow_camera(False)
vedo.show(c1, c2)

绿色正方体被拖拽会改变方向,红色正方体的正面始终朝向相机。
相机跟随


5 ImageVisual

2D图片在场景中的可视化控制。

5.1 图片属性

5.1.1 占用内存大小

c.memory_size()
返回对象的内存占用大小,单位为字节。

5.1.2 颜色标量范围

c.scalar_range()
返回图片的标量范围。

5.2 渲染属性

5.2.1 透明度

c.alpha(a=None)
设置或获取图像在渲染时的透明度。

5.2.2 亮度

c.level(value=None)
获取或设置图像在渲染时的颜色亮度。

5.2.3 对比度

c.window(value=None)
获取或设置图像在渲染时的颜色对比度。

读取一个纹理图片,查看其上述属性并展示:

img = vedo.Image(".../earth1.jpg")
print("memory_size", img.memory_size())
print("scalar_range", img.scalar_range())
print("alpha", img.alpha())
print("level", img.level())
print("window", img.window())
vedo.show(img)
memory_size 1465
scalar_range [  0. 255.]
alpha 1.0
level 127.5
window 255.0

展示2D图片
三个属性alphalevelwindow的效果比较:
alpha属性
level属性
window属性


http://www.kler.cn/a/429084.html

相关文章:

  • postcss插件-实现vw适配
  • springboot多环境配置
  • 技术晋升读书笔记—华为研发
  • 【经济学通识——国债】
  • 【算法】枚举
  • vue3+elementPlus之后台管理系统(从0到1)(day1)
  • 【Python】批量下载抖音视频
  • 通过ThinkPad小红点键盘左右滑动页面
  • OpenCV 图像变换与处理实战
  • 2.Flink的项目初始化和Hello-world
  • 「Mac玩转仓颉内测版47」小学奥数篇10 - 数列求和
  • 电脑无法识别usb设备怎么办?电脑无法识别usb解决方法
  • 基于STM32的DS18B20温度报警器_可调上下限Proteus仿真设计(仿真+程序+设计报告+讲解视频)
  • 鸿蒙ZRouter动态路由框架—服务路由
  • java+springboot+mysql游乐园管理系统
  • 重生之我在学Vue-- Vue3 学习路径总览
  • 生成SSH秘钥文件
  • Python实现ARIMA-LSTM回归模型预测股票价格项目实战
  • 深入了解架构中常见的4种缓存模式及其实现
  • Linux —— 管理文件
  • yolov10 生成json 自动标注
  • 《Python数据分析:活用pandas库》学习笔记Day1:Panda DataFrame基础知识
  • k8s集群环境时间同步
  • Ethernet 系列(10)-- 基础学习::UDP
  • 突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!
  • 【Linux系统】Ubuntu 缓冲区机制