简介编辑
Python科学计算
Python科学计算
VPython是一套简单易用的三维图形库,使用它可以快速创建三维场景和动画。和TVTK相比,它更适合于创建交互式的三维场景,而TVTK则更适合于对数据进行三维可视化。本章将通过几个实例介绍如何使用VPython制作实时、交互式的三维动画演示程序。 [1]
制作动画演示编辑
用VPython制作动画的简单之处在于:只要在一个循环体中不断地修改场景中的各个模型以及照相机的各种属性,即可实现动画效果。
与场景交互编辑
为了和场景中的物体进行交互,VPython提供了如下方便实用的功能:
键盘和鼠标事件的处理。
控件窗口和4种控件(按钮、滚动条、开关及菜单),用于制作简单的用户界面。
绘图窗口,用于绘制二维坐标图。
由于篇幅受限,本书只介绍键盘和鼠标事件的处理,请读者参考VPython的文档和演示程序来自学其他部分的内容。
响应键盘事件
通过场景窗口对象的kb属性可以获得按键信息。kb.keys是窗口中等待处理的键盘事件的个数,调用kb.getkey()可以从键盘事件队列中获取一个待处理的事件。如果队列为空,getkey()将一直等待,直到产生键盘事件为止。getkey()的返回值是一个描述按键的字符串。下面是一个简单的键盘事件测试程序,可以用它查看各个按键的名称。
响应鼠标事件
鼠标射线和鼠标各个坐标属性之间的关系
鼠标射线和鼠标各个坐标属性之间的关系
鼠标事件和键盘事件类似,通过场景窗口对象的mouse属性进行鼠标事件的处理。鼠标的坐标是二维视图平面上的一个点,在三维空间中有一条直线上的点都将投影到这个位置,我们称此直线为鼠标射线。scene.mouse是一个mouse_object对象,下面列出它的属性和方法。为了便于理解,右图显示了鼠标射线和pos、pickpos等属性之间的关系。
pos:鼠标在三维空间中的坐标,此坐标是鼠标射线与经过点scene.center且平行于屏幕的平面的交点。
button:描述鼠标按键的字符串,值可以为None、'left'、'right'、'wheel'。此属性只有在产生事件时才不为None。
pick:用鼠标选中的物体对象,与鼠标射线相交的第一个物体。
pickpos:鼠标射线与pick物体的表面的交点坐标。
camera:当前照相机的位置坐标,旋转或缩放场景时会发生变化。
ray:从camera到pos的单位方向矢量,也就是鼠标射线的方向,它正好和窗口视图垂直。鼠标射线在三维空间中的参数方程为camera+t*ray,其中t是一个大于0的任意参数。
alt、ctrl、shift:Alt、Ctrl、Shift三个按键的状态。
project():计算鼠标射线与任意平面的交点,平面由表示法线方向的normal参数和表示平面上某点坐标的point参数指定。因为与屏幕平行的面的法线方向为scene. forward,所以下面语句的计算结果与scene.mouse.pos相同:
scene.mouse.project(normal=scene.forward, point=scene.center)
events:待处理的鼠标事件的数目。
getevent():从鼠标事件队列中获取最早的鼠标事件。如果队列为空就一直等待事件的发生。
getevent()返回的事件对象保存事件发生时的鼠标坐标,也具有上述的属性和方法。除此之外,事件对象还有press、click、drag、drop、release等属性,它们是描述鼠标按键的字符串,分别是产生“按下”、“单击”、“拖”、“放”、“松开”5种鼠标事件的按钮名称。
用界面控制场景编辑
用TraitsUI的界面控制Visual场景
用TraitsUI的界面控制Visual场景
VPython提供了一种控制窗口,可以放置按钮、开关及滚动条等简单控件,用以实时设置场景中的物体。但是这些控件不但功能有限,而且不是标准的界面控件,操作起来不是很方便。本节介绍如何使用TraitsUI制作一个能控制VPython场景的界面。
VPython和TraitsUI各有自己的独立窗口,TraitsUI界面有自己的消息循环,而Visual窗口有自己的动画控制和消息处理循环。因此我们需要使用多线程或多进程方式,让这两个循环互不影响。下面是使用多线程实现TraitsUI控制场景的完整程序。
创建复杂模型编辑
VPython只提供了一些简单的立体几何形状,如果要创建复杂的物体,就需要用户自己编写程序,计算物体的多边形网格模型数据,并使用faces()将数据转换为模型进行显示。
任何一个三维模型都可以用许多三角形的面来表示,对于每个三角形的每个顶点,我们需要计算如下数据:
顶点的坐标:三个浮点数表示的三维坐标。
顶点的法线方向:三个浮点数表示的三维方向矢量。
顶点的颜色:三个浮点数表示的红、绿、蓝颜色分量。
将保存上述数据的三个数组传递给faces()即可创建三维模型。对于一个有N个三角形的模型,每个数组的长度都是33N,也可以传递一个形状为(3*N,3)的二维数组。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。