《Python数据可视化编程实战》——5.5 用OpenGL制作动画

5.5 用OpenGL制作动画

使用OpenGL的动机来源于CPU处理能力的限制,限制体现在当我们面临一项要可视化成千上万个数据点的工作,并且要求其快速执行(有时甚至是实时的)的时候。

现代计算机拥有强大的GPU用于加速与可视化相关的计算(比如游戏)。它们没有理由不能用于科学相关的可视化。

实际上,编写硬件加速的软件至少有一个缺点。就硬件的依赖而言,现代图形卡要求有专有的驱动,有时候驱动在目标平台/机器(例如用户的笔记本)上是无法使用的;即使是可用的,有时候你也不想呆在那花大把的时间去安装驱动所依赖的软件,相反,你想把时间花费在展示你的发现,并演示你的研究成果上。虽然这并不会成为编写硬件加速软件的障碍,但是你还是需要考虑一下这件事情,并且衡量一下在项目中引入这个复杂性的成本和收益。

解释完缺点后,我们可以对硬件加速可视化说“是”,可以对OpenGL,这一图形加速的工业标准说“是”。

我们将使用OpenGL来完成本节的内容,因为它是跨平台的,因此所有的例子应该在Linux、Mac或者Windows上都是工作的,就像我们所演示的那样。这里假定你已经安装了所需的硬件和操作系统级别的驱动。

5.5.1 准备工作

如果你从来没有使用过OpenGL,现在我们将做一个快速的介绍来帮助你理解。但是要真正的了解OpenGL,至少要阅读并理解一整本书。OpenGL是一个规范,而不是一个实现,因此OpenGL本身并没有任何实现代码,所有的实现是遵循该规范而开发的库。这些库是跟随你的操作系统,或者由如NVIDIA或者AMD/ATI等不同的显卡厂商发布的。

此外,OpenGL只关注图形渲染而不是动画、定时和其他复杂的事情,这些事情是留给其他库来完成的。

 OpenGL动画基础

因为OpenGL是一个图形渲染库,所以它不知道我们在屏幕上绘制的是什么。它不关心我们画的是否是一只猫、一个球,或者一条线,还是所有这些对象。因此,要移动一个已经渲染的对象,需要清除并重绘整个图像。为了让某个物体动起来,我们需要很快地循环绘制和重绘所有内容,并把它显示给用户,这样用户就认为他/她正在观看一个动画。

在机器上安装OpenGL是一件和平台相关的过程。在Mac OS X上,OpenGL的安装通过系统升级来完成,但是开发库(所谓的“头文件”)是Xcode开发包的一部分。

在Windows系统上,最好的方式是安装电脑的显卡厂商的最新显卡驱动程序。OpenGL可能并不需要它们就可以工作,但那样的话你就很可能失去了原版驱动程序的最新特性。

在Linux平台上,如果你不反对安装闭源软件,在操作系统发行版自身的软件管理器中,或者显卡厂商网站上的二进制安装文件,都提供了可供下载的特定厂商的驱动。Mesa3D几乎一直都是OpenGL的标准实现,它也是最有名的OpenGL实现,使用Xorg来为Linux、FreeBSD和类似操作系统的OpenGL提供支持。

基本上,在Debian/Ubuntu系统中,应当安装下列软件包及其依赖。

$ sudo apt-get install libgl1-mesa-dev libgl-mesa-dri

然后,你就可以使用一些开发库和/或者框架来实际地编写OpenGL支持的应用程序了。

我们在这里只关注Python中的OpenGL绘图,因此我们将回顾在Python中使用最多的一些构建在OpenGL之上的库和框架。我们会提到matplotlib及其当前和将来对OpenGL的支持。

  • Mayavi:这是一个专门用于3D的库。
  • Pyglet:这是一个纯Python的图形库。
  • Glumpy:这是一个构建在Numpy之上的快速图形渲染库。
  • Pyglet和OpenGL:这是用来可视化大数据(百万级数据点)的。

5.5.2 操作步骤

