Python工程数学7VPython制作3D图形和动画(上)坐标系、基本形状、点和线

7 简介

VPython是一个基于Python语言的开源库,专门用于创建三维图形和动画。它为用户提供了一种简单而直观的方式,通过Python代码构建出生动的三维场景。VPython的设计初衷是让用户能够轻松地将物理概念可视化,因此在教学、科研和学习物理等领域得到了广泛应用。

  • VPython的特点

    • 易于学习: VPython的语法简单易懂,即使没有编程基础的用户也能很快上手。
    • 直观可视化: 通过简单的代码,就可以创建出复杂的3D模型和动画效果。
    • 物理模拟: VPython内置了许多物理模型,可以模拟各种物理现象,如运动、力、碰撞等。
    • 交互性强: 用户可以通过鼠标、键盘等方式与创建的3D场景进行交互。
    • 开源免费: VPython是一个开源项目,用户可以免费使用和修改。
  • VPython的应用

    • 物理教学: VPython可以用来模拟各种物理实验,帮助学生更好地理解物理概念。
    • 科学可视化: VPython可以将科学数据可视化,使复杂的数据变得更加直观。
    • 游戏开发: VPython可以用于开发简单的3D游戏。
    • 虚拟现实: VPython可以用于创建简单的虚拟现实场景。

VPython 模块名称中的字母 “V”代表视觉(visual),指的是物体在三维空间中的表示和运动。
物理关系和过程的动态不再像 SciPy 模块那样以函数图的形式来描述,而是以观察者在现实中的感知来描述。重要的是要考虑到许多物理过程(如斜抛)可能无法被人眼捕捉到细节。VPython 提供了根据需要使用速率(频率)函数放慢(慢动作)或加速过程的功能。在计算机上模拟真实动作时,计算机图形学领域将这一过程称为动画,即赋予物体 “生命”。

表示物体的画布(canvas)称为场景(scene)。在场景中,您可以按住鼠标右键并移动鼠标光标,使显示的对象绕 x-y-z 轴旋转。这允许观察者从不同角度查看对象。

从第 7 版开始,VPython 模块使用 from vpython import * 语句导入。其他模块无需导入。启动程序后,默认浏览器会打开,程序在网络图形库(WebGL)中运行。WebGL 是一个 JavaScript 编程接口,允许在网络浏览器中显示硬件加速的 3D 图形,而无需额外的扩展程序。

使用 vector(x, y, z) 方法可以确定物体在三维空间中的位置,如果物体要移动,还可以更改位置。由于向量的概念在 VPython 中起着核心作用,让我们用一个小型控制台示例来简要讨论这一主题:

>>> 从 vpython 导入 *
>>> v1=vector(1,2,3)
>>> v2=vector(4,5,6)
>>> v1+v2 <5, 7, 9>
>>> type(v1)
<class 'vpython.cyvector.vector'>

在第二行和第三行中,vector(x,y,z) 方法将 v1 和 v2 对象创建为三维向量,其中包含 x-y-z 坐标的数据。第四行是这些向量的加法运算。除了加法之外,还实现了标量积和交叉积。也可以使用 vec() 代替 vector()。
使用以下语句可以创建一个体对象 obj:

obj=body(pos=vec,size=vec,axis=vec,color=color.color,...)

在这种情况下,body 方法代表基本形状,如 box()、sphere()、cylinder()、cone() 等,它们由 VPython 模块提供。如果需要其他体,可以使用 compound ([k1,k2, ...])方法从基本体(k1、k2 等)创建它们。

7.1 坐标系

上图坐标原点位于画布中心,X 轴从左到右,Y 轴从下到上,Z 轴垂直于画布。 启动程序,稍作延迟后程序将在默认浏览器中运行。然后,右键单击画布,按住鼠标右键,旋转坐标系,以便观察到尽可能多的视角。在坐标系中插入坐标为(5,5,0)的灰色点可方便您在空间中定位,并明确 VPython 中坐标变换的作用模式。

#01_coordinates.py
from vpython import *
h=10. #height
b=10. #width
t=10. #depth
scene.title="<h2>VPython坐标系</h2>"
scene.width=scene.height=600
scene.background=color.white
scene.center=vector(0,0,0)
scene.range=1.5*b
x0=vector(-b,0,0)
y0=vector(0,-h,0)
z0=vector(0,0,-t)
#x-axis is red
arrow(pos=x0,axis=vector(2*b,0,0),shaftwidth=0.15,color=color.red)
#y-axis is green
arrow(pos=y0,axis=vector(0,2*h,0),shaftwidth=0.15,color=color.green)
#z-axis is blue
arrow(pos=z0,axis=vector(0,0,2*t),shaftwidth=0.15,color=color.blue)
label( pos=vec(b,-1,0),text="x",height=30,box=False,opacity=0)
label( pos=vec(-1,h,0),text="y",height=30,box=False,opacity=0)
label( pos=vec(-1,0,t),text="z",height=30,box=False,opacity=0)
points(pos=vector(5,5,0))
scene.caption="\n点击鼠标右键然后拖动" 

执行结果

第 03 至 05 行定义了显示窗口(画布)的高度、宽度和深度。
第06 行中的 scene.title=“...” 命令用 HTML H2输出程序的标题。
在第 07 行,scene.width=scene.height=600 命令将显示窗口的宽度和高度分别设置为 600 像素。
在第 08 行,scene.background=color.white 将画布背景设置为白色。默认设置为黑色。
第 09 行中的 scene.center=vector(0,0,0) 语句用于设置坐标系的原点,实际上并无必要,因为默认值正好将原点置于画布的中心。
我们在本例中加入该语句只是为了进行进一步的程序测