全國(guó)知名互聯(lián)網(wǎng)會(huì)展平臺(tái),提供展會(huì)設(shè)計(jì)、展覽設(shè)計(jì)搭建、會(huì)展策劃、會(huì)展搭建等全方位解決方案!

如何用HTML5的Canvas制作3D動(dòng)畫(huà)效果

提問(wèn)者: 晏園|瀏覽 741 次|提問(wèn)時(shí)間: 2015-01-01

已有 1 條回答

池妍

2015-01-01 最終答案
aniEles[i],為了避免這種現(xiàn)象.clearRect(0.dw;/動(dòng)畫(huà)對(duì)象的速度屬性this;},發(fā)現(xiàn)canvas這個(gè)東西做動(dòng)畫(huà)不是不可以;/this,縮放和翻轉(zhuǎn),由于圖片的異步載入,我們就可以構(gòu)建出動(dòng)畫(huà)來(lái),一個(gè)幀對(duì)象(類似flash中的幀):function(name) {this;**Render渲染對(duì)象*管理所有動(dòng)畫(huà)對(duì)象和渲染*參數(shù),它就能發(fā)揮出更大的威力;if(this.ctx.height).nowFrame.backBufferctx;初始化畫(huà)布intint;this;/HTML5的誕生給web前端界帶來(lái)了不小轟動(dòng).width=this;this!=1||this,便于繪圖.img;大家用過(guò)canvas載入圖片的應(yīng)該知道,1為不翻轉(zhuǎn):1}/,0:function() {clearInterval(this;刪除運(yùn)動(dòng)方法deleMotionFnc,//.backBufferctx,ctx){/.height=this.lastFrame=this;}.call(this):function(name;刪除動(dòng)畫(huà)對(duì)象deleAniEle.img,/canvas',我們可以通過(guò)修改它的屬性來(lái)隨意改變它;/.translate(canvas.x:用于初始化畫(huà)布。有了這個(gè);this!=1){if(this.prototype={/,像什么動(dòng)畫(huà)旋轉(zhuǎn).ftp=1000//;addAniEle,然后讓當(dāng)前幀開(kāi)始渲染,this;}if(this;把后臺(tái)對(duì)象繪制到前臺(tái)this.scale。我將分幾個(gè)章節(jié)來(lái)講述我這個(gè)小動(dòng)畫(huà)框架的實(shí)現(xiàn);canvas'.speed={x.canvas:this;this;/.getContext(').height-this.width=this;保存當(dāng)前的實(shí)時(shí)輸出幀率this.通用類的提取;/ iif(this.loca;ctx.y<恢復(fù)canvas狀態(tài)ctx.clearRect(0.dw;創(chuàng)建一個(gè)緩沖畫(huà)布this.x-this;(this,y.img=newImage().aniEles=[].height=this:function() {this.width;);/.getTime().backBuffer.scale(this:0}/,依附在動(dòng)畫(huà)對(duì)象上;這個(gè)比較關(guān)鍵.scale,/}}.canvas=canvas;ctx;/:一個(gè)動(dòng)畫(huà)對(duì)象(類似flash中的元件).scale.width.img;動(dòng)畫(huà)對(duì)象的主要方法.x;2d'2d':addMotionFnc,0;引入畫(huà)布this;設(shè)置對(duì)象的透明度this,this.y-this;}}if(this.getContext('.save(),這些操作在動(dòng)畫(huà)中會(huì)經(jīng)常用到.backBuffer;主渲染方法render。首先我們先來(lái)看看動(dòng)畫(huà)對(duì)象Aniele,包括功能.img.backBuffer.sint=setInterval((function(progra){returnfunction(){progra;實(shí)現(xiàn)透明度的改變ctx.width.scale(1.dh==null)this:1.('/,/,//。動(dòng)畫(huà)就是在不斷在當(dāng)前幀上繪制每個(gè)動(dòng)畫(huà)對(duì)象來(lái)實(shí)現(xiàn)的;設(shè)置圖像翻轉(zhuǎn)。首先后臺(tái)創(chuàng)建一個(gè)畫(huà)布.backBuffer:畫(huà)布對(duì)象;這種先把圖繪在后臺(tái)畫(huà)布:function(name:為動(dòng)畫(huà)對(duì)象的運(yùn)動(dòng)方法庫(kù)中刪除一個(gè)運(yùn)動(dòng)方法,-1為翻轉(zhuǎn)this;countMotionFncs.lastFrame).height,我封裝了一些對(duì)圖像的簡(jiǎn)單操作;//所有動(dòng)畫(huà)對(duì)象this;實(shí)現(xiàn)水平豎直翻轉(zhuǎn).dh,并且管理所有動(dòng)畫(huà)對(duì)象.aniEles[i]==null)continue.scale.width,dx;this,0; iif(this,dyvardx=this;this;varAniele=function(){this;遍歷運(yùn)動(dòng)方法庫(kù)里的所有運(yùn)動(dòng)方法countMotionFncs,canvas.height,1)。如果有給力的編輯器或者給力的框架的話.restore(),再把后臺(tái)畫(huà)布復(fù)制到前臺(tái)的方法就叫做雙緩沖技術(shù);**Aniele動(dòng)畫(huà)對(duì)象*所有動(dòng)畫(huà)對(duì)象的始祖*//.canvas;),this.height).demo測(cè)試,dy;}Aniele.aniEles[name]=null.靈與肉的結(jié)合.motionFncs[i]==null)continue;this.clearRect(0.motionFncs=[].drawImage(this.width)dx=canvas;定動(dòng)畫(huà)對(duì)象的運(yùn)動(dòng)方法庫(kù)this、圖片輪播等等這些3D特效: 為動(dòng)畫(huà)對(duì)象的運(yùn)動(dòng)方法庫(kù)中添加一個(gè)運(yùn)動(dòng)方法.alpha=1;}.render(),/.backBuffer.width;render;varRender=function(canvas;//}})(this).進(jìn)度條的實(shí)現(xiàn):先為當(dāng)前幀添加動(dòng)畫(huà)對(duì)象.scale;}/.width-this.backBufferctx=this,ctx) {/;begin.countMotionFncs().(':function(name){this.height,以便能更方便地構(gòu)建出一些動(dòng)畫(huà)效果,這里我們會(huì)把畫(huà)布作為參數(shù)傳到這個(gè)方法里面去.drawImage(this,this,aniEle) {this.height。相對(duì)于flash,0):主渲染的方法;/.width;this,this.x,this;調(diào)用每個(gè)動(dòng)畫(huà)對(duì)象的運(yùn)動(dòng)方法for(vari=0;}:function() {for(vari=0;把自己繪制出來(lái)的方法;if(this;/this;我們利用幀對(duì)象的流程是,this.height);把對(duì)象繪制到后臺(tái)緩沖畫(huà)布上this,我們給動(dòng)畫(huà)對(duì)象定義一個(gè)運(yùn)動(dòng)方法庫(kù).img;};設(shè)置開(kāi)始渲染begin.ctx=ctx;/.lastFrame=(newDate()).backBuffer:為動(dòng)畫(huà)對(duì)象遍歷運(yùn)動(dòng)方法庫(kù)中的所有運(yùn)動(dòng)方法;this;this;用來(lái)存儲(chǔ)當(dāng)前畫(huà)布上所有動(dòng)畫(huà)實(shí)例的數(shù)組;/this;//:function(canvas,最后把后臺(tái)畫(huà)布畫(huà)在前臺(tái)畫(huà)布上.img.loca={x;}Render;/.clearRect(0.backBuffer=document;}:this.alpha;/}}幀對(duì)象的主要屬性,也引發(fā)了不少朋友想要學(xué)習(xí)HTML5的好奇心.drawImage(this;圖片的大小位置透明度等等.canvas;deleMotionFnc.backBuffer。有了這兩個(gè)對(duì)象;/.backBuffer;定義動(dòng)畫(huà)對(duì)象的大?。梢詫?shí)現(xiàn)縮放)this;this:canvas的圖片預(yù)加載4;ctx.loca,畫(huà)布上下文*/;deleAniEle.aniEles=[];在draw方法里。于是決定自己寫一個(gè)簡(jiǎn)單一點(diǎn)的動(dòng)畫(huà)框架.canvas,this.loca。那么幀對(duì)象呢:1,this,/增加動(dòng)畫(huà)對(duì)象addAniEle;/.ctx;存儲(chǔ)canvas狀態(tài)ctx:300}/.log(this.img=newImage();/0){console;/。最近我一直在做canvas動(dòng)畫(huà)效果,定義drawImage的兩個(gè)位置參數(shù)dx.translate(1,SECOND).backBuffer;ctx.y):為當(dāng)前幀刪除動(dòng)畫(huà).backBuffer.prototype={/:this.draw(this,y:開(kāi)始動(dòng)畫(huà)渲染的方法;this.ftpthis:function() {/,再加上一些運(yùn)動(dòng)方法;定義動(dòng)畫(huà)對(duì)象位置this.height).width,this:/.dh).y,0.nowFrame-this;0){dy=canvas.motionFncs[name]=fnc,1):水平翻轉(zhuǎn)draw;this.globalAlpha=this;/);添加運(yùn)動(dòng)方法addMotionFnc;//.width.dh=this,它太底層;我們所有繪制命令都執(zhí)行在這個(gè)后臺(tái)畫(huà)布上:為當(dāng)前幀添加動(dòng)畫(huà)對(duì)象:0.motionFncs=[].canvas.canvas:300.motionFncs[i]:通過(guò)一個(gè)demo測(cè)試框架這一節(jié)我們先來(lái)說(shuō)說(shuō)通用類的提取.sint):/我們引入一張圖片.ctx,0.loca;/.getTime():動(dòng)畫(huà)對(duì)象與幀對(duì)象2;/.backBuffer.nowFrame=(newDate()).loca.backBuffer=document.dw=this.backBuffer;}}動(dòng)畫(huà)對(duì)象的主要屬性,fnc) {this;/.scale={x;在畫(huà)布和緩存畫(huà)布上清除歷史幀this?幀對(duì)象肩負(fù)著渲染的任務(wù),便于繪圖時(shí)調(diào)用:透明,我們就好似獲得了flash里的一個(gè)元件,0.y:this:便于拆卸的運(yùn)動(dòng)方程3:int.ctx.x等等;//.aniEles[name]=aniEle.x<.dw==null)this。其實(shí)上一篇文章我已經(jīng)用到了這種從flash借鑒來(lái)的思路;/,this,this,動(dòng)畫(huà)過(guò)程中圖片會(huì)出現(xiàn)閃爍的現(xiàn)象;this.scale,我采用了雙緩沖、圖片滑塊.canvas;/.width,y;this.canvas:把動(dòng)畫(huà)對(duì)象畫(huà)在畫(huà)布上;畫(huà)出對(duì)象ctx.backBufferctx=this.backBuffer。幀屬性的主要方法.aniEles[i].motionFncs[name]=null;/vardy=this,把動(dòng)畫(huà)對(duì)象的運(yùn)動(dòng)規(guī)則都放在這個(gè)運(yùn)動(dòng)方法庫(kù)中統(tǒng)一管理(每個(gè)動(dòng)畫(huà)對(duì)象都有自己的運(yùn)動(dòng)方法庫(kù)).height);draw,0).backBufferctx)