主頁 >  其他 > 十分鐘玩轉3D繪圖:WxGL完全手冊

十分鐘玩轉3D繪圖:WxGL完全手冊

2020-10-11 04:01:27 其他

文章目錄

  • 1. 前言
    • 1.1 WxGL是什么?
    • 1.2 為什么選擇WxGL?
    • 1.3 安裝和依賴關系
  • 2. 快速體驗
    • 2.1 從正弦曲線開始
    • 2.2 使用2D模式
    • 2.3 子圖布局
    • 2.4 標題和文本
    • 2.5 Colorbar
    • 2.6 顏色的表示
    • 2.7 顏色映射表
  • 3. 互動式繪圖函式
    • 3.1 新建畫布:figure()
    • 3.2 保存畫布為檔案:savefig()
    • 3.3 顯示畫布:show()
    • 3.4 數值顏色映射:cmap()
    • 3.5 添加子圖:subplot()
    • 3.6 繪制點和線:plot()函式
    • 3.7 繪制散點圖:scatter()函式
    • 3.8 繪制mesh:mesh()
    • 3.9 繪制surface:surface()
    • 3.10 繪制圓管:pipe()
    • 3.11 繪制球體:sphere()
    • 3.12 繪制六面體:cube()
    • 3.13 繪制圓柱體:cylinder()
    • 3.14 繪制圓錐體:cone()
    • 3.15 繪制三維等值面:capsule()
    • 3.16 繪制流體:flow()
    • 3.17 繪制標題:title()
    • 3.18 繪制文本:text()
    • 3.19 繪制Colorbar:colorbar()
    • 3.20 繪制網格和刻度:ticks()
  • 4. 應用示例
    • 4.1 surface()函式的應用
      • 4.1.1 扇面
      • 4.1.2 紋理
    • 4.2 mesh()函式的應用
      • 4.2.1 曲面
      • 4.2.2 球面
    • 4.3 三維等值面
    • 4.4 地形圖
    • 4.5 雪花飄飄
  • 5. 與wxPython集成
    • 5.1 WxGLScene API
      • 5.1.1 建構式
      • 5.1.2 設定眼睛與目標點之間的相對關系
      • 5.1.3 恢復初始姿態
      • 5.1.4 保存場景為影像檔案
      • 5.1.5 添加視區
      • 5.1.6 添加子圖
      • 5.1.7 自動旋轉
      • 5.1.8 停止旋轉
    • 5.2 WxGLRegion API
      • 5.2.1 建構式
      • 5.2.2 重置視區
      • 5.2.3 設定坐標軸范圍
      • 5.2.4 洗掉模型
      • 5.2.5 顯示模型
      • 5.2.6 隱藏模型
      • 5.2.7 更新視區顯示
      • 5.2.8 創建紋理物件
      • 5.2.9 繪制2D文字
      • 5.2.10 繪制3D文字
      • 5.2.11 繪制點
      • 5.2.12 繪制線段
      • 5.2.13 繪制曲面
      • 5.2.14 繪制網格
      • 5.2.15 繪制球體
      • 5.2.16 繪制六面體
      • 5.2.17 繪制圓錐體
      • 5.2.18 繪制圓柱體
      • 5.2.19 繪制圓管線
      • 5.2.20 繪制囊(三維等值面)
      • 5.2.21 繪制體資料
      • 5.2.22 繪制坐標軸
      • 5.2.23 繪制colorBar
      • 5.2.24 繪制網格和刻度
      • 5.2.25 隱藏刻度網格
      • 5.2.26 繪制2D網格和刻度
      • 5.2.27 繪制流體
    • 5.3 應用示例

1. 前言

1.1 WxGL是什么?

WxGL是一個基于PyOpenGL的三維資料可視化庫,以wx為顯示后端,提供Matplotlib風格的互動式應用模式,同時,也可以和wxPython無縫結合,在wx的表單上繪制三維模型,

WxGL遵循MIT開源軟體許可協議,任何人都可以使用、復制和修改本軟體,甚至出版發行、再授權以及販售本軟體,唯一的限制是,必須附有MIT授權協議,WxGL的原始碼和本文的示例代碼、資源,都可以從https://github.com/xufive/wxgl下載,

從V0.6.2開始,WxGL新增了互動式繪圖子模塊wxplot,提供類似Matplotlib風格的2D/3D繪圖函式,如果熟悉NumPy和Matplotlib的話,只需要幾分鐘時間就可以學會使用WxGL的互動式繪圖,

1.2 為什么選擇WxGL?

WxGL提供了一套簡潔易用、對用戶友好的API,將OpenGL的復雜概念全部封裝起來,使得用戶可以專注于資料的處理,而無需將更多精力用在3D顯示方面,可以說,WxGL是為實作資料快速可視化而誕生的,下面這個例子可以告訴你,WxGL究竟有多簡潔,

