开源我的3D库WxGL:40行代码将疫情地图变成三维地球模型

举报
天元浪子 发表于 2021/07/26 22:53:20 2021/07/26
【摘要】 文章目录 1. 前言2. 安装3. 类和方法4. 应用示例 1. 前言 在自己动手写3D库之前,我一直使用VisPy应对三维需求。这是一个高性能的可交互的2D/3D可视化函数库,但在后端显示上,我始终不能得心应手地驾驭它。2019年的元旦假期,我萌生了自己写3D应用库的念头,并立即付诸行动。三周之后,WxGL诞生。WxGL是一个基于PyOpenGL的三维...

1. 前言

在自己动手写3D库之前,我一直使用VisPy应对三维需求。这是一个高性能的可交互的2D/3D可视化函数库,但在后端显示上,我始终不能得心应手地驾驭它。2019年的元旦假期,我萌生了自己写3D应用库的念头,并立即付诸行动。三周之后,WxGL诞生。WxGL是一个基于PyOpenGL的三维数据展示库,以wx为显示后端,以加速渲染为第一追求目标。借助于WxPython这个后端,WxGL可以很好的融合Matplotlib等其他数据展示技术。

2. 安装

我的GitHub上有WxGL模块的完整源码文件,也可以直接使用以下命令安装我已经打包好的whl安装文件,目前的版本是0.5.4,如有必要,我会继续更新。

python -m pip install -i https://test.pypi.org/simple/ wxgl

  
 
  • 1

WxGL依赖PyOpenGL,因此在安装WxGL之前,请先安装PyOpenGL。不过,如果直接使用pip安装的话,可能会有一些麻烦。当初我这样安装之后,运行 OpenGL 代码,得到了这样的错误信息:

NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

  
 
  • 1

原来,pip 默认安装的是32位版本的PyOpenGL,而我的操作系统是64位的。建议点击这里下载适合自己的版本,直接安装.whl文件。最终我是这样安装的:

pip install PyOpenGL-3.1.3b2-cp37-cp37m-win_amd64.whl

  
 
  • 1

3. 类和方法

WxGL的容器名为WxGLScene,我称其为场景。每个场景可以使用addRegion()生成多个WxGLRegion对象,我称其为视区。在视区内可以创建模型,每个模型由一个或多个组件构成——所谓组件,可以理解为子模型。WxGLRegion提供了以下方法创建模型或组件:

  • WxGLRegion.drawText() 绘制文本
  • WxGLRegion.drawPoint() 绘制点
  • WxGLRegion.drawLine() 绘制线段
  • WxGLRegion.drawSurface() 绘制曲面
  • WxGLRegion.drawMesh() 绘制网格
  • WxGLRegion.drawVolume() 绘制体数据
  • WxGLRegion.drawAxes() 绘制坐标
  • WxGLRegion.drawColorBar() 绘制绘制colorBar

4. 应用示例

接下来,我们使用WxGL来演示一下,如何将下面这张全球等经纬投影模式的疫情地图,变成一个可以任意缩放和旋转的三维地球。全部代码,包括注释,刚刚40行。里面用到了一个矢量字库文件,请根据自己的运行环境修改路径。疫情地图,可以下载本文插图,也可以参考我的另一篇博文《Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图》,自行生成更高分辨率的疫情地图。

2019-nCoV疫情地图(全球等经纬投影模式):
在这里插入图片描述

earth_2019nCoV.py

# -*- coding: utf-8 -*-

import wx
import numpy as np
from PIL import Image

from wxgl.scene import *
from wxgl.colormap import *

class mainFrame(wx.Frame): '''程序主窗口类,继承自wx.Frame''' def __init__(self): wx.Frame.__init__(self, None, -1, '地球模型上的2019-nCoV疫情地图', style=wx.DEFAULT_FRAME_STYLE) self.Maximize() # 从等经纬地图上读取经纬度网格上的每一个格点的颜色 c = np.array(Image.open('res/e0.jpg'))/255 # 生成和等经纬地图分辨率一致的经纬度网格,计算经纬度网格上的每一个格点的空间坐标(x,y,z) lats, lons = np.mgrid[np.pi/2:-np.pi/2:complex(0,c.shape[0]), 0:2*np.pi:complex(0,c.shape[1])] x = np.cos(lats)*np.cos(lons) y = np.cos(lats)*np.sin(lons) z = np.sin(lats) self.scene = WxGLScene(self, r"C:\Windows\Fonts\simfang.ttf", bg=[0,0,0,0]) self.scene.setPosture(elevation=0, azimuth=120, save=True) self.master = self.scene.addRegion((0,0,1,1)) self.master.drawMesh('earth', x, y, z, c) self.master.update() class mainApp(wx.App): def OnInit(self): self.Frame = mainFrame() self.Frame.Show() return True

if __name__ == "__main__": app = mainApp() app.MainLoop()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

运行效果如下:
在这里插入图片描述

更为复杂的应用,请参考我的另一篇博文:《wxPython + pyOpenGL,打造三维数据分析的利器》

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/104211044

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。