3.5.4 准三维虚拟教学场景匹配方法
对于虚拟教学场景是三维模型的情况,需要设计三维虚拟教学场景匹配方法。三维虚拟教学场景与二维场景不同,二维教学场景只是一个平面图形,没有深度信息,而三维虚拟场景中的景物具有深度信息,即具有Z方向的信息,具有一定的纵深感,更加能反映人眼看到真实物体的感受。支持前后景进行带深度信息的图像融合系统,能够产生更加逼真的虚拟场景效果,可以称为真三维虚拟融合系统。但由于计算量大,硬件要求高,真三维系统配置复杂,显然对于教育数字媒体内容来说制作成本过高。因此,可以采用准三维虚拟融合技术,即提供物体的部分遮挡功能,以模拟教师进入虚拟教学场景的效果,但缺点是遮挡物体只能事先指定,无法实时生成,因此只能称为准三维系统。
教育数字媒体内容制作系统中设计了准三维虚拟教学场景匹配算法,仍然采用同时控制摄像机与虚拟背景的方式来实现背景与前景的匹配,三维场景的匹配需要根据三维建模和渲染软件的特点进行三维虚拟场景的控制。
1.三维虚拟教学场景渲染和控制
三维虚拟教学场景渲染和控制可以采用三维渲染软件来实现。如前所述,在教育数字媒体内容制作系统可以采用Multigen Vega或Vega Prime软件来显示和控制三维虚拟教学场景模型。但Vega在虚拟场景切换中存在内存泄漏问题,即使关闭了Vega线程,也无法再次打开场景,所以基于Vega的场景切换需要多个Vega程序同时运行,并且相互间进行进程通信,以实现正常的场景切换。
常用进程间通信包括文件映射、消息队列和管道、INI文件通信等。其中INI文件(initialization file,又称为初始化文件)是用来保存应用程序设置和选项的一种特殊的ASCII文件,以“.ini”作为文件扩展名。INI文件存储结构简单,容易掌握。因此,在准三维虚拟场景匹配中可采用INI文件通信方式实现Vega场景控制进程之间的数据通信。
2.准三维虚拟场景匹配算法
1)三维虚拟场景初始视点调整
三维虚拟场景与实际拍摄场景相比,可能存在着视点位置不对、场景大小不合适的问题,因此,需要进行相应初始视点的调整。可以采用平移变换,例如,三维场景中点P(x,y,z)平移到P′(x′,y′,z′)的变换公式为:
其中,参数tx、ty、tz用于指定x、y、z坐标方向的平移量。
2)准三维虚拟匹配下的虚拟背景运动控制
准三维虚拟融合系统的特点之一就是摄像机的位置是固定不变的,所以对应的虚拟摄影机的位置也是固定不变的。因此,准三维虚拟场景的匹配主要是保证真实摄像机的摇移、俯仰及变焦时的真实视觉效果。因此,三维虚拟场景中运动的视点也是保持不变的,也就是视点不变的左右、上下旋转及场景的缩放,可以利用常用的数学变换公式得到虚拟摄像机的位置。
当摄像机作左右的摇移运动时,对应的三维旋转变化为绕z轴的旋转,可得出P(x,y,z)旋转到P′(x′,y′,z′)的坐标值:
当摄像机作上下的俯仰运动时,对应的三维旋转变化为绕x轴的旋转,则可得到P(x,y,z)旋转到P′(x′,y′,z′)的坐标值:其中,旋转角θ可由真实摄像机的旋转速度根据摄像机成像的透视关系推导而来。
当摄像机的焦距改变时,对应的三维场景也要进行放大或缩小,可以得出变换公式:
其中,缩放参数sx、sy和sz由摄像机的变焦速度得到。
3.准三维虚拟教学场景匹配模块实现
准三维虚拟教学场景匹配模块部分界面如图3-30所示。
图3-30 准三维场景匹配模块部分界面
1)获取INI文件路径及三维场景初始参数
获取作为进程通信媒介的INI文件的路径,并由此路径读入相应三维场景的参数,其基本代码实现如下。
GetModuleFileName(NULL,appPath,256);//获取产生此进程的应用程序的路径
FilePath=(CString)appPath;
int position=FilePath.ReverseFind('\\');
FilePath=FilePath.Left(position+1);
FilePath+=ININame;
GetPrivateProfileString("Vega","Name","town.adf",s,20,FilePath);
2)计算和设置虚拟三维场景运动参数
计算场景运动速度,设置三维场景相应的参数,可分为平移和旋转两种,其基本代码实现如下。
rolept=GetPrivateProfileInt("Move","RolePT",1,FilePath);
speed2match();
if(rolept==1)
p+=vpt;
else if(rolept==2)
z+=vpt;
3)设置INI文件参数
在主程序中,与Vega进行进程通信的部分代码如下。
WritePrivateProfileString("Move","IfMove","1",User.pathv);//将3D模型显示的相关参数写入INI文件
WritePrivateProfileString("Move","Direction","1",User.pathv);
WritePrivateProfileString("Move","IfMove","0",User.pathv);
程序运行过程中的INI文件如图3-31所示。
图3-31 INI文件
此INI文件共有两个字段———Vega和Move,在这两个字段下又分别有多个变量,INI文件的读写就是分别给这些字段下的变量赋值及从这些变量中读入值,进行计算、分析、控制。
4)驱动虚拟三维场景
准三维虚拟场景匹配程序设置好INI文件参数(包含场景运动参数)后,Vega场景控制程序就读取此INI文件,并根据相应参数将三维场景显示在新的位置上。
4.场景匹配效果分析
图3-32为三维场景与前景人物的匹配效果图,其中(a)、(b)、(c)分别为原始图像、右移图像和放大图像。图中人物与讲桌为实物,其余为虚拟三维场景。当摄像机
图3-32 准三维匹配效果
向右摇移时,实景到了摄像机输出图像的左边,虚拟三维场景中的物体也发生相应的变化,例如左边屏风逐渐移出,右边茶几逐渐移入。在图3-32(c)摄像机拍摄图像放大情况下,虚拟三维场景也有相应的放大效果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。