怎么flash网站在xml里ppt添加flash图片?

flash调用外部图片的xml怎么写
flash调用外部图片的xml怎么写 50
我flash的文件已经做完~是一个一共十张图片从左到右循环滚动,鼠标滑过的时候图会切换到另外一张图片,但是可能以后会定期更换图片~不想在源文件里更换~想写一个xml的代码~以后就在xml更换或修改图片~请问xml的代码应该怎么写~flash里应该添加什么代码能和xml链接上
请求高手详解最好每句代码后面都有注释~非常感谢~
不区分大小写匿名
写在xml里面
&?xml version="1.0" encoding="GBK"?&&slider&&item href="访问地址" title="标题" imageurl="图片路径" /&&item href="访问地址" title="标题二" imageurl="图片路径" /&&item href="访问地址" title="标题三" imageurl="图片路径" /&&/slider&
那和flash链接的代码是什么呀~怎么才能实现图片在和源文件在同一文件夹里~而不是图片在源文件里~
昏~~图片怎么可能在源文件里哦~源文件里调用图片地址
Stage.showMenu =
Stage.scaleMode = "noScale";
fscommand(allowscale, true);
//初始化屏幕大小
System.useCodepage =
//中文支持
imgW = 580;
imgH = 386;
//初始化场景宽度和高度
jTime = 1500;//初始化滚动间隔时间,默认1.5秒
var myLoad = new XML();
myLoad.ignoreWhite =
myLoad.load("imgList.xml");
myLoad.onLoad = function(success) {//装载xml文件
if (success) {
createEmptyMovieClip("img_mc", -16383);//装载成功,初始化滚动mc元件
img_mc.createEmptyMovieClip("loadImg0", 1);//创建loading图片的子元件
img_mc._x = -imgW;//初始化坐标位置
x = 0;//初始化显示图片的指针
imgList();//执行函数imgList();
makeBtn();//创建控制按钮
trace("错误!装载xml文件不成功!");//返回错误信息
function makeBtn() {//本函数初始化控制按钮元件
_root.attachMovie("next_btn", "n_btn", 50);//连接向后的按钮
_root.attachMovie("next_btn", "u_btn", 51);//连接向前的按钮
u_btn._rotation = 180;//控制向前的按钮翻转角度
u_btn._x = imgW-50;//
u_btn._y = imgH-30;//
n_btn._x = imgW-25;//
n_btn._y = imgH-30;//初始化两个按钮的位置
u_btn.onRelease = MoveL//当点此按钮的时候执行向左滚动的函数
n_btn.onRelease = MoveR//‘’‘’‘’‘’‘’‘右滚动的函数
u_btn.onRollOver = function() {//当鼠标在本按钮上的时候清除自动滚动选项
clearInterval(MA);
u_btn.onRollOut = function() {//当鼠标离开后继续自动滚动
MA = setInterval(MoveLeft, jTime);
n_btn.onRollOver = function() {//
clearInterval(MA);
n_btn.onRollOut = function() {//
MA = setInterval(MoveLeft, jTime);
function imgList() {//xml分析函数,并构造滚动元件
myList = myLoad.firstChild.childN
myListLen = myList.
for (i=1; i〈myListLen+2; i++) {
img_mc.loadImg0.duplicateMovieClip("loadImg"+i, i+1);
for (i=0; i〈myListLen+2; i++) {
loadImgs = eval(img_mc["loadImg"+i]);
mcbtns = img_mc.attachMovie("btn_mc", "btn"+i, i+myListLen+4);//连接图片按钮
loadImgs.btn =//初始化各图片对应的按钮
loadImgs.i =//初始化当前图片的指针
loadImgs.loadImg();//执行图片装载函数
function moveImg() {//图片滚动函数
if (x〉myListLen) {//控制向左的循环
img_mc._x = 0;
if (x〈1) {//控制向右循环
x = myListL
img_mc._x = -img_mc._width+imgW;
textValue(myList[x-1].);//执行文本显示函数
onEnterFrame = function () {//循环检测滚动
targetx = -x*imgW;
img_mc._x += (targetx-img_mc._x)*0.2;
if (Math.abs(targetx-img_mc._x)〈=0.2) {//位置符合后停止循环
img_mc._x =
delete onEnterF
function MoveLeft() {//向左滚动
moveImg();
function MoveRight() {//向右滚动
moveImg();
MA = setInterval(MoveLeft, jTime);//自动滚动
MovieClip.prototype.loadImg = function() {//mc装载图片函数
if (this.i == 0) {//在最前增加张最后的图片,方便向左循环。
this.loadMovie(myList[myListLen-1].attributes.path);
} else if (this.i == myListLen+1) {//在最后帧位置怎加第一张图片,方便向右循环
this.loadMovie(myList[0].attributes.path);
this.loadMovie(myList[this.i-1].attributes.path);
this._x = this.i*imgW;//初始化位置,逐个相连接
this.btn._x = this._x;//控制图片上方的透明按钮对应位置
this.btn._width = imgW;//
this.btn._height = imgH;//控制’‘’‘’‘’‘对应尺寸
this.btn.onRelease = function() {//点击图片按钮连接网址
getURL(myList[this.i-1].childNodes);
this.btn.onRollOver = function() {//当鼠标在图片上停止自动滚动
clearInterval(MA);
this.btn.onRollOut = function() {//当鼠标离开图片,继续自动滚动
MA = setInterval(MoveLeft, jTime);
textFiled();
function textValue(myValue) {//为文本框显示图片对应的说明;
myformat = new TextFormat();
myformat.align = "right";
myformat.color = 0
myformat.font = "宋体";
myformat.size = 12;
myformat.bullet =
myformat.underline =
_root.createTextField("mytext", 20, imgW-360, imgH-38, 300, 16);
mytext.selectable =
mytext.text = myV
mytext.setTextFormat(myformat);
不好意思我可能没说明白~因为之前没想到要在外部调用图片~就是按正常的做的~所以所有的图片都在源文件里~为了想到以后方便修改才想到改成在外部调用图片的~是不得把里面的图片都删了~然后按照你这个代码写啊~因为是个flash初学者~这块一点也不会~希望你能详细说明一下被~
如果是flash初学者。我建议你去下载现成的。 现在很多网站都能下载这样的flash文件。
actionScriptSystem.useCodepage =var myXML:XML = new XML();& //定义一个xmlmyXML.ignoreWhite =&&& & //消除xml空格myXML.onLoad = function(success) {&& //xml 加载判断&& &if (success) {&&&&&&&&&&&&&&&&&&&&&& //如果加载成功&& &&&& trace(this);&&&&&&&&&&&&&&&&&&&&&& //输出 该xml 内容//具体的图片排列和鼠标动作代码&& &}};myXML.load("xml文件名");&&&&& //xml 加载 xml文件
相关知识等待您来回答
网页制作领域专家flash xml 图片轮换添加连接
flash xml 图片轮换添加连接 20
&foto photo="img/1.jpg"photo_big="img/1_big.jpg"& /descrizione="Foto1: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut nec dui. Integer tortor wisi, adipiscing id, lacinia in, dapibus ut, leo."&&/foto&&foto photo="img/2.jpg" photo_big="img/2_big.jpg" descrizione="Foto2: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut nec dui. Integer tortor wisi, adipiscing id, lacinia in, dapibus ut, leo."&&/foto&&foto photo="img/3.jpg" photo_big="img/3_big.jpg" descrizione="Foto3: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut nec dui. Integer tortor wisi, adipiscing id, lacinia in, dapibus ut, leo."&&/foto&&foto photo="img/4.jpg" photo_big="img/4_big.jpg" descrizione="Foto4: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut nec dui. Integer tortor wisi, adipiscing id, lacinia in, dapibus ut, leo."&&/foto&&foto photo="img/5.jpg" photo_big="img/5_big.jpg" descrizione="Foto5: Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut nec dui. Integer tortor wisi, adipiscing id, lacinia in, dapibus ut, leo."&&/foto&
larghezzamovie = Stage.
posSin = 1;vel = -3;dimImm = 179;selezione._x = 100;letto =
pos_iniziale = Stage.width-dimI_root.mc_desc.sf_desc._width = pos_
leggi = function () {&nuovo = new XML();&nuovo.ignoreWhite =&nuovo.load("file.xml");&nuovo.onLoad = function(success) {&&if (success) {&&&nfoto = this.childNodes.&&&posDes =&&&for (i=0; i& i++) {&&&&_root.attachMovie("mc","mc"+(i+1),i+1);&&&&_root["mc"+(i+1)]._y = dimImm*i;&&&&_root["mc"+(i+1)]._x = pos_&&&&_root["mc"+(i+1)].big = this.childNodes[i].attributes.photo_&&&&_root["mc"+(i+1)].desc = this.childNodes[i].attributes.&&&&_root["mc"+(i+1)].contenitore.loadMovie(this.childNodes[i].attributes.photo);&&&&_root["mc"+(i+1)]._alpha = 50;&&&&_root.box.clip_mc.loadMovie(this.childNodes[0].attributes.photo_big);&&&&_root.pre.loadMovie(this.childNodes[i].attributes.photo_big);&&&&_root.image = this.childNodes[0].attributes.photo_&&&&_root.mc_desc.descrizione.text = this.childNodes[0].attributes.&&&&_root["mc"+(i+1)].onRelease =&&&&_root["mc"+(i+1)].onRollOver =&&&&_root["mc"+(i+1)].onRollOut =&&&&_root["mc"+(i+1)].onReleaseOutside =&&&}&&&letto =&&} else {&&&_root.didascalia.text = "errore di lettura";&&}&};};leggi();
_root.onMouseMove = function() {&x = _root._&y = _root._&if (x&pos_iniziale) {&&if (y&0 && y&60) {&&&vel = -(Math.round((y-(larghezzamovie/2))/10));
&&}&&if (y&260 && y&larghezzamovie) {&&&vel = -(Math.round((y-(larghezzamovie/2))/10));
&&}&} else {&&if (vel&-1) {&&&vel = 3;&&} else {&&&vel = -3;&&}&}
};function released() {
&_root.image = this.&_root.box.play();&_root.box.clip_mc.loadMovie(_root.image);&_root.mc_desc.descrizione.text = this.&//_root.selezione._y = (larghezzamovie)/2;&//_root.didascalia.text = this.etichetta.
&//getURL(percorso,"_blank")}
function rollover() {&this._alpha = 100;
function rollout() {&this._alpha = 50;
_root.onEnterFrame = function() {&if (letto) {&&for (i=1; i&= i++) {&&&_root["mc"+i]._y +=&&}&&if (vel&0 && _root["mc"+posSin]._y&0) {&&&_root["mc"+posDes]._y = _root["mc"+posSin]._y-dimI&&&posSin = posD&&&posDes--;&&&if (posDes == 0) {&&&&posDes =&&&}&&}&&if (vel&0 && _root["mc"+posSin]._y&=-dimImm) {&&&_root["mc"+posSin]._y = _root["mc"+posDes]._y+dimI&&&posDes = posS&&&posSin++;&&&if (posSin&nfoto) {&&&&posSin = 1;&&&}&&}&}};
想让flash的图片加上连接
不区分大小写匿名
... 问到这里来了
无能为力了,栋哥也弄不了。我研究半天了
//_root.selezione._y = (larghezzamovie)/2;//_root.didascalia.text = this.etichetta.
//getURL(percorso,"_blank")
这前面怎么有注释符?你放的吗?percorso的值是什么?
相关知识等待您来回答
网页制作领域专家FLASH加载XML制作可分页相册教程 - 纯FLASH网站建设,网站制作,网站设计,FLASH开发,FLASH网站,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
本站站长招收AS3学徒、出售完整AS3.0视频教程。联系QQ:8286659。电话:。
FLASH加载XML制作可分页相册教程
关于FLASH加载XML相册,在网上百度一下。一大把源码。但大多都没给出完整教程。刚好最近在写一个相册,所以把完整过程记录一下。权当教程。以供其他朋友借鉴学习。欢迎拍砖。OK,先看下演示:下面讲解详细过程。1、首先,新建一个文件夹,文件夹的名称随你怎么取都OK。用于存放本相册的所有文件。2、然后在文件夹中新建imageda、imagexiao、image.xml、Taoshaw_Photos.fla文件。如图所示:3、然后处理一些图片放进imageda与imagexiao目录中,imagexiao目录中的图片大小为50*50。即,小图片大小。在imageda目录中的图片大小为272*271。当然,这里是我的标准,大家可以自己定义大小的。4、新建xml文件。写XML和格式标准,在此不再多说。内容如下:&?xml version=&1.0& encoding=&utf-8& ?&&imgtao&&img srcxiao=&imagexiao/1.jpg& srcda=&imageda/1.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/2.jpg& srcda=&imageda/2.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/3.jpg& srcda=&imageda/3.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/4.jpg& srcda=&imageda/4.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/5.jpg& srcda=&imageda/5.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/6.jpg& srcda=&imageda/6.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/7.jpg& srcda=&imageda/7.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/8.jpg& srcda=&imageda/8.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/9.jpg& srcda=&imageda/9.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/10.jpg& srcda=&imageda/10.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/1.jpg& srcda=&imageda/1.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/2.jpg& srcda=&imageda/2.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/3.jpg& srcda=&imageda/3.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/4.jpg& srcda=&imageda/4.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/5.jpg& srcda=&imageda/5.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/6.jpg& srcda=&imageda/6.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/7.jpg& srcda=&imageda/7.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/8.jpg& srcda=&imageda/8.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/9.jpg& srcda=&imageda/9.jpg& info=&欢迎光临淘沙网&/&&img srcxiao=&imagexiao/10.jpg& srcda=&imageda/10.jpg& info=&欢迎光临淘沙网&/&&/imgtao&5、新建FLASH中。建立六个图层,图层名称如下:6、然后分别建立背景黑色条、大图片背景、加载进度条、按钮等元件。7、有一个关键的步骤,新建一空影片剪辑。然后拖到场景中,并赋予实例名“pic_holder_mc”。8、然后在as层中添加代码:9、代码及详细讲解如下://================版权声明开始================////★淘沙网://★淘沙网所有教程欢迎转载。不过请转载时注明出处。谢谢合作。//================版权声明结束================//this[&loading_mc&]._visible =//统一编码System.useCodepage =/*初始化类信息开始*///定义总数量var _total:Number = 20;//定义每页显示数量var page_size:Number = 4;//计算总页数var pages:Number = Math.ceil(_total/page_size);var cur_page:Number = 1;//定义XML类var my_xml:XML = new XML();//定义用于接收小图片的数组var my_small_arr:Array = new Array();//定义用于接收大图片的数组var my_big_arr:Array = new Array();//定义用于接收文本信息的数组var my_info_arr:Array = new Array();/*初始化类信息结束*///设置加载路径my_xml.load(&image.xml&);//去掉空格 my_xml.ignoreWhite =//定义用于加载小图的MovieClipLoader类var my_smallClip:MovieClipLoader = new MovieClipLoader();//定义用于显示加载小图信息的新项目var my_smallObj:Object = new Object();my_smallObj.onLoadInit = function(mc):Void
{&&//设置小图片的宽度&&mc._width = 50;&&//设置小图片的高度&&mc._height = 50;&&//设置小图片距离左侧注册点的距离(横向上的)&&mc._x = 3;&&//设置小图片距离左侧注册点的距离(纵向上的)&&mc._y = 2;};//添加监听my_smallClip.addListener(my_smallObj);//定义用于加载小图片被点击后,加载的大图片的MovieClipLoader类var my_bigClip:MovieClipLoader = new MovieClipLoader();//定义用于显示大图片位置等信息的项目var my_bigObj:Object = new Object();my_bigObj.onLoadInit = function(mc):Void
{&&_root.loading_mc._visible =&&//设置大图片的宽度&&mc._width = 272;&&//设置大图片的高度&&mc._height = 271;&&//设置大图片距离左侧注册点的距离(横向上的)&&mc._x = 120;&&//设置大图片距离左侧注册点的距离(纵向上的)&&mc._y = 107;};//添加监听my_bigClip.addListener(my_bigObj);//设置加载成功代码my_xml.onLoad = function(ok:Boolean):Void
{&&//如果加载成功,则运行如下代码&&if (ok) {&&&&//定义加载XML内容的数量&&&&var my_pic_len:Number = my_xml.firstChild.childNodes.&&&&for (var i:Number = 0; i&my_pic_ i++) {&&&&&&//定义node变量,这样做的目的只是为了后面代码的简化&&&&&&var node = my_xml.firstChild.childNodes[i];&&&&&&//将加载的内容添加进前面定义的小图片、大图片、文字信息数组中&&&&&&my_small_arr.push(node.attributes.srcxiao);&&&&&&my_big_arr.push(node.attributes.srcda);&&&&&&my_info_arr.push();&&&&}&&&&//以下用于显示加载的小图片&&&&for (var i:Number = 0; i&5; i++) {&&&&&&_root[&press_btn&+i].img = my_big_arr[i];&&&&&&//在按钮上面新建一个空的MC&&&&&&var mc:MovieClip = _root[&press_btn&+i].createEmptyMovieClip(&mc&, 100+i);&&&&&&//加载图片&&&&&&my_smallClip.loadClip(my_small_arr[i], mc);&&&&&&//当按钮被点击的时候,就加载大图片&&&&&&_root[&press_btn&+i].onPress = function():Void
{&&&&&&&&//加载大图片对象&&&&&&&&my_bigClip.loadClip(this.img, pic_holder_mc);&&&&&&&&//根据XML信息,显示图片说明&&&&&&&&info_txt.text = my_info_arr[i];&&&&&&&&_root.loading_mc._visible =&&&&&&};&&&&&&//默认情况下加载一张大图片&&&&&&my_bigClip.loadClip(my_big_arr[0], pic_holder_mc);&&&&}&&} else {&&}};//上一页按钮代码pre_mc.onRelease = function() {&&load_images(_root.cur_page-1);};//下一页按钮代码next_mc.onRelease = function() {&&load_images(_root.cur_page+1);};//自定义加载分页时数据function load_images(page:Number) {&&//当总页数小于1时,显示第一页内容&&if (page&1) {&&&&page = 1;&&} else if (page&_root.pages) {&&&&page = _root.&&}&&if (page == cur_page) {&&&&&&}&&_root.cur_page =&&var start_index = _root.page_size*(page-1);&&for (var i:Number = 0; i&5; i++) {&&&&if (i&=_total) {&&&&&&&&&&}&&&&_root[&press_btn&+i].img = my_big_arr[start_index+i];&&&&//在按钮上面新建一个空的MC&&&&var mc:MovieClip = _root[&press_btn&+i].createEmptyMovieClip(&mc&, 100+i);&&&&//加载图片&&&&my_smallClip.loadClip(my_small_arr[start_index+i], mc);&&&&//当按钮被点击的时候,就加载大图片&&&&_root[&press_btn&+i].onPress = function():Void
{&&&&&&my_bigClip.loadClip(this.img, pic_holder_mc);&&&&&&_root.loading_mc._visible =&&&&};&&}}//================版权声明开始================////★淘沙网://★淘沙网所有教程欢迎转载。不过请转载时注明出处。谢谢合作。//================版权声明结束================//查看其他比较受欢迎的教程:如何让360度图片旋转180度后隐藏展示flash xml实现
如何让360度图片旋转180度后隐藏展示flash xml实现
09-03-05 &匿名提问 发布
1.计算机动画的基本原理计算机动画是采用计算机技术,以一定速率连续播放的由计算生成的静态画面(帧),利用人眼的视觉残留特性,这些画面序列在人眼的视网膜上形成了连续的变化。对给定的计算机动画应用程序,通常是以每秒更新动画帧的次数即帧速率(fps)来度量其显示能力的。对于较低的帧速率(2fps或3fps),人眼看到的动画是从一幅图像突然“跳到”下一幅图像,当帧速率达到15fps(66.7ms)时会有平滑的活动,但能真正产生计算机平滑动画的最小帧速率是30fps,某些视觉模拟程序中,帧速率甚至要维持在60fps以上。实际得到的帧速率受到计算机运算能力和图像的复杂程度以及操作系统性能的影响。同时计算机监视器的刷新频率也会限制眼睛可以得到的帧速率,超出硬件刷新频率的帧速率没有什么实际意义,但这一点在PC上基本不用担心,因为普通计算机监视器的刷新速度在60Hz以上,在其它应用场合则应该留意一下。2动画分类2.1按照实现方式有以下几种2.1.1实时动画是一种边画边显示的实时动画技术。主要由“绘制——清除——重绘”的循环操作来完成动画的整个过程。由于清除环节的存在会造成屏幕的闪烁。一般采用双缓冲技术来消除动画的闪烁。这种方法的基本思想是提供两个基本缓冲区,在显示前台缓冲内容中的一帧画面时,后台缓冲正在绘制下一帧画面,当绘制完毕,则后台缓冲内容在屏幕上显示出来。而前台缓冲绘制下一幅画面内容。这样循环反复,屏幕上显示的总是已经画好的图形。这种方法受图形生成速度的制约,图形绘制越复杂,则速度越慢。2.1.2非实时动画在开始播放动画之前,将动画序列的各帧绘制好放在内存或文件中,然后顺序播放各帧页面,从而产生动画效果,其缺点是占用存储量较大且不能实时交互,不能实现实时动画(典型的应用便是多媒体文件)。2.2按照动画实现效果可分为2.2.1 2D动画2D动画处理2D图形,其动作只有水平的X轴向与垂直的Y轴向,传统手工漫画 、插画等都属于2D类。2D动画不需要建立模型,是直接“画”出来的,制作动画时通常直接调用已经存放好的图片。2.2.2 3D动画3D动画处理3D图形,其动作内容除了有水平的X轴向与垂直的Y轴向外还有进深的Z轴。3D图形一般是先建立3D模型,然后再投影到显示屏上,3D图形可以包含360度的信息,能从各个角度去表现模型的动作。2.2.3 2D与3D比较 3D动画有非常高的自由度,能够以任意角度来观察模型,可以让模型进行任意方向的动作,这在2D中是实现不了的,但是其计算复杂,需要消耗较多的资源。相对来说,2D动画自由度小,不需要建模和计算,消耗的资源较少,在屏幕上显示和处理就非常快,而且2D图像可以画的非常精致,把一些细节完美地表现出来。3D虽然也能通过增加多边形来更细致地表现对象,但与2D图像所能达到的最高水准还是差一些。但是,随着计算机性能的提升以及3D动画技术的发展,2D动画的优势正在逐渐的消失,3D动画正在引起人们越来越多的兴趣。毕竟我们是生活在一个真实的充满三维物体的三维世界,利用3D技术可以把人和计算机以一种直觉而自然的方式加以统一,3D动画可以应用于仿真、虚拟现实、游戏等等各个方面。医生可以直接查看病人的三维扫描图像,机械工程师可以仿真自己的设计是否达到了运动需求,军事指挥员可以指挥具有真实感的三维飞机、坦克、军舰并进行战斗方案效果分析,看房者可以不必亲临就能看到房子的状况等等。3. 工业控制场合下的动画工业控制中,有不少场合需要根据工业现场传回来的数据进行相应的动画显示,需要实时交互动画。3.1  2D动画3D动画需要建立模型且进行大量的实时计算,考虑到工业现场的实时性要求,我们倾向于用2D动画来实现。 实现方案有以下几种3.1.1调用多媒体文件一般说来,多媒体文件是典型的非实时动画,只能顺序播放,难以满足实时和交互需求。但是在程序中可以实现多媒体文件指定时间段的播放、逆序播放以及暂停播放,或者说,可以调用不同的多媒体文件。利用高级语言(例如C++)来实现实时接收串口数据,根据接收到的不同的串口命令,再来实时调用相应的多媒体文件。应该说,对于动作比较简单的情形,这种方式是可行的,而且对于控制端来说是比较省时省力的。对于动作比较复杂的情形,如果动作之间是相互独立的,没有相互间的影响,那么可以把多媒体文件进行分割,屏幕上不同的部分调用不同的多媒体文件。例如:要显示两只小鱼在两只水缸中游动的情形,两只水缸没有相互间的遮挡,那么可以把小鱼1在水缸1中游动作为一个多媒体文件在窗口左边显示,再把小鱼2在水缸2中游动作为另一个多媒体文件,如果两个动作间是有相互影响的,有相互的遮挡关系,那么这样的一种方案将是不可行的,可以利用下面3.1.2所介绍的调用图片的方法。附录1详述了如何利用Visual C++的MCIWnd控件实现对AVI格式的多媒体文件的实时调用。Flash动画是其中的一个特例。首先,FLASH中有分层的概念,这使得它可以比较容易的实现零部件间的相互遮挡关系。其次,它利用action script脚本语言实现了一定的交互性——可以利用鼠标和键盘来实时控制动画。但是该脚本语言只是一种简单的交互语言,它并未提供实时通讯接口,例如它并不能实时接收经由串口传过来的动画。如果真的要实现这样的一种控制方式,也许可以借助Visual C++实现,因为Visual C++可以实时接收串口数据,关键是在Visual C++中是否可以控制导入VC中的FLASH动画中的控件,而且这些控件最好能够隐藏以避免误操作。3.1.2调用图片    当某些环境条件下,不支持多媒体控件或者当通过调用媒体控件无法满足需求时,可以通过直接调用图片的方法。    2D图片,可以构造非常细致的,非常具有表达力的场景图片,大部分的2D动画都是通过调用图片来实现的。    在图片动画中,可以直接调用整张图片来实现帧动画;还可以进行一些简单的操作,然后再在屏幕上显示出来。这些简单操作主要是指可以在一张图片上叠加另一张图片,然后再一起在屏幕上显示出来,这一点在直接调用多媒体控件实现动画的方案中是做不到的。为了防止屏幕的闪烁,我们仍然采用类似双缓冲的技术——在后台把要进行的图像操作操作完,然后再在前台显示出来。    图片动画的缺点是如果动作稍微复杂一点,用到的图片就会很多,工作量比较大。另外,还涉及到屏幕分辨率的问题。图片要想不失真的显示出来,最好以图片原来的分辨率来显示,进行图片的缩放或者放大将会影响图片的显示效果。这样,图片的分辨率定好之后,窗口的分辨率也就定了,如果说想要修改一下屏幕的分辨率的话,将是非常困难的。为了不失真的显示图片,所有的图片都要重新绘制一次。    对于要进行图片叠加实现的图片动画来说,另外一个问题就是坐标的定位问题。图片叠加的时候,必须精确的定位坐标,不然显示效果将会跟想象的有出入。附录2详述了如何利用Visual C++调用图片实现平面动画。3.1.3直接在程序中绘制及控制动画    应该说,在程序中直接进行图形的绘制,然后进行控制,这样的一种方式将是最直接的和可控制的。但是,一般直接在程序中绘制的图形都是很简单的图形,例如:圆啊,长方体啊,线段啊等,表现力难以与图片媲美(尤其是用专业的平面绘制软件Photoshop、CoreDraw等绘制的图片)。所以,用这种方法实现的2D动画并不多。应该说FLASH也可以算是一种直接在程序中绘制和控制的方法,但是如前所述,它并没有实时通讯的能力,也不太可行。3.2  3D动画有些时候2D动画并不能满足实际物体的动作需求。我们可以想象一下用2D动画实现如下情形:要想仿真一个人大臂抬升的动作,假设动作幅度为180°,每隔1°角做一张图片,那么我们需要180张图片;假如在大臂抬升的同时,我们想让小臂也可以动作,动作幅度为180°,仍是每隔1°角做一张图片,那么我们需要180x180张图片;假如在大小臂抬升的同时,我们想让手腕也动作,作幅度为180°,仍是每隔1°角做一张图片,那么我们需要180x180x180张图片。以上只是假设人在一个平面上的动作,假如我们要仿真胳膊和手腕在空间中的任意角度的任意动作,用2D动画来实现几乎是不可能的。所以在2D动画满足不了需求的时候,我们可以用3D动画来实现。另外,有些情况下需要3D动画的效果,这时候就必须用3D动画了。 3.2.1 实现方案我们可以用直接在程序中对模型进行控制的方法来实现3D动画,进一步地,我们可以使用Visual C++、OpneGL结合3D MAX建模的方法。OpenGL是由SGI公司在其GL(graphics library)基础上发展起来的三维图形库,作为三维图形API的标准,它已被广泛地应用于图形与动画绘制、虚拟现实技术和计算机可视化等领域。OpenGL是一个功能强大的三维图形库,它与操作系统无关,可以很容易的移植到支持OpenGL的操作系统上。OpenGL提供了以下基本操作:绘制基本图元、变换、光照处理、着色、融合、雾化、位图和图像。纹理映射、动画制作等。OpenGL还提供了十几个生成三维实体模型的辅助函数,简单的模型如球体、立方体和圆柱等可以使用这些函数来实现。但是OpenGL没有提供高级命令函数来定义复杂的三维形体,难以满足建立复杂三维实体的需要。既然我们是制作动画,那就对OpenGL的动画制作功能多做一点介绍。OpenGL中提供了双缓冲技术,可以直接开启从而避免屏幕闪烁;OpenGL提供了深度缓冲技术,开启后会根据坐标值自动实现覆盖、遮挡等空间效果。OpenGL提供了三维模型的平移和旋转函数,理论上讲,可以实现对模型的任意运动控制。与此同时,一些优秀的3D建模软件,如3D Studio Max、Maya、SolidWorks等等,可以很方便的来构造复杂的3D模型,但是在这些3D建模软件中很难进行交互式的程序控制,难以满足实时应用系统的需要。为此,我们考虑先在3DMAX等建模软件中建立复杂模型,然后在OpenGL中实现对其控制和变换。OpenGL是一个可移植的,能在微机上实现并且速度很快的3D图形和建模库,使用OpneGL,可以使程序员创建交互式程序来产生三维运动图形。但是OpenGL本身只提供了一系列预封装的图形处理函数,要完成所谓的“OpenGL程序”,必须借助于某种编程语言(Visual C++、Delphi等)。本方案中,我们选择了Visual C++。附录3详述了如何利用Visual C++实现OpenGL以及如何把用3D建模软件建立的3D模型文件导入到OpenGL中的具体过程。3.2.2 使用基于Visual C++的OpenGL实现3D动画所遇到的一些问题3.2.2.1 OpenGL中的坐标系以及零件的平移和旋转问题3.2.2.1.1 OpenGL坐标系在OpenGL中,有两个坐标系,都是左手坐标系,这与通常所用的右手坐标系不太一样,如果稍不留意,会犯下错误,而且有的错误并不易察觉,在这方面我是吃过一次苦头的。这两个坐标系,一个是全局坐标系,是固定不变的全局坐标系,又称为眼睛坐标系(eye coordinate system),简称ECS,另一个是局部坐标系,是可变的局部坐标系,又称为目标坐标系(object coordinate system),简称OCS。初始条件下,ECS和OCS是重合的,我们可以利用glTraslatef、glRotatef和glScalef函数来实现OCS的平移、旋转和缩放。而我们在OpenGL中所绘制的三维模型正是依赖于OCS的,这样,通过坐标系的平移、旋转和缩放,也就实现了三维模型的平移、旋转和缩放。经过一定的变换后,一般OCS和ECS不再重合,这时候我们可以利用glLoadIdentity函数来实现OCS的强制复位,强制使OCS和ECS重合。3.2.2.1.2 绕指定轴旋转问题由上文,用glTraslatef(x,y,z)和glRotatef(rotate,x,y,z)函数来实现三维物体的平移和旋转。平移的情况比较简单,旋转的时候,涉及到一个旋转轴的问题。glRotatef函数默认的旋转轴是以ECS的原点为原点,以glRotatef(rotate,x,y,z)函数参数x,y,z指定的(x,y,z)向量。那么,如何让物体绕指定轴旋转呢? 答案是再glRotatef之前和之后,要调用glTraslatef(a,b,c)和glTraslatef(-a,-b,-c)函数,这样做后三维物体显示的时候的位置并没有改变,但是把旋转轴改变了。先平移还是先旋转会产生不同的结果,这在下面会有交代。glTraslatef(a,b,c)中的a,b,c参数又如何获知呢,要获知a,b,c参数,只要获知旋转轴的中心坐标位置就可以了。旋转轴的中心坐标位置可以用求旋转轴上各点平均值的办法来获知,可以参见附录3。3.2.2.1.3 旋转和平移的顺序问题    很显然,先旋转后平移和先平移后旋转产生的结果是不相同的,不同点就在旋转轴不同。而且,在OpenGL中,由于旋转和平移的是局部坐标系,先平移还是先旋转正好跟我们平常所想的相反,这一点应该注意。3.2.2.2 在OpenGL中实现运动控制OpenGL提供了使三维物体平移和旋转的函数glTranslatef和glRotatef,理论上讲,任何三维物体的运动都可以由平移和旋转来达到。但三维物体的运动不是孤立的,是和其它物体的运动相关联的。以一个四连杆机构的运动为例(如图1)。图中的C点和D点固定,连杆d作为主动件向左旋转,将会带动整个机构向左旋转,需要计算出其它件——连杆b及连架杆c相应的运动情况,并且最后的落脚点要落到每个零件平移了多少,绕哪个轴旋转了多少度,因为最后我们是使用glTranslatef和glRotatef来达到零件运动的目的的。如果整个机构比较复杂的话,一个主动件的旋转将会引起很多其它从动件的运动,每个从动件的运动都是需要经过计算的。 图1 四连杆机构    如果每个零件的计算方法都不一样,整个装配体的运动计算就很麻烦。因此,如果能够考虑一种通用的计算方法,将会减轻程序员的计算思考难度。或者说,如果能够在建立装配体的时候,就能够给零件之间加上相应的约束关系(例如在3D建模软件中,给零件添加相应的约束关系后,各个零件的运动将会受这些约束的制约),将会减轻后面的运动计算难度。这方面的文章不多,在网上见过,关系还没有理顺。3.2.2.3在OpenGL中实现零部件色彩控制    其实,运动是一种动画效果,色彩控制也是一种动画效果。在OpenGL中,开启光源后,零件的颜色是由材质特性——对光源的反射特性来决定的。当读入零件模型的同时,也读入了材质特性,所以我们在程序中看到的模型颜色跟3D建模软件中看到的模型颜色差别不大。当需要对某个特定零件进行颜色控制时,必须先取消原来的读入材质特性。设置允许设置零件的材质特性——glEnable (GL_COLOR_MATERIAL)后,我们可以调用glColor3fv(col)来改变所要绘制的零件颜色值(参数中的col既是用RGB表示的材料颜色值)。3.2.2.4在OpenGL中加入纹理效果    对于纹理效果,我还不太理解。书上的解释是“3D图形中的2D贴图。例如一面墙,可以看成一个大矩形,然后将一幅墙的照片贴上去”。只是从代码上来看,现在的纹理值都设为0,但是在3D Studio MAX中我注意到可以加入纹理效果,现在的3D模型的显示效果还欠佳,也许加入纹理效果会好些?3.2.2.5在OpenGL中实现汉字的显示    在OpenGL中,只提供了绘制字符串和操纵字体的最低级的支持,要想显示ASCII字符甚至汉字并不是直接调用一个函数那么简单。幸运的是,我在网上找到一个显示汉字的类,该类支持在屏幕上输出图像文字、3D文字。虽然该类还存在一些问题,例如在显示3D文字的时候,消耗的内存资源是逐渐增加的,这将最终导致系统资源耗尽,但是该类显示图像文字效果还不错,可以设置文字的字体、大小以及在屏幕上的显示位置。    附录4是该类的源码及一点简单说明。3.2.2.6 实时性分析工业控制场合中,对实时性要求比较高。因此,研究一下如何加快动画的显示速度也是很有必要的,附录5对影响实时性的因素进行了分析。
请登录后再发表评论!}

我要回帖

更多关于 ppt添加flash 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信