专业化的项目Mayavi是一个功能全面的3D图形库,它主要用于高级3D渲染。它包含在已经提到的 Python包中,如EPD(虽然没有免费许可)。这也是在Windows和Mac OS X操作系统上的推荐安装方式。在Linux平台上,也可以通过pip轻松地安装,代码如下。

$ pip install mayavi

Mayavi可以作为一个开发库/框架,或者一个应用程序来使用。Mayavi应用程序包含了一个可视化编辑器,可以用于简单的数据研究和一些交互可视化。

作为一个图形库,Mayavi的用法和matplotlib相似。它可以从一个脚本接口中,或者作为一个完全的面向对象的库来使用。Mayavi的大多数接口在mlab模块中,可以使用它们来制作动画。例如,可以像下面代码那样来完成一个简单的Mayavi动画。

import numpy
from mayavi.mlab import *

# Produce some nice data.
n_mer, n_long = 6, 11
pi = numpy.pi
dphi = pi/1000.0
phi = numpy.arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')
mu = phi*n_mer
x = numpy.cos(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5)
y = numpy.sin(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5)
z = numpy.sin(n_long*mu/n_mer)*0.5
# View it.
l = plot3d(x, y, z, numpy.sin(mu), tube_radius=0.025,
colormap='Spectral')

# Now animate the data.
ms = l.mlab_source
for i in range(100):
     x = numpy.cos(mu)*(1+numpy.cos(n_long*mu/n_mer +
                                              numpy.pi*(i+1)/5.)*0.5)
     scalars = numpy.sin(mu + numpy.pi*(i+1)/5)
     ms.set(x=x, scalars=scalars)

上述代码将生成如图5-5所示的带旋转图形的窗口。

5.5.3 工作原理

我们生成了数据集合,并创建了x、y和z三个函数。这些函数被用在plot3d函数中作为图形的起始位置。

然后,导入mlab_source对象,以便能在点和标量的级别上操作图形。然后使用这个特性在循环中设置特定的点和标量来创建一个100帧的旋转动画。

5.5.4 补充说明

如果你想实验更多的内容,最简单的方式是打开IPython,导入myayvi.lab,并运行一些名字为test_*的函数。

为了了解到底发生了什么,你可以借助IPython的功能来检查和研究Python源码,像下面代码显示的这样。

In [1]: import mayavi.mlab

In [2]: mayavi.mlab.test_simple_surf??

Type: function
String Form:<function test_simple_surf at 0x641b410>
File:/usr/lib/python2.7/dist-packages/mayavi/tools/helper_
functions.py
Definition: mayavi.mlab.test_simple_surf()
Source:
def test_simple_surf():
    """Test Surf with a simple collection of points."""
    x, y = numpy.mgrid[0:3:1,0:3:1]
    return surf(x, y, numpy.asarray(x, 'd'))

这里,我们看到如何通过在函数名后面添加两个问号(“??”)让IPython找到函数的源码并显示。这是一个真实的探索性计算,经常在可视化社区中被使用,因为它是了解数据和代码的一个快速的方式。

Pyglet快速入门

Pyglet是另一个著名的Python库,可以让编写图形和与窗口相关的应用程序变得轻松起来。它通过模块pyglet.gl来支持OpenGL,但是为了能使用Pyglet的威力你不必直接使用这个模块。通过pyglet.graphics来使用它是最方便的用法。

Pyglet采用了一种和Mayavi不同的方式。它没有可视化的IDE,你要负责从创建窗口,到发出一个低级别的OpenGL调用来配置OpenGL上下文环境的所有工作。它有时比Mayavi慢,但是你所获得的是控制应用程序的每个部分的能力。这有时候也意味着会投入更多的工作时间,但是通常来讲,它也意味着你的应用程序有更高的质量和性能。

可以通过下面的代码来得到一个简单的应用程序(图像查看器)。

import pyglet

window = pyglet.window.Window()
image = pyglet.resource.image('kitten.jpg')

@window.event
def on_draw():
     window.clear()
     image.blit(0, 0)
pyglet.app.run()

