文章目录
- 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个基类
MeshVisual
、
ImageVisual
封装的方法做学习和测试。
MeshVisual
是网格对象
Mesh
的基类,几乎所有的3D立体图形都是
Mesh
或是它的子类。
ImageVisual
是
Image
的基类,在需要往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)
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()
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
三个属性alpha
、level
、window
的效果比较: