閑聊js15: 動畫灵再、數(shù)學(xué)與碰撞檢測1(css3 3D動畫 與 BLFEngine2D 協(xié)同作戰(zhàn))

經(jīng)歷了十多篇的渲染器以及閑聊js: 實(shí)現(xiàn)一個關(guān)鍵的,最小化的亿笤,非場景圖類型的精靈系統(tǒng)(上)閑聊js: 實(shí)現(xiàn)一個關(guān)鍵的翎迁,最小化的,非場景圖類型的精靈系統(tǒng)(下)净薛,我們已經(jīng)有了一個可以演示動畫汪榔,數(shù)學(xué),碰撞檢測的小類庫肃拜。今天是第一篇!

先看gif吧:

demo-0-12.gif
  1. 并行動畫:物體一邊放大痴腌,一邊繞x軸(pitch,上下轉(zhuǎn))旋轉(zhuǎn)燃领,一邊朝前方平移
  2. 達(dá)到要求的位置后士聪,緊接著繞y軸(yaw,左右轉(zhuǎn))旋轉(zhuǎn)一定角度
  3. 上述過程中猛蔽,物體的表面顯示繞z軸(roll剥悟,滾轉(zhuǎn))旋轉(zhuǎn)的精靈和網(wǎng)格背景

本篇目的:
通過一個css 3D 動畫 + BLFRender2D協(xié)同作戰(zhàn)的Demo,來了解

  • 什么是動畫(Animation)
  • 屬性動畫(Property Animation)
  • 動畫按時間發(fā)生的順序進(jìn)行分類
  • css3對動畫的支持
  • css3和BLFRender2D的對接
  • css3中 transition vs animation
  1. 什么是動畫:

按照opengl紅寶書對動畫的定義是: 重繪(repaint)+交換(swapBuffer)

我個人來擴(kuò)展一下對動畫的定義是: 重復(fù)的【更新(update) + 重繪(repaint) + 交換(swapBuffer)】

也就是我們BLFEngine2D中的run所做的事情

run(msec) {

        //更新
        this.updateAll(msec);
        //重繪
        this.renderAll();
        
        //重復(fù)
        //調(diào)用requestAnimationFrame
        requestAnimationFrame((msec) => { this.run(msec) });
    }
  • update中曼库,我們更新我們的位置区岗,角度,縮放凉泄,顏色躏尉,alpha,.......一切可以變化的屬性(例如ios/android中的屬性動畫)

  • repaint中進(jìn)行繪圖渲染,將渲染結(jié)果寫入到后備緩沖區(qū)中

  • swapBuffer是指渲染后后众,提交顯存顯示
    這一步在瀏覽器中你看不到胀糜,因?yàn)闉g覽器(目前只要是繪圖庫,都是雙緩存蒂誉,最大的好處是避免閃爍)幫你做了這部操作教藻。實(shí)際從底層來看,就是經(jīng)典的雙緩存bitblt【閑聊js:創(chuàng)建一個演示用的渲染庫4(渲染表面右锨,像素格式括堤,光柵化,位塊傳輸,圖形與圖像)】操作悄窃。如果是全屏獨(dú)占模式(玩游戲都知道吧讥电,我也不解釋了),則僅僅是雙顯存緩沖區(qū)的指針交換轧抗,讓前緩沖變?yōu)楹缶彺娑鞯校缶彌_變?yōu)榍熬彌_,交替顯示横媚,速度超快(顯示的同時纠炮,另外一個在渲染,玩過dx/gl的同學(xué)應(yīng)該很了解這個機(jī)制)

  1. 屬性動畫:

在我們的的精靈系統(tǒng)中灯蝴,對精靈中的某個或某些屬性進(jìn)行更新和重繪恢口。

在css3/ios/android中都有屬性動畫概念,不了解的話穷躁,可以自己google/baidu一下

  1. 動畫從時間來看耕肩,可以分為連續(xù)動畫和并行動畫兩種類型:順序動畫(SequentialAnimation) / 并行動畫(ParallelAnimation)
  • 順序動畫(SequentialAnimation): 表達(dá)的動作(Action)語義是:
    先...然后...最終....(很顯然需前一個動作完成后,發(fā)出通知:我完成了,誰來繼續(xù)下面的事情呢?)

  • 并行動畫(ParallelAnimation): 表的的動作(Action)語義是:
    一邊.....一邊....(例如:物體一邊擴(kuò)大折砸,一邊旋轉(zhuǎn)看疗,一邊平移)

  1. css3中對動畫的支持:

