程 飞
(安徽电子信息职业技术学院电子工程系,安徽 蚌埠 233000)
当前,科技类场馆开展科普工作主要通过三种手段:(1)实物模拟,(2)采用多媒体技术,利用声光电营造场馆环境,(3)微视频展示科学原理,(4)利用虚拟现实技术。对于第一类,观众一般不能触摸实物模型,第二类技术对于传播科技知识作用有限,而对于第三类,观众一般情况下仅能通过视频了解科学原理和科技知识,被动接受得多,主动参与得少。第四类则依赖于硬件设备(如VR头盔等)。总体看来,科普平台的展示功能较多,而具有交互功能的科普平台较为少见。如果结合计算机图形学技术,开发具有交互功能的科普虚拟平台,可以有效提高科普效果,促进科学知识的传播。本文结合中国科协科普大赛的命题《轮旋线》为例,结合软件工程理论,详述交互式科普平台的设计方法。
一个动圆(圆心为O,半径为r)在一条定曲线L上滚动时,与动圆圆心O距离为定值c的点P的轨迹称为轮旋线[1],又称摆线。OP称为摆轴,且c=|OP|。一般L为直线或者圆。如果L为直线,称为普通摆线(如图1所示)。如果L为定圆,分为两种情况,称为内圆摆线(如图2所示)和外圆摆线(如图3所示)。若c>r,称为长轴摆线,若c<r,称为短轴摆线。图4从左至右显示了c>r、c=r、c<r三种内圆摆线的形成过程。
图1 普通摆线
图2 内圆摆线
图3 外圆摆线
图4 三种内圆摆线
从交互式科普角度考虑,虚拟平台应能够动态、交互表达:(1)摆线的形成过程(2)摆线的数学表达式(3)摆线的特殊性质(4)摆线的简史(5)摆线的应用(6)摆线的绘制。由于科普平台的作用是激发科学研究的兴趣,对于公式的推导和理论一般不做展开。
基于教育心理学的理论,人类视觉对于运动的物体比静止的物体敏感;此外,在立体的场景中多视图观察形体,所获得的信息量远大于固定视角所获得的信息量。因而,将摆线的动态形成过程置于三维场景中,场景的视角可以变换,其效果如图5所示。这里视角矢量为(1,1,1),即轴侧观察。该图显示了各种摆线的形成过程。
图5 各种摆线的形成过程
这里采用底层引擎OpenGL作为开发工具[2]。这是因为:(1)OpenGL具有良好的浮点计算能力,特别适用于数学函数处理;(2)其动态刷新功能可以保证动画效果的实现;(3)其显示表功能可以实现场景中的中英文字标注,还可以方便载入图片说明;(4)合理调用VC++的sleep函数,可以实现场景的自动变换,可以以微视频的形式输出;(5)基于VC++的一档多视技术[3],可以增加表单视(FormView),易于实现设计交互式界面,如图5左半部分所示。
限于篇幅,本文仅以(1)外摆线的形成(2)等时降线(3)最速降线为例说明详细设计的思路和方法。
外摆线如图3所示,其方程为[1]:
其中,a为定圆半径,b为动圆半径,c为动圆圆心O到点P的距离,即c=|OP|,θ对应于动圆的自转角度。给定a,b(一般情况下a、b取有理数),如果a/b可以化为最简分式m/n(m、n为互质整数),则动圆将会绕定圆公转m圈,同时自转n圈(即共计自转n*2π弧度),回到起点[4]。每自转一圈,形成摆线的一瓣。如图3所示,a=3,b=1,c=1.5,动圆公转1圈,同时完成三次自转,形成摆线的3瓣。OpenGL下,摆线的动画实现步骤如下:
(1)计算n.给定a,b,计算a/b,化为最简分式m/n,得到n;
(2)计算曲线上的各个数据点。因为θ∈[0,n*2π],将[0,n*2π]均分1 000份,令,代入(1)式,计算各个θi所对应的pi(xi,yi)。
(3)绘制图形,OpenGL用多段直线描绘曲线。给定一个整数t,绘制直线P0P1,…,Pt-1Pt。t初始化为0,每次OpenGL刷新重绘的时候t增加1,即每次刷新图形多绘制一段直线,从而实现摆线绘制动画。当t=1 000时,置t=0,重新绘制。关键代码如下:
为了增加动画效果,定圆绘制完成后,还要绘制动圆以及动圆上的摆轴OP的运动,如图3所示。定圆和动圆圆周的绘制方法参考相关文献[5]。只要知道动圆的圆心,就可以通过每次刷新重绘动圆,表现动圆沿定圆圆周滚动。采用下面的语句移动动圆的圆心:
进一步通过动圆的自转实现摆轴OP的运动效果,关键语句如下:
绘制效果如图3所示,由图可见,P点的运动形成了外摆线。对于内摆线和普通摆线的情形,用同样的方法绘制,不再赘述。图1、图2、图3显示了摆轴OP的旋转以及P点的运动产生摆线的过程。
多个小球从摆线的不同高度同时沿摆线下落,会同时到达最低点,这就是摆线的等时降线特性[4]。图6(a)显示了位于摆线上不同高度的小球,按下“启动”按钮后,各个小球同时沿摆线下滑,图6(b)显示了各点同时到达最低点。
图6 等时降线和最速降线
为了表现具有真实感的小球下滑过程,需要依据物理学的原理计算小球沿等时降线下滑的相关位置数据。思路如下:假设从初始点下滑到最低点的总时间为nt,小球在it时刻的位置即为H(i),(i=0,1,2,3,…,n;特别的,i=0时记为H,i=1时记为H’,i=2时记为H”)。第i次刷新的时候,在位置H(i)绘制小球。每次刷新重绘的时间间隔都是相同的,但是小球移动的距离 d(i)=|H(i)-H(i-1)|不同,这样就表现出真实感的动画效果。下面计算H(i)(i=1,2,3,…,n),为简化问题,这里仅计算H,H’以及H”。
图7 小球沿摆线下滑位置计算
如图7所示,|AB|=α,摆线的方程为:
小球初始位置位于H,坐标表示为H(m,h),t时刻位于H’(m’,h’),2t时刻位于H”(m”,h”)。过H作x轴的平行线,交y轴于A1,以OA1为直径作辅助圆O1,过H’、H”作x轴的平行线,交辅助圆于A2、A3,则∠A1O1A2=∠A2O1A3=β。即重力作用下小球下落时各个位置点的纵坐标的值等于一个小球沿辅助圆O1匀速转动(角速度为,g为重力加速度)时相应位置点的纵坐标的值。这样,H’点的纵坐标就可以表示为:
代入(2)式的第2式,有
求得
再将(5)式代入(2)式的第1式,求出H点的横坐标。
而H”点的纵坐标就可以表示为:
采用和上面相同的方法,可以求出H”点的横坐标,以及所有关键点的位置坐标。
可以证明,小球下落的时间与初始位置无关[4](证明请参阅相关文献)。小球初始位置不同,沿摆线下滑,最终同时下落到最低点。等时降线详细设计的思路如下:给定初始位置H’(m’,h’),首先在初始位置绘制小球;OpenGL刷新一次(对应于经过t时刻),在H”(m”,h”)位置小球;以此类推,计算其余关键点的位置数据。小球沿摆线下滑的动画效果如图6(a)、(b)所示。小球到达最低点以后,由于其具有水平速度,会沿摆线的左半部分继续上升,即动画的效果是小球沿摆线来回震荡。关键代码如下:
如图6(c)(d)所示,在从起点到终点的所有连线中,小球沿摆线下落速度最快,称为最速降线性质[4]。图6(c)显示了小球沿直线和摆线同时下落,图6(d)显示小球沿摆线到达最低点的时候,沿直线下落尚未到达最低点。其设计方法和数据计算类似4.2,这里不再赘述。
图8 载入图片
图9 显示表技术导入字体
OpenGL性能良好的底层图形库,结合VC++的强大的数学处理能力,特别适合于基于物理原理的交互式科普软件设计,可以反映真实的物理实验环境,给科普参与者以真实的科普体验。不仅如此,OpenGL还可以导入图片(如图8所示,用图片形式描述摆线简史),通过显示表技术导入不同字体的文字,并可以通过sleep()自动生成科普视频,满足特定的科普需求(如图9所示视频截图)。基于OpenGL设计科普交互式软件,是实现真实感的虚拟科普场景的有效途径。