上述代码创建了一个窗口,加载了一幅图像,并指定了当我们绘制一个窗口对象时所发生的事件(换言之,我们为on_draw事件定义了一个事件处理器)。最后,运行我们的程序(piglet.app.run())。

在实现的内部,程序使用OpenGL在窗口上进行绘制。此接口可以从pyglet.gl模块获得。然而直接使用它是不高效的,因此pyglet在pyglet.graphics中提供了一个更简单的接口,在这个接口内部使用了顶点数组(vertex arrays)和缓冲区(buffers)。

Glumpy快速入门

Glumpy是一个OpenGL+NumPy库,它用OpenGL来进行快速Numpy可视化。它是一个由Nicolas Rougier启动的开源项目,致力于高效可视化。为了使用它,我们需要Python OpenGL绑定(bindings)、SciPy,当然还有Glumpy。安装命令如下。

sudo apt-get install python-opengl
sudo pip install scipy
sudo pip install glumpy

Glumpy使用OpenGL纹理(textures)来表示阵列,因为这恐怕是在现代图形硬件上最快的可视化方法了。
Pyprocessing 简介

Pyprocessing和Processing(http://processing.org )的工作方式极其相似。Pyprocessing中的大多数函数和Processing函数是相同的。如果你熟悉Processing和Python,你就已经知道了编写Pyprocessing程序所需的几乎所有知识。为了使用它,我们唯一需要做的事情是导入pyprocessing包,用Pyprocessing函数和数据结构来编写剩余的代码,然后调用run()函数来执行。

有很多关于OpenGL以及如何在C/C++或者任何其他语言binding中使用它的免费教程。在OpenGL官方wiki上提供了一个清单,地址为http://www.opengl.org/wiki/Getting_started#Tutorials_and_How_To_Guides

总之,还有许多处理Python、OpenGL和3D可视化的项目,其中有一些比较年轻,有一些已经不再维护了,但是如果你发现有项目应该被提到,请告诉我们。

时间: 2024-10-25 22:34:46

《Python数据可视化编程实战》——5.5 用OpenGL制作动画的相关文章

《Python数据可视化编程实战》—— 1.2 安装matplotlib、Numpy和Scipy库

1.2 安装matplotlib.Numpy和Scipy库 Python数据可视化编程实战 本章介绍了matplotlib及其依赖的软件在Linux平台上的几种安装方法. 1.2.1 准备工作 这里假设你已经安装了Linux系统且安装好了Python(推荐使用Debian/Ubuntu或RedHat/SciLinux).在前面提到的Linux系统发行版中,Python通常是默认安装的.如果没有,使用标准的软件安装方式安装Python也是非常简便的.本书假设你安装的Python版本为2.7或以上.

《Python数据可视化编程实战》——5.2 创建3D柱状图

5.2 创建3D柱状图 Python数据可视化编程实战 虽然matplotlib主要专注于绘图,并且主要是二维的图形,但是它也有一些不同的扩展,能让我们在地理图上绘图,让我们把Excel和3D图表结合起来.在matplotlib的世界里,这些扩展叫做工具包(toolkits).工具包是一些关注在某个话题(如3D绘图)的特定函数的集合. 比较流行的工具包有Basemap.GTK 工具.Excel工具.Natgrid.AxesGrid和mplot3d. 本节将探索关于mplot3d的更多功能.mpl

《Python数据可视化编程实战》—— 1.6 安装图像处理工具:Python图像库(PIL)

1.6 安装图像处理工具:Python图像库(PIL) Python数据可视化编程实战Python图像库(PIL)为Python提供了图像处理能力.PIL支持的文件格式相当广泛,在图像处理领域提供了相当强大的功能. 快速数据访问.点运算(point operations).滤波(filtering).图像缩放.旋转.任意仿射转换(arbitrary affine transforms)是PIL中一些应用非常广泛的特性.例如,图像的统计数据即可通过histogram方法获得. PIL同样可以应用在

《Python数据可视化编程实战》—— 1.5 在Windows上安装matplotlib

1.5 在Windows上安装matplotlib Python数据可视化编程实战在本节中,我们将演示如何安装Python和matplotlib.假设系统中没有预先安装Python. 1.5.1 准备工作 在Windows上安装matplotlib有两种方式.较简单的方式是安装预打包的Python环境,如EPD.Anaconda和Python(x,y).这是本书推荐的安装方式,尤其对于初学者来说更是如此. 第二种方式,是使用预编译的二进制文件来安装matplotlib和依赖软件包.需要注意安装的

《Python数据可视化编程实战》—— 1.8 在代码中配置matplotlib参数

1.8 在代码中配置matplotlib参数 Python数据可视化编程实战matplotlib库提供了强大的绘图功能,是本书用的最多的Python库.在其配置文件即.rc文件中,已经为大部分属性设定了默认值.本节会介绍如何通过应用程序代码修改matplotlib的相关属性值. 1.8.1 准备工作 如前所述,matplotlib配置信息是从配置文件读取的.在配置文件中可以为matplotlib的几乎所有的属性指定永久有效的默认值. 1.8.2 操作步骤 在代码执行过程中,有两种方式更改运行参数

《Python数据可视化编程实战》—— 1.9 为项目设置matplotlib参数

1.9 为项目设置matplotlib参数 Python数据可视化编程实战本节介绍matplotlib使用的各种配置文件的位置,以及使用这些配置文件的意义.同时还将介绍配置文件中的具体配置项. 1.9.1 准备工作 如果不想在每次使用matplotlib时都在代码开始部分进行配置(像前一节我们做的那样),就需要为不同的项目设定不同的默认配置项.本节将介绍如何做到这一点.这种配置方式使得配置项与代码分离,从而使代码更加整洁.此外,你可以很容易在同事间甚至项目间分享配置模板. 1.9.2 配置方法

《Python数据可视化编程实战》—— 1.7 安装requests模块

1.7 安装requests模块 Python数据可视化编程实战我们需要的大部分数据都可以通过HTTP或类似协议获得,因此我们需要一些工具来实现数据访问.Python的requests库能让这部分工作变得轻松起来. 虽然Python提供的urllib2模块提供了访问远程资源的能力以及对HTTP协议的支持,但使用该模块完成基础任务的工作量还是很大的. Request模块提供新的API,减轻了使用web服务的痛苦,使其变得更直接.Requests封装了很多HTTP 1.1的内容,仅在需要实现非默认行

《Python数据可视化编程实战》—— 1.3 安装virtualenv和virtualenvwrapper

1.3 安装virtualenv和virtualenvwrapper Python数据可视化编程实战如果同时工作在多个项目上,或是需要在不同项目间频繁切换,将所有的软件都安装在操作系统层级上也许不是一个好主意.当需要在不同系统(产品环境)上运行软件时,这种方式会带来问题.如果到此时才发现缺少特定的软件包,或是产品环境已经安装的软件包存在版本冲突,这将是非常痛苦的.为避免这种情况发生,可以选择使用virtualenv. virtualenv是由Ian Bicking创建的开放源代码项目.通过这个项

《Python数据可视化编程实战》—— 第 5 章 创建3D可视化图表

第 5 章 创建3D可视化图表 Python数据可视化编程实战本章将学习以下内容. 创建3D柱状图创建3D直方图在matplotlib中创建动画用OpenGL制作动画

《Python数据可视化编程实战》—— 导读

前言 Python数据可视化编程实战最好的数据是我们能看到并理解的数据.作为一个开发人员,我们想创造并构建出最全面且容易理解的可视化图形.然而这并非总是很简单,我们需要找出数据,读取它.清理它.揣摩它,然后使用恰当的工具将其可视化.本书通过简单(和不那么简单)直接的方法解释了如何读取.清理和可视化数据的流程. 本书对怎样读取本地数据.远程数据.CSV.JSON以及关系型数据库中的数据,都进行了讲解. 通过matplotlib,我们能用一行简单的Python代码绘制出一些简单的图表,但是进行更高级