關(guān)于css3方面的內(nèi)容睦授,請自行參考上述文檔。本篇不做詳解

  1. css3和BLFRender2D的對接(css3代碼來自與apple公司的flipcard demo,修改后用于我的demo)

這些操作比較通用,就定義在BLFES6Lib.js中吧是复!

    //為了防止和jquery名字發(fā)生沖突删顶,增加name后綴
   //例如jquery中是addClass,這里就變成了addClassName

    Element.prototype.hasClassName = function (a) {
        return new RegExp("(?:^|\\s+)" + a + "(?:\\s+|$)").test(this.className);
    };

    Element.prototype.addClassName = function (a) {
        if (!this.hasClassName(a)) {
            this.className = [this.className, a].join(" ");
        }
    };

    Element.prototype.removeClassName = function (b) {
        if (this.hasClassName(b)) {
            var a = this.className;
            this.className = a.replace(new RegExp("(?:^|\\s+)" + b + "(?:\\s+|$)", "g"), " ");
        }
    };

    Element.prototype.toggleClassName = function (a) {
        this[this.hasClassName(a) ? "removeClassName" : "addClassName"](a);
    };
     
    //上面代碼都很簡單,下面這個是加強(qiáng)版的函數(shù)
    Element.prototype.changeClassName = function(remove,add) {
        if(this.hasClassName(remove))
            this.removeClassName(remove);
        if(add)
            this.addClassName(add);
    }
  • 需求描述:
    1. 并行動畫:物體一邊放大淑廊,一邊繞x軸(pitch逗余,上下轉(zhuǎn))旋轉(zhuǎn),一邊朝前方平移
    2. 達(dá)到要求的位置后季惩,緊接著繞y軸(yaw录粱,左右轉(zhuǎn))旋轉(zhuǎn)一定角度
    3. 上述過程中,物體的表面顯示繞z軸(roll画拾,滾轉(zhuǎn))旋轉(zhuǎn)的精靈和網(wǎng)格背景
    4. yaw/pitch/roll【歐拉角】來源于飛行器的姿態(tài)描述啥繁,在3D中用于描述物體的朝向,先暫時了解一下吧青抛。其實(shí)很多基礎(chǔ)知識旗闽,專業(yè)術(shù)語要了解,然后才能更精確的google/baidu,否則范圍太廣适室,搜索不到
timg.jpg
  • css3動畫:
        .container {
            width: 600px;
            height: 400x;
            margin: 0 auto 40px;
            border: 2px solid red;
            perspective: 1200px;
            /* 設(shè)置3D投影矩陣*/
        }
        
        @keyframes myTransform {
            from {
                transform: translate3d(0px, 0px, -5000px) rotateX(-720deg);
                /*從-720度*/
            }
            to {
                transform: translate3d(0px, 0px, 0px) rotateX(720deg);
                /*到720度*/
            }
        }
        
        @keyframes myYrotate {
            from {
                transform: rotateY(0deg);
            }
            to {
                transform: rotateY(720deg);
            }
        }
        
        /*并行動畫*/
        .animation {
            width: 100%;
            height: 100%;
            transform-style: preserve-3d;
            /*使用3d變換*/
            animation: myTransform 5s;
        }
        
         /*順序動畫第二步*/
        .animation1 {
            width: 100%;
            height: 100%;
            transform-style: preserve-3d;
            /*使用3d變換*/
            animation: myYrotate 5s;
        }
  • html層次樹及css3使用如下:
<body>
    <h1>隨風(fēng)而行之青衫磊落險峰行 BLFRender2D + CSSAnimation3D Demo</h1>

    <section class="container">
        <canvas id="myCanvas" class="animation" width="600" height="400">
        你的瀏覽器還不支持哦
    </canvas>
    </section>
</body>
  • js控制代碼:
  var init = function() {
        let animationDiv = document.getElementById("myCanvas");
        //初始化時候嫡意,canvas上的動畫使用的是上下旋轉(zhuǎn)及向前平移(典型的并行動畫),一旦完成后
        //觸發(fā)webkitAnimationEnd事件
        //對webkitAnimationEnd事件進(jìn)行處理捣辆,切換css為左右旋轉(zhuǎn),很典型的順序動畫
         //當(dāng)完成一個動畫序列后鹅很,瀏覽器會發(fā)送一個完成事件
        //我們對該事件進(jìn)行處理就可以了animationDiv.addEventListener("webkitAnimationEnd", function() {
            animationDiv.changeClassName("animation", "animation1");
        }, false);
    };

    //掛接init事件處理函數(shù)
    window.addEventListener('DOMContentLoaded', init, false);

    let canvas = document.getElementById("myCanvas");
    let context = canvas.getContext('2d');
    let engine = new BLFEngine2D(context);
    let spr2 = new BLFDemoSprite(true);
    spr2.y = 200;
    spr2.rotateSpeed = -1; //逆時針
    engine.sprMgr.addSprite(new BLFGridSprite("background"));
    engine.sprMgr.addSprite(spr2);
    engine.run(); //run的是BLFSprite精靈系統(tǒng)的動畫

運(yùn)行一下看效果:http://htmlpreview.github.io/?https://github.com/jackyblf/BLF_JS_Demos/blob/master/css3withBLFRender2D.html

可能看不到效果,我也不知道為什么,也懶得花時間解決了

大家可以到我的github上下載代碼
如果感覺不錯罪帖,給我的github加顆小星星促煮,鼓勵鼓勵我!

對了整袁,在使用css3中的animation/transition中遇到一些問題菠齿,然后查了一些資料結(jié)合實(shí)踐,總結(jié)一下一起分享吧:

  1. transition簡單易用坐昙,但是有如下幾個缺點(diǎn):
  1. 沒法自動運(yùn)行(init中),只能靠事件觸發(fā)(例如click)
  2. 無法循環(huán)運(yùn)行绳匀,只能一次結(jié)束
  3. 只能設(shè)置開始,結(jié)束狀態(tài)炸客,無中間任意多的過度狀態(tài)設(shè)置
  4. 只能animate一個屬性疾棵,例如設(shè)置了移動就不能旋轉(zhuǎn)
    綜上所述,transition全部的缺點(diǎn)就是animation的優(yōu)點(diǎn)痹仙!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是尔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子开仰,更是在濱河造成了極大的恐慌拟枚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众弓,死亡現(xiàn)場離奇詭異恩溅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谓娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門脚乡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滨达,你說我怎么就攤上這事奶稠。” “怎么了弦悉?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵窒典,是天一觀的道長。 經(jīng)常有香客問我稽莉,道長瀑志,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮劈猪,結(jié)果婚禮上昧甘,老公的妹妹穿的比我還像新娘。我一直安慰自己战得,他們只是感情好充边,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著常侦,像睡著了一般浇冰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋亡,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天肘习,我揣著相機(jī)與錄音,去河邊找鬼坡倔。 笑死漂佩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罪塔。 我是一名探鬼主播投蝉,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼征堪!你這毒婦竟也來了瘩缆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤请契,失蹤者是張志新(化名)和其女友劉穎咳榜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽锥,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年畔柔,在試婚紗的時候發(fā)現(xiàn)自己被綠了氯夷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡靶擦,死狀恐怖腮考,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玄捕,我是刑警寧澤踩蔚,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站枚粘,受9級特大地震影響馅闽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一福也、第九天 我趴在偏房一處隱蔽的房頂上張望局骤。 院中可真熱鬧,春花似錦暴凑、人聲如沸峦甩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凯傲。三九已至,卻和暖如春嗦篱,著一層夾襖步出監(jiān)牢的瞬間冰单,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工默色, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留球凰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓腿宰,卻偏偏與公主長得像呕诉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吃度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color甩挫,font,text-align椿每,li...
    wzhiq896閱讀 1,731評論 0 2
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color伊者,font,text-align间护,li...
    love2013閱讀 2,303評論 0 11
  • 看了很多視頻亦渗、文章,最后卻通通忘記了汁尺,別人的知識依舊是別人的法精,自己卻什么都沒獲得。此系列文章旨在加深自己的印象痴突,因...
    DCbryant閱讀 1,854評論 0 4
  • 變形--旋轉(zhuǎn) rotate() 旋轉(zhuǎn)rotate()函數(shù)通過指定的角度參數(shù)使元素相對原點(diǎn)進(jìn)行旋轉(zhuǎn)搂蜓。它主要在二維空間...
    阿振_sc閱讀 934評論 1 5
  • 我是255號星寶寶糕點(diǎn)女王小楊,正在參加日記星球21天蛻變第六期第9天辽装。今天的日記是一個迷失的故事帮碰。 有一個商人...
    糕點(diǎn)女王小楊閱讀 177評論 1 2