《每周一點canvas動畫》——3D點線與水波動畫

2022-01-02 HTML5cn

每周一點canvas動畫代碼文件

在上一章中,我們介紹了很多在三維環境下物體的運動效果。雖然環境是三維的了,但不管是ball.js,還是tree.js總的來說還是二維的物體。這一章我們就介紹怎樣使用canvas API來創建三維的物體。

從本節開始,文章的前半部分我們繼續介紹動畫的一些理論知識。後半部分我會運用前面章節中的知識點,分享一些DEMO動畫。動畫的源碼會放到share文件夾下。

1、點和線


在上一章中,連線隨機球體間的位置可以形成如下的效果,具體代碼在line-3d-1.html中。這裡我們仍舊使用的是ball3d.js文件。


效果似乎還不錯。但是,如果我們想要其中的線條,怎麼辦呢?。一個很好的方法是設置ball.radius = 0!ok,我們看看效果如何。


目標達成,所有的球體的半徑都變成了0,形成了我們想要的效果。但如果想要創造一些更加複雜的3D物體,總不能所有的點都是用球體來佔位吧!下面是我們定義的ball3d的屬性,對於點來說,仔細觀察你就會發現,這裡面有很多冗餘的屬性。

function Ball3d(radius,color){    if(radius === undefined) {radius = 40;}       //默認半徑,點是無大小的!kill    if(color === undefined){color = '#00ff00';}   //大小都沒有了,還要顏色!kill    this.x = 0;                                //用於確定二維的坐標    this.y = 0;    this.xpos = 0;      //用於在三維環境中的位置變換,最終還是反應到二維坐標上!合併    this.ypos = 0;    this.zpos = 0;    this.vz = 0;            //速度kill    this.vx = 0;    this.vy = 0;    this.radius = radius;   //kill    this.rotation = 0;      //單個點無興趣!kill    this.mass = 1;            //點無質量, kill    this.scaleX = 1;        //大小都沒了,還要scale有何用!kill    this.scaleY = 1;    this.name = "";            //kill    this.color = utils.parseColor(color); //kill    this.lineWidth = 1;    //kill    this.visible = true;   //不可見多餘!kill}

把不要的屬性全部kill掉,現在我們創建一個新的類文件叫point3d.js。屬性經過精簡,並且集成了透視(perspective)和坐標旋轉等功能。具體代碼如下,首先看基本屬性:

function Point3d(x, y ,z){    this.x = (x === undefined) ? 0 : x;    //位置    this.y = (y === undefined) ? 0 : y;    this.z = (z === undefined) ? 0 : z;        this.fl = 250;      //焦距      this.vpX = 0;       //消失點    this.vpY = 0;        this.cX = 0;        //中心點    this.cY = 0;    this.cZ = 0; }

然後是各種方法。

設置消失點

Point3d.prototype.setVanishingPoint = function(vpX, vpY){    this.vpX = vpX;    this.vpY = vpY;}

設置中心點

Point3d.prototype.setCenter = function(cX, cY, cZ){    this.cX = cX;    this.cY = cY;    this.cZ = cZ;}

旋轉X, Y ,Z

Point3d.prototype.rotateX = function(angleX){    var cosX = Math.cos(angleX),        sinX = Math.sin(angleX),        y1 = this.y * cosX - this.z * sinX,        z1 = this.z * cosX + this.y * sinX;            this.y = y1;        this.z = z1;}Point3d.prototype.rotateY = function(angleY){  ...}Point3d.prototype.rotateZ = function(angleZ){  ...}

計算屏幕坐標

Point3d.prototype.getScreenX = function(){    var scale = this.fl / (this.fl + this.cZ);    return this.vpX + (this.cX + this.x) * scale;}Point3d.prototype.getScreenY = function(){    var scale = this.fl / (this.fl + this.cZ);    return this.vpY + (this.cY + this.y) * scale;}

ok,大功告成!具體代碼請查看point3d.js,通過它我們就能創建任意我們想要的圖形。圖形的創建相對來說比較枯燥,我們放到下一節來講,下面我們介紹本節的分享DEMO。

2.水波動畫


水波動畫用到的知識點在《每周一點canvas動畫》——三角函數(2)中的平滑運動部分,主要運用三角函數來控制某一個點位置的移動。由於三角函數sin,cos的值域處於[-1, 1]之間,所以讓它乘以一個比較大的數,如100,我們就可以得到一個比較大的值域變化區間[-100, 100]。同時,值的變化並非是線性的,我們用這一特性來形成平滑運動。DEMO圖如下:


最上面的按鈕控制波浪的運動速度(Speed), 波的高度(Height),波峰之間的寬度(Width)。下面有3個顏色按鈕,控制水波的顏色。

水波的形成有很多種方法,我們這裡是用豎直線條構成,也就是說如果canvas的寬度為500,那麼我們就用500根線條來組成。當然除了線條還可以使用矩形或是比較寬的線條,只不過形成的波面不會如此平滑,會出現鋸齒。下面我們看下核心代碼:

//繪製函數function draw(angle){               for(var i =0; i< lineNum; i++){                  var point={                              x: i,                              y: waterLine + Math.sin(angle+speed)*waterTop                          };                                     ctx.beginPath();                   ctx.lineWidth=1;                   ctx.strokeStyle= color;                   ctx.moveTo(point.x,500);                   ctx.lineTo(point.x, point.y);                   ctx.stroke();                                     angle += angleChange               }               speed += speedChange;          }

核心代碼就這麼簡單,在每一幀中我們都繪製lineNum數量的線條,每一根線條頂點的Y坐標,我們通過waterLine+Math.sin(angle)*waterTop來控制。這樣由於線條的高度不同,總體的外邊界就形成了sin波形的包絡。

雖然,線條的高度出來了。那麼,如何讓它有運動的效果呢?這裡,我們思路是在下一幀改變每根線條的高度值(通過改變speed值)。這樣在每一幀每一根線條都發生高低錯落的變化,反映到整體上就是波形向前或向後運動。具體代碼請查看share/wave.html

ok!本節我們就到這裡!see you!

原文連結

https://segmentfault.com/a/1190000007003958

原作者:

我仍舊在這裡





相關焦點

  • 《每周一點canvas動畫》——差分函數的妙用
    每周一點canvas動畫代碼文件好像上次更新還是十一前,這唰唰唰的就過去大半個月了,現在更新我也沒什麼不好意思的。
  • 《每周一點canvas動畫》——3D物理效果
    在上一節《每周一點canvas動畫》——3維環境搭建中我們詳細的介紹了要想在2D的畫布上實現立體效果,需要做哪些事情。
  • 每周一點 canvas 動畫丨差分函數的妙用(文末有福利)
    每周一點 canvas 動畫代碼文件:https://github.com/supperjet/H5-Animation/tree/master
  • 《每周一點canvas動畫》——3維環境搭建
    每周一點canvas動畫代碼文件在上一篇《每周一點canvas動畫》——從2D到3D中,我們討論了要在2D的平面實現3D的效果,是一件多麼複雜的事情
  • HTML5 Canvas火焰畫筆動畫
    收錄於話題 #炫酷動畫 插件簡介在上一篇文章中,我們分享了一個利用HTML5技術在Canvas上實現的煙花動畫,效果非常震撼。
  • HTML5 超炫酷 3D 煙花動畫
    ,這個煙花動畫是3D立體的,而且煙花燃放是帶有立體的聲音,看上去非常不錯。這個煙花動畫厲害的地方在於,它構造了一個3D的場景,觀看煙花的視角可以不停地變化,造成視覺上的3D效果,再結合禮炮聲音,就更如身臨其境了。
  • Canvas 動畫製作
    學過SVG的童鞋應該知道它是可以製作動畫,那麼Canvas是否能製作動畫呢?答案是肯定的。所以今天我們就給大家來介紹一下Canvas製作動畫。Canvas動畫製作原理簡單一句話概括:不斷的繪製與清除。Canvas實現動畫步驟(不斷循環)1、更新繪製的對象(比如位置的移動)2、清除畫布3、在畫布上重新繪製對象Canvas 動畫相關命令clearRect方法context.clearRect
  • HTML5 Canvas 動畫實例
    動畫的概念及原理1.動畫動畫是通過一幅幅靜止的,內容不同的畫面(即幀)快速播放使人們在視覺上產生運動的感覺。這是利用了人類眼睛的視覺暫留原理。利用人的這種生理特性可製作出具有高度想像力和表現力的動畫影片。
  • 打造高大上的Canvas粒子動畫
    1   繪製粒子輪廓圖首先要在canvas畫布上繪製一個由粒子組成的輪廓圖,記錄下每一個粒子的坐標,這樣才能有後續的動畫。1. 創建一個<canvas>元素,並獲取Canvas畫布渲染上下文
  • Canvas 動畫的性能優化實踐
    在實現這個動畫的過程中加深了對 canvas 動畫的一些了解,在這裡我僅是拋磚引玉的分享一下,歡迎各位大佬批評。代碼已上傳至 github 【https://github.com/wanqihua/blog】,感興趣的可以 clone 代碼到本地運行。
  • canvas繪製折線路徑動畫
    image.png其中的效果是一個折線路徑動畫效果,如下圖所示:動畫.gif要實現以上路徑動畫,一般可以使用svg的動畫功能。或者使用canvas繪製,結合路徑數學計算來實現。動畫1.gif漸變我們知道漸變沒法沿著任意路徑,如果計算折線,分段計算漸變又很麻煩。
  • 超炫酷HTML5 Canvas蝴蝶飛舞動畫
    收錄於話題 #炫酷動畫 插件簡介還記得早些時候我們為大家分享過一款非常炫酷的HTML5蝴蝶3D動畫,它是基於HTML5和SVG實現的,效果十分逼真。
  • 3D動畫怎麼做?3D動畫製作流程是怎麼樣的?
    3D動畫怎麼做?3D動畫製作流程是怎麼樣的?最近很多企業客戶諮詢:3D動畫怎麼做?3D動畫製作流程是怎麼樣的?商迪3d是否可以提供3d動畫製作服務,或三維動畫視頻製作服務。今天小迪給大家分享一下關於3d動畫製作流程小知識.
  • 純CSS實現簡單骨骼動畫
    於是拿起工卡開始擺動,看看現實中的擺動效果是咋樣的,最後豁然開朗:原來現實中的心願牌(和工卡同理)在受力的時候,並不會整體擺動,而是會根據節點位置分成幾部分有關聯地擺動,這其實是個簡單的骨骼動畫!那到底怎麼去實現呢?骨骼動畫▼關於前端骨骼動畫的實現可以參考《骨骼動畫原理與前端實現淺談》,裡面簡單提及了css和canvas兩種實現方式。
  • 7款超華麗的HTML5 Canvas文字動畫特效
    在線演示/源碼下載2、超華麗CSS3 3D五彩發光文字動畫不久前我們已經為大家介紹過一些炫酷的CSS3文字動畫和HTML5文字特效,有些都非常不錯,比如最近剛分享的CSS3文字跳動旋轉動畫以及HTML5 Canvas幻彩火焰文字特效。
  • 3d動畫製作建築宣傳片的作用介紹
    3d動畫製作建築宣傳片是三維動畫中較為獨特的一種類型,它利用三維軟體技術將建築以及建築相關活動以動畫的形式進行展示。3d建築動畫製作一般根據設計圖紙製作出虛擬的建築環境,包括地理位置、建築外觀、植被覆蓋以及娛樂設施等內容,在領域內發揮著重要的作用,下面藝虎動畫便進行具體的介紹。
  • 上海3d動畫製作給我們帶來哪些改變
    伴隨動畫技術的不斷發展,3d動畫製作給我們的生活、學習、工作、娛樂等都帶來了多方面的變化。許多3d影視大片豐富了我們的精神世界,同時巧妙的動畫製作還能為我們的學習和工作帶來幫助。下面藝虎動畫小編便從受眾、客戶以及行業發展三個方面來分析,3d動畫製作給我們帶來的改變。
  • 必備的Canvas接口和動畫效果大全
    CanvasRenderingContext2D.closePath():結束路徑,返回到當前路徑的起始點,會從當前點到起始點繪製一條直線。如果圖形已經封閉,或者只有一個點,那麼此方法不會產生任何效果。CanvasRenderingContext2D.moveTo():設置路徑的起點,即將一個新路徑的起始點移動到(x,y)坐標。
  • 3d視頻製作,機械三維動畫,3dmax產品動畫和傳統動畫有什麼不同?
    經常有朋友問小迪,你們公司是做3D動畫製作的,有什麼動畫視頻可以給到小朋友看嗎?這、這、這……【商迪3D】3D產品動畫大眾理解的動畫製作分為二維動畫製作、三維動畫製作和定格動畫製作,至於網頁上流行的flash動畫不屬於純二維動畫;二維動畫和三維動畫是如今世界上運用得比較廣泛的動畫形式。
  • 全國3d動畫製作公司排名情況分析
    3d動畫製作又稱為三維動畫製作,是隨著計算機軟硬體技術的發展而產生的一種新興技術,被廣泛應用於影視製作、建築施工、產品廣告、醫學醫療等眾多領域,發揮出重要的作用。3d動畫製作公司憑藉先進的技術,建立虛擬的空間,生動形象的傳達信息,受到越來越多的認可。那麼,3d動畫製作公司的排名情況如何?