文章目錄
- 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
的效果比較: