基于firemonkey 技术的3D动画设计
2017-11-09张翔宇蔡文斋刘剑锋
张翔宇++蔡文斋++刘剑锋
摘 要该天线仿真工程需要制作一款监控软件,当设备运行时能够在计算机屏幕上展现出简单的3D动画效果。使用Delphi开发工具设计并制作了该软件。利用新版工具中的firemonkey技术实现了动画效果。利用布局组件技术设计了3D界面上2D组件显示效果。使用光及光源材质,照相机控件、3D模型等一系列组件渲染出3D图形,使用动画组件施作用于3D模型,通过网络数据读取得到另外计算机传来的输入数据。当程序发生变化后驱动3D模型运动,最终制作出实用的工程3D动画软件。
【关键词】仿真测试 照相机 材质源 3D模型 网络通信
要求开发一套天线仿真训练系统,训练操作员操作真实设备的能力。要求制作出与原测控设备外形一样的全套仿真系统。某承研单位负责地面天线类设备的全套研发,其中某功能要求能在某台计算机上制作出具有3D效果的天线3D动画。分析了该种需求后,开发组成员讨论各实现途径。经查询各种资料,常用的3D类开发软件开发方法为:微软的Direct Draw技术、Delphi开发工具的第三方组件类DelphiX技术、Delphi开发工具之GLScence库技术、虚拟现实开发工具unity 3D技术。一般3D类开发需要学习的相关知识较多,程序员短期内很难达到正式开发的技术水平,工程任务紧,短期内较难完成工程任务。
1 网络通信问题
通过分析Rad Studio新版工具,firemonkey技术已从XE2版本处于不断完善中,虽然这方面资料不多,查电子文档发现英文版例子看起来开发一个简单的3D动画类软件较之其它开发工具要便捷。于是决定使用该技术实现工程项目中3D展示需求。firemonkey技术是Embarcadero公司推向全球的跨平台的开发技术,使用Delphi或C++builder开发Android、OS X、IOS、Windows平台下任何应用软件。新版XE10.2.1已支持LINUX开发。工程中的需求转化为软件需求后需要解决两个问题:网络通信和3D展示。
firemonkey下的很多组件属性特性已同平时2D下的开发组件特性不大一样。需要按例子认真试验。工程用3D展示主要设计思路为:由天线控制计算机通过网络接口传来天线实时位置信息:方位、俯仰值,在3D展示进程(另外独立软件)收网络数据完成3D展示。Firemonkey技术下的网络通信不同于一般的windows 网络编程,最好使用该工具软件下的组件开发,这样编程既简单有快捷,在3D进程中,使用indy(Internet direct socked)UDP服务器组件实现网络数据收。indy组件库是开源组织提供的全套网络组件库。该组件库提供了几十个网络组件,支持各种网络协议通信,indy库已经内嵌在Rad Studio 开发工具中。网络通讯部分开发与2D开发相当。重载IdUDPServer1组件的服务器读函数。IdUDPServer1组件需要设置DefaultPort参数,设置该参数数值后,再将网络组件Active激活,则网络服务器已处于自动收状态,该组件是基于线程通信的,一旦网络上有数据到来,则该组件的procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle)函数(回调函数)则自动读到数据并放置于AData缓冲区,ABinding中可以得到发送方的地址, 开发者是看不到真正网络读语句的,从缓冲区直接取数据即可。
从网络AData缓冲区复制内容到自己的缓冲区是不能够使用CopyMemory函数的,该函数属于Win32API,在该处是无法使用的,只有使用循环赋值语句。从内存数据到浮点数的转换使用Delphi的内存对齐技术,在声明中写为
Var
B4:Array[0..3] of Byte;
F:single absolute b4;
则表示浮点数f与内存B4共享同一内存空间。将从网络缓冲区传来的数据Data首先传给B4,则f中直接得到浮点数f。这与C语言的联合是一样的,使用了该技术后,则3D进程就得到了天线控制机传来的方位、俯仰变量值了。
2 3D效果展示
建立3D工程,建立后应用界面就是一个3D类窗中,在XE10开发工具中,直接拖Firemonker组件到该界面,注意,这不同于2D界面设计,当首次使用界面可视组件放置在窗口时你可能有时看不到。第一个需要解决的问题是,怎样在3D界面中设计出2D界面。拖一个Layer3D组件,设置投影效果为Projection=screen,这时Layer3D会出现一个白色的邊框,将对齐方式设为MostRight,此时你的窗口右侧即出现一个2D组件容器区,这样2D组件就有了一个容器,界面中其它2D组件就可以放置在该容器上了。注意3D Form中是放不进2D组件的。
3D图形在界面上要显示需要以下几个要素:
一个或多台照相机组件,
一个或者多个光源组件(光源分方向,点光源、聚光灯),
材质源组件,材质源分为颜色材质源,纹理材质源,光材质源
3D模型组件(基本的3D模型在Rad Studio开发工具已具备,比如TCube等),复杂的3D模型需要使用3D Max,Maya等工具制作,或者从AutoCAD软件中导入,该工程中天线模型我们是从结构研究室的AutoCAD软件直接导入的*.obj文件,3D模型文件有很多种格式各不相同,但可借助3D模型转换软件互相转换。当导入界面后,你会发现有时看不见,将放大比例放大,调整灯光方向,调整照相机角度将会最终看到该3D物体,在3D世界,人眼看到的东西实际是照相机镜头看到的东西,所以适当调节光,照相机、材质才能看到3D效果。选中3D模型组件,调整位置与旋转参数(全是三维向量)会发现3D模型在运动,简单的3D动画效果就制作出来了,用一组变化的网络数据注入数据,观察3D接收程序执行的效果,发现天线运动并不是想象的形式,终查证分析,可能问题出在坐标系统中,网络传来的是极坐标值(A、E),而转动参数为三维向量(x、y、z),这样显然是给不出正确的结果的。一想到要进行坐标转换,又需要很多试验要做,很多参数不知道怎么确定。只有另辟思路了,天线3D模型旋转在真实世界中是天线头安装在一个底座上,方位负责水平运动,俯仰负责垂直运动,只要想出一种方法,将这两种运动分离就可能出现预期效果。
3d动画制作是较复杂的,要作出象Unity 3D一样的效果需要学习的知识较多,但制作一个简单的动画对Rad Studio工具而言并非难事,动画表现有两大类,一类为照相机动,一类为3D模型在动,运动又分为位置和旋转,在开发工具内这些运动参数表现为向量(x,y,z),动画可以使用两种方式实现,一种你自己控制时序改变向量值,一种方法为使用动画组件定制动作即可。该开发工具已经内置了动画组件,驱动一个简单的3D模型运动几乎使用很少代码就可实现,在试验阶段,作者试用了BitmapAnimation1,ColorAnimation1,TFloatAnimation,GradientAnimation1等等动画组件制作了许多例子程序,发现TFloatAnimation功能强劲,一般的各种动态方式都支持(PropertyName),在3D界面中放置一个TCube组件,在该组件的depth属性值内右击鼠标产生一个TFloatAnimation,在TFloatAnimation的属性页定制动画参数并激活,你没有写一句代码,简单的动画就制作完成了。
3 3D模型定位
查资料后,发现Dummy组件有可能会达到目的。Dummy是个虚拟3D模型,英文字面上为仿制品,经试验,将Dummy作为Model3D1的父组件。组件父子关系的建立与关联,使用开发工具中的Structure页面直接拖动,呼出界面,使用鼠标拖动方式,改变组件之间的隶属关系,子组件位于父组件的下一层,如图2所示。
将model3d组件放置在Dummy组件上后,发现光材质源又不起作用了,再试验,发现材质源只能作用于mesh(网格),再加一个mesh组件,在Form 创建时加
procedure TForm1.Form3DCreate(Sender: TObject);
var
Mesh : TMesh;
begin
for Mesh in Model3D1.MeshCollection do
Mesh.MaterialSource := LightMaterialSource1;
Mesh:=Mesh1;
這样3D模型才被赋予了材质。这样在运动时天线模型在不同位置光照是不同的,渲染效果才能够出现,在该工程项目中,天线3D模型的运动是受另外计算机控制的[6],在网络收函数内,分别旋转Dummy和Model3D组件则达到工程制作目的,不使用动画组件一样可以达到效果。
4 其它设计
为了使3D效果展示部分独立于监控程序本身,需要设计网络配置端口为变量,软件执行后,如果改变该参数则网络重新激活。为了观察从天线控制机传来的数据变化,又设计了值显示组件TMemo,定时清除时钟,否则使用TMemo组件显示读取到的数值时如果运行时间过长将会超出内存,定时清除,是一种保护性设计。
5 结束语
firemonkey技术是近年引入的新技术,虽然在Delphi开发工具中仿佛与VCL基础库一样提供了面向对象的高效组件,但底层已由开发公司全部重写,支持多平台开发。原Borland公司经典的Delphi曾经给业界Windows应用程序开发带来过惊喜,使用新版Rad Studio后,制作3D类简单应用项目同样使人感到新意满满,所见即所得的开发方式使程序员节约了许多时间,较之其它3D开发技术入门门槛不太高。文中以一个具体工程项目为例演示了3D相关开发技术,望对读者有益。
参考文献
[1]王艳平.Windows网络与通信程序设计(第2版)[M].人民邮电出版社,2009(01):203-210.
[2](美)Jeffrey Richter著.王书洪,刘光明译.Windows高级编程指南[M].清华大学出版社,1999:263-269.
[3](美)拉西诺维奇等著,深入解析Windows操作系统(第5版·英文版)[M].人民邮电出版社,2009(09):161-170.
[4]周爱民著.Delphi源代码分析[M].电子工业出版社,2004(09):193-205.
[5]Rad Studio Topics.Embarcadero Rad studio 10.2 Help system (2017).http://www.Embarcadero.com
[6]苏春晓,王鹏等.基于网络的数字示波器远程集中软件平台[J].太赫兹科学与电子信息学报,2014,12(06):884-889.
[7](美)Scott Myrers,侯捷译 More Effctive c++ 55个改善编程与设计的有效方法[M].北京工业出版社,2017(04):151-158.
作者简介
张翔宇(1983-),河北省秦皇岛市人。硕士学位。工程师。主要研究方向为遥感信息接收与处理、计算机仿真等。
蔡文斋(1962-),陕西省西安市人。工程硕士。高级工程师。主要研究方向为航天测控工程开发研究、工程控制类应用开发研究,软件测试等。
刘剑锋(1972-),黑龙江省绥化市人。博士学历。高级工程师。主要研究方向为遥感信息接收与处理、系统仿真。
作者单位
1.北京市遥感信息研究所 北京市 100011
2.中国电子科技集团公司第39研究所 陕西省西安市 710065