>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> vs = np.array([
    [1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
    [-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1], 
    [-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1], 
    [1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')

前兩行代碼匯入NumPy和WxGL模塊,第3行構造資料,第4行繪制,第5行顯示并增加旋轉效果,只要5行代碼,就可以實作下面的效果,

在這里插入圖片描述

1.3 安裝和依賴關系

和其他的Python模塊一樣,WxGL模塊也使用pip命令安裝,

pip install wxgl

WxGL依賴以下模塊,如果當前運行環境沒有安裝這些模塊,安裝程式將會自動安裝它們,如果安裝程序出現問題,或者安裝完成后無法正常使用,請嘗試手動安裝WxGL的依賴模塊,

  • numpy(推薦版本:1.18.2或更高)
  • scipy(推薦版本:1.4.1或更高)
  • freetype(推薦版本:2.1.0.post1)
  • matplotlib(推薦版本:3.1.2或更高)
  • wxpython(推薦版本:4.0.7.post2或更高)
  • pyopengl(推薦版本:3.1.3b2或更高)

2. 快速體驗

下面例子中用到的繪圖函式,在本文第3部分“互動式繪圖函式”中均有詳細的使用說明,

2.1 從正弦曲線開始

>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> x = np.linspace(0, 2*np.pi, 361)
>>> y = np.sin(x) * 3
>>> plt.plot(x, y)
>>> plt.show()

上面這幾行代碼,畫出了一條正弦曲線,如果忽略模塊名的話,這些代碼和Matplotlib是完全一樣的,除去匯入模塊和資料準備,真正的繪圖陳述句只有最后兩行,執行最后一句show()命令后,將彈出GUI視窗,同時程式將阻塞,直至關閉GUI視窗,

在這里插入圖片描述

2.2 使用2D模式

對于2D資料來說,使用2D模式繪制,看起來會更習慣一點,

>>> theta = np.linspace(0, 2*np.pi, 361)
>>> x = 3 * np.cos(theta)
>>> y = 3 * np.sin(theta)
>>> fig = plt.figure(mode='2D')
>>> plt.plot(x, y)
>>> plt.show()

這段代碼,首先準備繪制圓的資料,然后使用wxplot.figure()生成畫布,同時指定使用2D繪圖模式,

在這里插入圖片描述

2.3 子圖布局

WxGL支持在一張畫布上畫多張子圖,創建子圖的方式也非常類似Matplotlib,下面使用wxplot.sphere()函式繪制兩個球體,

  • 創建子圖方式一:
>>> plt.subplot(121) # 一行兩列的第一個位置
>>> plt.sphere((0,0,0), 3, 'green')
>>> plt.subplot(122) # 一行兩列的第二個位置
>>> plt.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
  • 創建子圖方式二:
>>> ax1 = plt.subplot(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = plt.subplot(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
  • 創建子圖方式三:
>>> fig = plt.figure()
>>> ax1 = fig.add_axes(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = fig.add_axes(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()

上面三種方式創建的子圖,繪制效果是完全一致的,圖中的網格線和標注,是通過點擊工具列上的工具按鈕生成的,再次點擊則可以隱藏,工具列按鈕從左至右,分別是:恢復初始姿態、顯示/隱藏坐標軸、顯示/隱藏網格刻度、設定配色方案、保存為檔案,

在這里插入圖片描述
除了可以接受3位數字的引數外,subplot()和add_axes()還可以接受4元組引數,用來指定子圖左下角在畫布上的位置,以及子圖的寬度和高度,

2.4 標題和文本

和Matplotlib類似,wxplot也提供了title()和text()兩個函式來繪制標題和文本,除了文本內容,這兩個函式還可以接受文本大小、位置、顏色、字體、對齊方式等若干引數,

>>> plt.cube((0,0,0), 3, 'cyan') # 繪制六面體,cyan是顏色,十六進制表示為#00FFFF
>>> plt.sphere((0,0,0), 1.5, 'orange') # 繪制球
>>> plt.cylinder((0,0,-2), (0,0,2), 0.5, 'green') # 繪制圓柱
>>> plt.cone((0,-2,0), (0,2,0), 0.5, 'purple') # 繪制圓錐,purple是顏色,十六進制表示為#F020F0
>>> plt.title('六面體、圓錐、圓柱和球的組合') # 繪制標題
>>> plt.text('這是錐尖', size=40, pos=(0,2,0), align='left') # 繪制文本
>>> plt.show()

繪制六面體、圓錐、圓柱和球的函式將在本文的第3部分給出詳細的API說明,

在這里插入圖片描述

2.5 Colorbar

只需要提供值域范圍、顏色映射表名字,wxplot.colorbar()就可以輕松畫出Colorbar,默認位置在畫布或子圖的右側,使用引數loc可以指定Colorbar的位置,

>>> x, y = np.mgrid[-1:1:20j,-1:1:20j]
>>> z = x*x + y*y
>>> plt.mesh(x, y, z, mode='FLBL', cmap='hsv') # 其實,mesh()函式默認使用的顏色映射表就是hsv
>>> plt.colorbar((z.min(), z.max()), 'hsv') # colorbar()的顏色映射表要和要和繪圖函式一致
>>> plt.show()

這段代碼使用wxplot.mesh()函式畫出了曲面 z = x 2 + y 2 z = x^2 + y^2 z=x2+y2的樣子(x和y取值均在在[-1,1]之間),mesh()函式默認使用的顏色映射表是hsv,因此,colorbar的顏色映射表也使用相同的名字

在這里插入圖片描述

2.6 顏色的表示

表示多個顏色時,WxGL限定使用NumPy陣列,也就是numpy.ndarray型別,顏色陣列的最后一個維度表示顏色通道,可以是RGB模式,也可以是RGBA模式,各個顏色通道的值域范圍在[0,1]之間,

表示單個顏色時,WxGL支持串列、元組或陣列的表示形式(值域范圍限定在[0,1]之間),也支持類似"#FF00FF"的十六進制表示法,此外,WxGL還提供了若干預定義的顏色,使用plt.fig.cm.colors可以查看所有的預定義顏色,

>>> plt.fig.cm.colors
{'red': '#FF0000', 'red_dark': '#C00000', 'green': '#00C000', 'green_dark': '#008000', 'blue': '#0000FF', 'blue_dark': '#0000C0', 'yellow': '#FFFF00', 'orange': '#FFA500', 'purple': '#F020F0', 'purple_dark': '#C000C0', 'cyan': '#00FFFF', 'cyan_dark': '#00C0C0', 'gray': '#C0C0C0', 'dark': '#808080', 'black': '#000000', 'white': '#FFFFFF'}
  • red: #FF0000,紅色
  • red_dark: #C00000,暗紅色
  • green: #00C000,綠色
  • green_dark: #008000,暗綠色
  • blue: #0000FF,藍色
  • blue_dark: #0000C0,暗藍色
  • yellow: #FFFF00,黃色
  • orange: #FFA500,橘色
  • purple: #F020F0,紫色
  • purple_dark: #C000C0,暗紫色
  • cyan: #00FFFF,青色
  • cyan_dark: #00C0C0,暗青色
  • gray: #C0C0C0,淺灰色
  • dark: #808080,深灰色
  • black: #000000,黑色
  • white: #FFFFFF,白色

2.7 顏色映射表

WxGL預定了若干顏色映射方案,使用plt.fig.cm.cms.keys()可以查看所有的預定義顏色映射表,

dict_keys([
    'autumn', 'brg', 'CMRmap', 'cool', 'cubehelix', 
    'gist_earth', 'gist_rainbow', 'gist_stern', 
    'gnuplot', 'gray', 'gray_r', 'hsv', 'jet', 
    'ocean', 'rainbow', 'spring', 'summer', 
    'terrain', 'winter', 'Wistia', 'wind'
])

3. 互動式繪圖函式

wxplot函式自帶完備的檔案說明,只需要使用__doc__查看即可,

3.1 新建畫布:figure()

>>> print(plt.figure.__doc__)
    新建畫布
    Useage: figure(*args, **kwds)
    ----------------------------------------------------
    size        - 畫布解析度,默認800x600
    kwds        - 關鍵字引數
                    head        - 定義方向:'x+'|'y+'|'z+'
                    zoom        - 視口縮放因子
                    mode        - 2D/3D模式
                    elevation   - 仰角
                    azimuth     - 方位角
                    style       - 配色方案,'black'|'white'|'gray'|'blue'

3.2 保存畫布為檔案:savefig()

>>> print(plt.savefig.__doc__)
    保存畫布為檔案
    Useage: savefig(fn, alpha=False)
    ----------------------------------------------------
    fn          - 檔案名
    alpha       - 透明通道開關

3.3 顯示畫布:show()

>>> print(plt.savefig.__doc__)
    顯示畫布
    Useage: show(rotation=None, **kwds)
    ----------------------------------------------------
    rotation    - 旋轉模式
                    None        - 無旋轉
                    'h+'        - 水平順時針旋轉(默認方式)
                    'h-'        - 水平逆時針旋轉
                    'v+'        - 垂直前翻旋轉
                    'v-'        - 垂直后翻旋轉
    kwds        - 關鍵字引數
                    elevation   - 初始仰角,以度(°)為單位,默認值為0
                    azimuth     - 初始方位角以度(°)為單位,默認值為0
                    step        - 幀增量,以度(°)為單位,默認值為5
                    interval    - 幀間隔,以ms為單位,默認值為20

3.4 數值顏色映射:cmap()

>>> print(plt.cmap.__doc__)
    數值顏色映射
    Useage: cmap(data, cm, **kwds)
    ----------------------------------------------------
    data        - 資料
    cm          - 顏色映射表名
    kwds        - 關鍵字引數
                    invalid     - 無效資料的標識
                    invalid_c   - 無效資料的顏色
                    datamax     - 資料最大值,默認為None
                    datamin     - 資料最小值,默認為None
                    alpha       - 透明度,None表示回傳RGB格式

3.5 添加子圖:subplot()

>>> print(plt.subplot.__doc__)
    添加子圖
    Useage: subplot(pos, padding=(20,20,20,20))
    ----------------------------------------------------
    pos         - 子圖在畫布上的位置和大小
                    三位數字    - 指定分割畫布的行數、列數和子圖序號,例如,223表示兩行兩列的第3個位置
                    四元組      - 以畫布左下角為原點,寬度和高度都是1,四元組分別表示子圖左下角在畫布上的水平、垂直位置和寬度、高度
    padding     - 四元組,上、右、下、左四個方向距離邊緣的留白像素

3.6 繪制點和線:plot()函式

>>> print(plt.plot.__doc__)
    繪制點和線
    Useage: plot(xs, ys, zs=None, color=None, size=0.0, width=1.0, style='solid', cmap='hsv', caxis='z')
    ----------------------------------------------------
    xs/ys/zs    - 頂點的x/y/z坐標集,元組、串列或一維陣列型別,長度相等,若zs為None,則自動補為全0的陣列
    color       - 全部或每一個頂點的顏色,None表示使用cmap引數映射顏色
    size        - 頂點的大小,整型或浮點型,若為0,則表示不繪制點,只繪制線
    width       - 線寬,0.0~10.0之間的浮點數,若為0,則表示不繪制線,只繪制點
    style       - 線型
                    'solid'     - 實線
                    'dashed'    - 虛線
                    'dotted'    - 點線
                    'dash-dot'  - 虛點線
    cmap        - 顏色映射表,color為None時有效
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.7 繪制散點圖:scatter()函式

>>> print(plt.scatter.__doc__)
    繪制散點圖
    Useage: scatter(vs, color=None, size=1.0, cmap='hsv', caxis='z')
    ----------------------------------------------------
    vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    size        - 頂點的大小,整型或浮點型
    cmap        - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.8 繪制mesh:mesh()

>>> print(plt.mesh.__doc__)
    繪制mesh
    Useage: mesh(xs, ys, zs, color=None, mode='FCBC', cmap='hsv', caxis='z', light=None)
    ----------------------------------------------------
    xs/ys/zs    - 頂點的x/y/z坐標集,二維陣列
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    cmap        - 顏色映射表,color為None時有效,使用zs映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
    light       - 材質燈光顏色,None表示關閉材質燈光

3.9 繪制surface:surface()

>>> print(plt.surface.__doc__)
    繪制surface
    Useage: surface(vs, color=None, method='Q', mode='FCBC', texture=None, alpha=True, light=None)
    ----------------------------------------------------
    vs          - 頂點坐標集,二維陣列型別,shape=(n,3)
    color       - 頂點顏色或顏色集,可以混合使用紋理,None表示僅使用紋理
    method      - 繪制方法
                    'Q'         - 四邊形
                                    0--3 4--7
                                    |  | |  |
                                    1--2 5--6
                    'T'         - 三角形
                                    0--2 3--5
                                     \/   \/
                                      1    4
                    'Q+'        - 邊靠邊的連續四邊形
                                   0--2--4
                                   |  |  |
                                   1--3--5
                    'T+'        - 邊靠邊的連續三角形
                                   0--2--4
                                    \/_\/_\
                                     1  3  5
                    'F'         - 扇形
                    'P'         - 多邊形
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    texture     - 用于紋理的影像檔案,僅當method為Q時有效
    alpha       - 紋理是否使用透明通道,僅當texture存在時有效
    light       - 材質燈光顏色,None表示關閉材質燈光

3.10 繪制圓管:pipe()

>>> print(plt.pipe.__doc__)
    繪制圓管
    Useage: pipe(vs, radius, color=None, slices=36, mode='FCBC', cmap='hsv', caxis='z')
    ----------------------------------------------------
    vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    radius      - 圓管半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 圓管面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    cmap        - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.11 繪制球體:sphere()

>>> print(plt.sphere.__doc__)
    繪制球體
    Useage: sphere(center, radius, color, slices=60, mode='FLBL')
    ----------------------------------------------------
    center      - 球心坐標,元組、串列或陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 球面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.12 繪制六面體:cube()

>>> print(plt.cube.__doc__)
    繪制六面體
    Useage: cube(center, side, color, mode='FLBL')
    ----------------------------------------------------
    center      - 中心坐標,元組、串列或陣列
    side        - 棱長,整型、浮點型,或長度為3的元組、串列陣列
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.13 繪制圓柱體:cylinder()

>>> print(plt.cylinder.__doc__)
    繪制圓柱體
    Useage: cylinder(v_top, v_bottom, radius, color, slices=60, mode='FCBC')
    ----------------------------------------------------
    v_top       - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
    v_bottom    - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 圓柱面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.14 繪制圓錐體:cone()

>>> print(plt.cone.__doc__)
    繪制圓錐體
    Useage: cone(center, spire, radius, color, slices=60, mode='FCBC')
    ----------------------------------------------------
    center      - 錐底圓心坐標,元組、串列或陣列
    spire       - 錐尖坐標,元組、串列或陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 錐面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.15 繪制三維等值面:capsule()

>>> print(plt.capsule.__doc__)
    繪制囊(三維等值面)
    Useage: capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode='FCBC', **kwds)
    ----------------------------------------------------
    data        - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
    threshold   - 閾值,浮點型
    color       - 表面顏色
    r_x         - x的動態范圍,元組
    r_y         - y的動態范圍,元組
    r_z         - z的動態范圍,元組
    mode        - 顯示模式
                    None        - 使用當前設定
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    kwds        - 關鍵字引數
                    name        - 模型名
                    inside      - 是否更新資料動態范圍
                    visible     - 是否顯示

3.16 繪制流體:flow()

>>> print(plt.flow.__doc__)
    繪制流體
    Useage: flow(ps, us, vs, ws, **kwds)
    ----------------------------------------------------
    ps          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    us          - 頂點u分量集,numpy.ndarray型別,shape=(n,)
    vs          - 頂點v分量集,numpy.ndarray型別,shape=(n,)
    ws          - 頂點w分量集,numpy.ndarray型別,shape=(n,)
    kwds        - 關鍵字引數
                    color       - 軌跡線顏色,None表示使用速度映射顏色
                    actor       - 頂點模型型別,'point'|'line'兩個選項
                    size        - point大小
                    width       - line寬度
                    length      - 軌跡線長度,以速度矢量的模為單位
                    duty        - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
                    frames      - 總幀數
                    interval    - 幀間隔,以ms為單位
                    threshold   - 高通閾值,濾除速度小于閾值的資料點
                    name        - 模型名

3.17 繪制標題:title()

>>> print(plt.title.__doc__)
    繪制標題
    Useage: title(text, size=96, color=None, pos=(0,0,0), **kwds)
    ----------------------------------------------------
    text        - 文本字串
    size        - 文字大小,整形
    color       - 文本顏色,預定義的顏色,或長度為3的串列或元組
    pos         - 文本位置,list或numpy.ndarray型別,shape=(3)
    kwds        - 關鍵字引數
                    align       - left/right/center分別表示左對齊、右對齊、居中(默認)
                    valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
                    family      - (系統支持的)字體
                    weight      - light/bold/normal分別表示字體的輕、重、正常(默認)

3.18 繪制文本:text()

>>> print(plt.text.__doc__)
    繪制文本
    Useage: text(text, size=64, color=None, pos=(0,0,0), **kwds)
    ----------------------------------------------------
    text        - 文本字串
    size        - 文字大小,整形
    color       - 文本顏色,預定義的顏色,或長度為3的串列或元組
    pos         - 文本位置,list或numpy.ndarray型別,shape=(3)
    kwds        - 關鍵字引數
                    align       - left/right/center分別表示左對齊、右對齊、居中(默認)
                    valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
                    family      - (系統支持的)字體
                    weight      - light/bold/normal分別表示字體的輕、重、正常(默認)

3.19 繪制Colorbar:colorbar()

>>> print(plt.colorbar.__doc__)
    繪制colorbar
    Useage: colorbar(drange, cmap, loc, **kwds)
    ----------------------------------------------------
    drange      - 值域范圍,tuple型別
    cmap        - 調色板名稱
    loc         - 位置,top|bottom|left|right
    kwds        - 關鍵字引數
                    length          - ColorBar所在視區的長邊長度,默認短邊長度為1
                    subject         - 標題
                    subject_size    - 標題字號
                    label_size      - 標注字號
                    label_format    - 標注格式化所用lambda函式
                    tick_line       - 刻度線長度
                    endpoint        - 刻度是否包含值域范圍的兩個端點值
                    name            - 模型名
                    inside          - 是否資料動態范圍
                    visible         - 是否顯示

3.20 繪制網格和刻度:ticks()

>>> print(plt.ticks.__doc__)
    繪制網格和刻度
    Useage: subplot(**kwds)
    ----------------------------------------------------
    kwds        - 關鍵字引數
                    segment_min     - 標注最少分段數量
                    segment_max     - 標注最多分段數量
                    label_2D3D      - 標注試用2D3D文字
                    label_size      - 標注字號
                    xlabel_format   - x軸標注格式化所用lambda函式
                    ylabel_format   - y軸標注格式化所用lambda函式
                    zlabel_format   - z軸標注格式化所用lambda函式

4. 應用示例

雖然前面給出了很多幾何體的繪制函式,但三維繪圖絕不只是繪制規則的幾何體,而是要表現紛繁復雜的現實的和虛擬的空間,在三維繪圖函式中,最重要、最常用、同時也是最難以理解的是surface()函式和mesh()函式,

4.1 surface()函式的應用

OpenGL總共有10種圖元繪制方法,如下表所示,其中的前4種方式用于繪制點和線,后6種方式用于繪制面,surface()函式整合了后面的6種圖元繪制方法,使用method引數可以指定繪制方法(詳見3.9節),

引數說明
GL_POINTS繪制一個或多個頂點
GL_LINES繪制線段
GL_LINE_STRIP繪制連續線段
GL_LINE_LOOP繪制閉合的線段
GL_POLYGON繪制多邊形
GL_TRIANGLES繪制一個或多個三角形
GL_TRIANGLE_STRIP繪制連續三角形
GL_TRIANGLE_FAN繪制多個三角形組成的扇形
GL_QUADS繪制一個或多個四邊形
GL_QUAD_STRIP繪制連續四邊形

4.1.1 扇面

使用原生的OpenGL繪圖時,通常需要先準好一組頂點,然后指定使用哪一種方式繪制,這里邊暗含著頂點順序的重要性,以畫扇面為例,需要在15°到165°之間生成弧線上的一組點,假設扇面在 y o z yoz yoz平面上,這些點的x坐標則上下交替,將扇面的圓心點(0,0,0)加到剛才生成的一組點的起始位置,也就是第1個頂點,

>>> theta = np.linspace(np.pi/12, 11*np.pi/12, 21) # 在15°到165°之間生成21個點
>>> y = np.cos(theta) * 10 # 弧線上點的y坐標
>>> z = np.sin(theta) * 10 # 弧線上點的y坐標
>>> x = np.array([i%2-0.5 for i in range(21)]) # 弧線上點的x坐標,上下交替
>>> vs = np.stack((x,y,z), axis=1) # 組合成頂點坐標,此時vs的shape是(21,3)
>>> vs = np.vstack((np.array([0,0,0]), vs)) # 將原點加到vs的首位,此時vs的shape是(22,3)

繪制扇面,就是繪制連續三角形,第1個三角形由頂點1、頂點2、頂點3組成,第2個三角形由頂點1、頂點3、頂點4組成,……,以此類推,

>>> cs = plt.cmap(vs[:,0], 'wind') # 將x的值映射為顏色,使用wind映射表
>>> plt.surface(vs, color=cs, method='F', mode='FLBC')
>>> plt.show(rotation='h+')

這里surface()函式,引數method為’F’,也就是GL_TRIANGLE_FAN的方法,繪制多個三角形組成的扇形;引數mode為’FLBC’,意為前面渲染線條后面渲染顏色,呈現出前后不同的視覺效果,show()函式也使用了自動旋轉引數(詳見3.3節),
在這里插入圖片描述

4.1.2 紋理

surface()函式支持使用紋理,使用默認引數的話,只需要傳入紋理圖片路徑就可以了,

>>> vs = np.array([
    [1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
    [-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1], 
    [-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1], 
    [1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')

如果你有女朋友的照片,只需要三行代碼就可以做一個這樣的禮物送給她了,要是你有多位女朋友也沒關系,你可以每4個頂點呼叫一次surface()函式,最多可以將6位女朋友的照片貼到一個六面體上,不過,多位女朋友照片組成的六面體,只能自己欣賞,不適合送給女朋友哦,你若因此被某位女朋友揍得鼻青臉腫,可別怪我沒有提前警告過你,

在這里插入圖片描述

4.2 mesh()函式的應用

mesh()函式也是用來繪制曲面的,它和surface()函式的不同之處在于,mesh()函式的頂點是基于一個假象的二維網格,surface()函式需要傳入一組頂點,mesh()函式則需要分別傳入一組頂點的x、y、z坐標,并且對應著假象的二維網格的x、y、z坐標, mesh()函式之所以令人困惑,是因為這個假象的二維網格有時候是真正的資料是重合的,

4.2.1 曲面

先生成一個二維網格的x坐標和y坐標,

>>> y, x = np.mgrid[-2:2:50j,-2:2:50j]
>>> x.shape
(50, 50)
>>> y.shape
(50, 50)

顯然,這是一個50x50的二維網格,x和y的值域范圍都是 [ ? 2 , 2 ] [-2,2] [?2,2],分別令網格的每個點的z坐標都是0,以及 z = 2 x e ? ( x 2 + y 2 ) z=2xe^{-(x^2+y^2)} z=2xe?(x2+y2),繪制兩個曲面,

>>> z1 = np.zeros_like(x)
>>> z2 = 2*x*np.exp(-x**2-y**2)
>>> ax1 = plt.subplot(121)
>>> ax1.mesh(x, y, z1, mode='FLBL')
>>> ax2 = plt.subplot(122)
>>> ax2.mesh(x, y, z2, mode='FLBC')
>>> plt.show()

左側網格和假象的網格是一致的,右側則是我們真正想要繪制的網格

在這里插入圖片描述

4.2.2 球面

先生成球面資料,

>>> lats, lons = np.mgrid[-np.pi/2:np.pi/2:91j, 0:2*np.pi:181j]
>>> xs = np.cos(lats)*np.cos(lons)
>>> ys = np.cos(lats)*np.sin(lons)
>>> zs = np.sin(lats)
>>> xs.shape, ys.shape, zs.shape
((91, 181), (91, 181), (91, 181))

這里,xs、ys、zs分別是球面上點的x、y、z坐標集,同時又都是二維的陣列,對應著一個假象的二維網格,

>>> plt.mesh(xs, ys, zs, color=(0,1,0), light=(0,1,0))
>>> plt.show()

因為使用了燈光引數,所以繪制出的球面有亮暗變化,效果如下,

在這里插入圖片描述
如果將假象的網格視為如下所示的等經緯地圖,就可以將這張圖映射到球面上,

在這里插入圖片描述
地圖的解析度是1000x500,因此假象的網格也是1000x500的解析度,

lats, lons = np.mgrid[-np.pi/2:np.pi/2:500j, 0:2*np.pi:1000j]
xs = np.cos(lats)*np.cos(lons)
ys = np.cos(lats)*np.sin(lons)
zs = np.sin(lats)
im = Image.open(=r'example\res\earth.png')
cs = np.array(im)/255 # 影像顏色值域范圍是[0,255],需要變為[0,1]
plt.mesh(xs, ys, zs, color=cs[::-1]) # 顏色逆序
plt.show(rotation='h-')

我們假象的網格,北極為+90°,南極為-90°,從上而下是遞減的,而上面的地圖資料,行號從上而下是遞增的,因此在傳參是需要逆序,最終效果如下圖所示,

在這里插入圖片描述

4.3 三維等值面

先來構造一個30層高、水平解析度是50x50的資料體,每個格點的資料隨機生成;然后在其中隱藏一個空心圓椎面,設定圓椎面上的格點值為10,

>>> theta = np.linspace(0, 2*np.pi, 180)
>>> _x = np.cos(theta)
>>> _y = np.sin(theta)
>>> data = np.random.random((30,50,50))
>>> for i in range(30):
>>> 	x = _x*i/2 + 25
>>> 	x = x.astype(np.int)
>>> 	y = _y*i/2 + 25
>>> 	y = y.astype(np.int)
>>> 	data[i][(x,y)] = 10

呼叫capsule()函式,即可從資料體找出資料值為10的等值面,

plt.capsule(data, 10, '#C020C0', r_x=(0,50), r_y=(0,50), r_z=(0,30), mode='FCBC')
plt.show()

如果資料體解析度足夠高,等值面就會足夠光滑,

在這里插入圖片描述

4.4 地形圖

從網上可以下載到地形地貌資料,這些資料一般包括經度資料集、緯度資料集、高度資料集和地貌資料集,landforms.npz保存了濟南地區(東經116.65°-117.65°、北緯36.25°-37.00°)的地形地貌資料,使用np.load()可以直接加載,

>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> plt.show()

高度資料的單位是米,經緯度的單位是度,每度相當于100千米,因此高度資料需要除以100000,這里只除以50000,是為了有更好的視覺效果,地貌資料的值域范圍是[0,255],除以255變成[0,1],下圖中濟南市北部(下方)的黃河、南部(上方)的群山都清晰可見,

在這里插入圖片描述

4.5 雪花飄飄

WxGL嘗試使用flow()函式展示粒子系統的部分功能,并使用了可編程管線技術(但并未開放介面),下面的代碼,前半部分是地形繪制,然后在4500米~5000米的高度上隨機生成了500個雪花初始點,并使用u/v/w分量形式指定雪花的降落速度,最后使用flow()函式繪制出雪花飄落的樣子,使用flow()函式需要仔細斟酌各個引數,具體細節詳見3.16節,

>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> x = 116.65 + np.random.random(500) * (117.65-116.65) # 隨機生成500個雪花點x坐標
>>> y = 36.25 + np.random.random(500) * (37.00-36.25) # 隨機生成500個雪花點y坐標
>>> z = 4500 + np.random.random(500) * 500 # 隨機生成500個雪花點z坐標(4500米~5000米)
>>> vs = np.stack((x,y,z/10000), axis=1) # 合并成500個頂點坐標
>>> u = np.sin(3*x) # 雪花在東西方的速度分量
>>> v = np.cos(4*y) # 雪花在南北方的速度分量
>>> w = -10 - np.random.random(500)  # 雪花垂直方向的速度分量
>>> plt.flow(vs, u/100, v/100, w/100, length=4, frames=30, interval=50, color=(0.8,0.8,0.8), actor='point', size=3)
>>> plt.ticks(zlabel_format=lambda z:'%0.1fkm'%(z*10))
>>> plt.show()

需要特別指出,這段代碼還使用了ticks()函式設定網格和標注,ticks()函式接受lambda函式作為坐標軸標注的格式化函式,這里僅演示了如何格式化z軸的標注,

在這里插入圖片描述

5. 與wxPython集成

WxGL的容器名為WxGLScene,稱為場景,WxGLScene是wx.glcanvas.GLCanvas的派生類,因此WxGL和wxPython的集成是天然無縫的,不存在任何障礙,

每個場景可以使用add_region()生成多個WxGLRegion物件,稱為視區,在視區內可以創建模型,每個模型由一個或多個組件構成——所謂組件,可以理解為子模型,

5.1 WxGLScene API

5.1.1 建構式

WxGLScene.__init__(parent, head=‘z+’, zoom=1.0, proj=‘cone’, mode=‘3D’, style=‘black’, **kwds)

parent      - 父級視窗物件
head        - 觀察者頭部的指向,字串
				'x+'        - 頭部指向x軸正方向
				'y+'        - 頭部指向y軸正方向
				'z+'        - 頭部指向z軸正方向
zoom        - 視口縮放因子
proj        - 投影模式,字串
				'ortho'     - 平行投影
				'cone'      - 透視投影
mode        - 2D/3D模式,字串
style       - 場景風格
				'black'     - 背景黑色,文本白色
				'white'     - 背景白色,文本黑色
				'gray'      - 背景淺灰色,文本深藍色
				'blue'      - 背景深藍色,文本淡青色
kwds        - 關鍵字引數
				elevation   - 仰角
				azimuth     - 方位角

5.1.2 設定眼睛與目標點之間的相對關系

WxGLScene.set_posture(elevation=None, azimuth=None, dist=None, save=False)

elevation   - 仰角(度)
azimuth     - 方位角(度)
dist        - 相機位置與目標點位之間的距離
save        - 是否保存相機姿態

5.1.3 恢復初始姿態

WxGLScene.reset_posture()

無引數

5.1.4 保存場景為影像檔案

WxGLScene.save_scene(fn, alpha=True, buffer=‘FRONT’)

fn          - 保存的檔案名
alpha       - 是否使用透明通道
buffer      - 顯示緩沖區,默認使用前緩沖區(當前顯示內容)

5.1.5 添加視區

WxGLScene.add_region(box, fixed=False)

box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed       - 是否鎖定旋轉縮放

5.1.6 添加子圖

WxGLScene.add_axes(pos, padding=(20,20,20,20))

pos         - 三個數字組成的字串或四元組,表示子圖在場景中的位置和大小
padding     - 四元組,上、右、下、左四個方向距離邊緣的留白像素

5.1.7 自動旋轉

WxGLScene.auto_rotate(rotation=‘h+’, **kwds)

rotation    - 旋轉模式
				'h+'        - 水平順時針旋轉(默認方式)
				'h-'        - 水平逆時針旋轉
				'v+'        - 垂直前翻旋轉
				'v-'        - 垂直后翻旋轉
kwds        - 關鍵字引數
				elevation   - 初始仰角,以度(°)為單位,默認值為0
				azimuth     - 初始方位角以度(°)為單位,默認值為0
				step        - 幀增量,以度(°)為單位,默認值為5
				interval    - 幀間隔,以ms為單位,默認值為20

5.1.8 停止旋轉

WxGLScene.stop_rotate()

無引數

5.2 WxGLRegion API

5.2.1 建構式

WxGLRegion.__init__(scene, rid, box, fixed=False)

scene       - 所屬場景物件
rid         - 唯一標識
box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed       - 是否鎖定旋轉縮放

5.2.2 重置視區

WxGLRegion.reset_box(box, clear=False)

box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
clear       - 是否清空所有模型

5.2.3 設定坐標軸范圍

WxGLRegion.set_data_range(r_x=None, r_y=None, r_z=None)

r_x         - 二元組,x坐標軸范圍
r_y         - 二元組,y坐標軸范圍
r_z         - 二元組,z坐標軸范圍

5.2.4 洗掉模型

WxGLRegion.delete_model(name)

name        - 模型名

5.2.5 顯示模型

WxGLRegion.show_model(name)

name        - 模型名

5.2.6 隱藏模型

WxGLRegion.hide_model(name)

name        - 模型名

5.2.7 更新視區顯示

WxGLRegion.refresh()

無引數

5.2.8 創建紋理物件

WxGLRegion.create_texture(img, alpha=True)

img         - 紋理圖片檔案名或資料
alpha       - 是否使用透明通道

5.2.9 繪制2D文字

WxGLRegion.text2d(text, size=32, color=None, pos=[0,0,0], **kwds)

text        - 文本字串
size        - 文字大小,整型
color       - 文本顏色
				None表示使用場景物件scene的style風格提供的文本顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
pos         - 文本位置,元組、串列或numpy陣列
kwds        - 關鍵字引數
				align       - 兼容text3d(),并無實際意義
				valign      - 兼容text3d(),并無實際意義
				family      - (系統支持的)字體
				weight      - light/bold/normal分別表示字體的輕、重、正常(默認)
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.10 繪制3D文字

WxGLRegion.text3d(text, size=32, color=None, pos=[0,0,0], **kwds)

text        - 文本字串
size        - 文字大小,整型
color       - 文本顏色
				None表示使用場景物件scene的style風格提供的文本顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
pos         - 文本位置,元組、串列或numpy陣列
kwds        - 關鍵字引數
				align       - left/right/center分別表示左對齊、右對齊、居中(默認)
				valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
				family      - (系統支持的)字體
				weight      - light/bold/normal分別表示字體的輕、重、正常(默認)
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.11 繪制點

WxGLRegion.point(vs, color, size=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
size        - 點的大小,整數,None表示使用當前設定
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式

5.2.12 繪制線段

WxGLRegion.line(vs, color, method=‘SINGLE’, width=None, stipple=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
method      - 繪制方法
				'MULTI'     - 線段
				'SINGLE'    - 連續線段
				'LOOP'      - 閉合線段
width       - 線寬,0.0~10.0之間,None表示使用當前設定
stipple     - 線型,整數和兩位元組十六進制整陣列成的元組,形如(1,0xFFFF),None表示使用當前設定
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式

5.2.13 繪制曲面

WxGLRegion.surface(vs, color=None, texcoord=None, texture=None, method=‘Q’, mode=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				None表示僅使用紋理
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(n,3|4)
texcoord    - 頂點的紋理坐標集,numpy.ndarray型別,shape=(n,2)
texture     - 2D紋理物件
method      - 繪制方法
				'Q'         - 四邊形
								0--3 4--7
								|  | |  |
								1--2 5--6
				'T'         - 三角形
								0--2 3--5
								 \/   \/
								  1    4
				'Q+'        - 邊靠邊的連續四邊形
							   0--2--4
							   |  |  |
							   1--3--5
				'T+'        - 邊靠邊的連續三角形
							   0--2--4
								\/_\/_\
								 1  3  5
				'F'         - 扇形
				'P'         - 多邊形
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式
				light       - 材質燈光顏色,None表示關閉材質燈光

5.2.14 繪制網格

WxGLRegion.mesh(xs, ys, zs, color, method=‘Q’, mode=None, **kwds)

xs          - 頂點集的x坐標集,numpy.ndarray型別,shape=(rows,cols)
ys          - 頂點集的y坐標集,numpy.ndarray型別,shape=(rows,cols)
zs          - 頂點集的z坐標集,numpy.ndarray型別,shape=(rows,cols)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
method      - 繪制方法:
				'Q'         - 四邊形
				'T'         - 三角形
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				blc         - 邊框的顏色,None表示無邊框
				blw         - 邊框寬度
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式
				light       - 材質燈光顏色,None表示關閉材質燈光

5.2.15 繪制球體

WxGLRegion.sphere(center, radius, color, mode=‘FLBL’, slices=60, **kwds)

center      - 球心坐標,元組、串列或numpy陣列
radius      - 半徑,浮點型
color       - 表面顏色
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
slices      - 錐面分片數(數值越大越精細)
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.16 繪制六面體

WxGLRegion.cube(center, side, color, mode=‘FLBL’, **kwds)

center      - 中心坐標,元組、串列或numpy陣列
side        - 棱長,整型、浮點型,或長度為3的元組、串列、numpy陣列
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.17 繪制圓錐體

WxGLRegion.cone(center, spire, radius, color, slices=50, mode=‘FCBC’, **kwds)

center      - 錐底圓心坐標,元組、串列或numpy陣列
spire       - 錐尖坐標,元組、串列或numpy陣列
radius      - 錐底半徑,浮點型
color       - 圓錐顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
slices      - 錐面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.18 繪制圓柱體

WxGLRegion.cylinder(v_top, v_bottom, radius, color, slices=50, mode=‘FCBC’, **kwds)

v_top       - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
v_bottom    - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
radius      - 圓柱半徑,浮點型
color       - 圓柱顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(2,3|4)
slices      - 圓柱面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				headface    - 是否顯示圓柱端面
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.19 繪制圓管線

WxGLRegion.pipe(vs, radius, color, slices=36, mode=‘FCBC’, **kwds)

vs          - 圓管中心點坐標集,numpy.ndarray型別,shape=(n,3)
radius      - 圓管半徑,浮點型
color       - 圓管顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(n,3|4)
slices      - 圓管面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.20 繪制囊(三維等值面)

WxGLRegion.capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode=‘FLBL’, **kwds)

data        - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
threshold   - 閾值,浮點型
color       - 表面顏色
r_x         - x的動態范圍,元組
r_y         - y的動態范圍,元組
r_z         - z的動態范圍,元組
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.21 繪制體資料

WxGLRegion.volume(data, x=None, y=None, z=None, method=‘Q’, **kwds)

data        - 頂點的顏色集,numpy.ndarray型別,shape=(layers,rows,cols,4)
x           - 頂點的x坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的2軸索引構造
y           - 頂點的y坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的1軸索引構造
z           - 頂點的z坐標集,numpy.ndarray型別,shape=(layers,),預設則使用volume的0軸索引構造
method      - 繪制方法:
				'Q'         - 四邊形
				'T'         - 三角形
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.22 繪制坐標軸

WxGLRegion.coordinate(length=1.0, xlabel=None, ylabel=None, zlabel=None, **kwds)

length      - 坐標軸半軸長度,從-length到length
xlabel      - x軸標注
ylabel      - y軸標注
zlabel      - z軸標注
kwds        - 關鍵字引數
				half        - 是否畫半軸
				slices      - 錐面分片數(數值越大越精細)
				label_size  - 標注文本的字號
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.23 繪制colorBar

WxGLRegion.colorbar(drange, cmap, loc=‘right’, **kwds)

drange      - 值域范圍,tuple型別
cmap        - 調色板名稱
loc         - 位置,top|bottom|left|right
kwds        - 關鍵字引數
				length          - ColorBar所在視區的長邊長度,默認短邊長度為1
				subject         - 標題
				subject_size    - 標題字號
				label_size      - 標注字號
				label_format    - 標注格式化所用lambda函式
				tick_line       - 刻度線長度
				endpoint        - 刻度是否包含值域范圍的兩個端點值
				name            - 模型名
				inside          - 是否更新資料動態范圍
				visible         - 是否顯示

5.2.24 繪制網格和刻度

WxGLRegion.ticks(**kwds)

kwds        - 關鍵字引數
				segment_min     - 標注最少分段數量
				segment_max     - 標注最多分段數量
				label_2D3D      - 標注試用2D或3D文字
				label_size      - 標注字號
				xlabel_format   - x軸標注格式化所用lambda函式
				ylabel_format   - y軸標注格式化所用lambda函式
				zlabel_format   - z軸標注格式化所用lambda函式

5.2.25 隱藏刻度網格

WxGLRegion.hide_ticks()

無引數

5.2.26 繪制2D網格和刻度

WxGLRegion.ticks2d(**kwds)

kwds        - 關鍵字引數
				segment_min     - 標注最少分段數量
				segment_max     - 標注最多分段數量
				label_2D3D      - 標注試用2D或3D文字
				label_size      - 標注字號
				xlabel_format   - x軸標注格式化所用lambda函式
				ylabel_format   - y軸標注格式化所用lambda函式

5.2.27 繪制流體

WxGLRegion.flow(ps, us, vs, ws, **kwds)

ps          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
us          - 頂點u分量集,numpy.ndarray型別,shape=(n,)
vs          - 頂點v分量集,numpy.ndarray型別,shape=(n,)
ws          - 頂點w分量集,numpy.ndarray型別,shape=(n,)
kwds        - 關鍵字引數
				color       - 軌跡線顏色,None表示使用速度映射顏色
				actor       - 頂點模型型別,'point'|'line'兩個選項
				size        - point大小
				width       - line寬度
				length      - 軌跡線長度,以速度矢量的模為單位
				duty        - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
				frames      - 總幀數
				interval    - 幀間隔,以ms為單位
				threshold   - 高通閾值,濾除速度小于閾值的資料點
				name        - 模型名

5.3 應用示例

代碼部分請從GitHub下載,這里只給出一個界面截圖,

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/167245.html

標籤:其他

上一篇:python中class(類)的使用,類的教程,類中的函式怎么呼叫。

下一篇:一文教你用Spider制作簡易的翻譯工具

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more