教你用開源 JS 庫快速畫出 GitHub 章魚貓

2020-12-07 HelloGitHub

本文作者:HelloGitHub-kalifun

Zdog 項目地址:https://github.com/metafizzy/zdog

在上一篇文章我們介紹了 Zdog 如何使用,接下來這篇文章我將帶領各位利用 Zdog 畫出一個 GitHub 章魚貓(和官方的還是有些差別的)。

一、分析

通過上面的動畫,我們可以對 GitHub 章魚貓進行分析,給我們最直觀的就是 7 部分。頭部、臉、眼睛、鼻子、嘴巴、鬍鬚、耳朵。

頭部:由一個規則的實體圓角矩形組成。臉:有兩個規則的實體圓角矩形組成。第一層是製作陰影,第二層是臉。眼睛:由三個橢圓形組成的眼睛,然後利用複製生成另一隻眼睛。鼻子:由一個橢圓形組成。嘴巴:由一個橢圓形變成一個半圓形則是嘴巴啦。鬍鬚:由兩條曲線進行複製完成。耳朵:由帶圓形底座的方形圓柱組成。通過上面分析我們需要使用的 API:

Zdog.Anchor:將多個形狀或項目合併成一個項目來進行渲染等。Zdog.Group:控制渲染順序,繼承 Anchor,形狀將按照添加到組中的順序呈現。Zdog.RoundedRect:圓角矩形,使用 cornerRadius 設置圓角半徑。Zdog.Cone:帶圓形底座的方形圓柱。Zdog.Shape:自定義形狀的形狀類。Shape 的形狀由其路徑定義。Zdog.TAU:以弧度為單位的完整旋轉。Math.PI * 2 == TAU,但比 PI 更加友好,因為 TAU 直接映射到完整旋轉。copy:針對相同的形狀進行複製。copyGraph:複製帶有子項的項目。二、步驟

Tips:解釋講解均在代碼中以注釋方式展示,請大家注意閱讀。

2.1 創建畫布

是時候開始表演了,首先需要創建畫布。代碼如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>GitHub 章魚貓</title> <style> .zdog-canvas{ display: block; margin: 0px auto; }</style></head><body><!--Zdog在<canvas>或<svg>元素上呈現。width和height屬性以設置大小。--><canvas width="1200" height="800" style="width: 600px;height: 400px"></canvas><!--引入js文件--><script src="https://unpkg.com/zdog@1/dist/zdog.dist.min.js"></script><script> // 1.將選定畫布,進行創作 let illo = new Zdog.Illustration({ element: ".zdog-canvas", dragRotate: true, }); //下面是準備的配色 // 瞳孔的顏色 const colorFeatures = "#AB5C53"; // 頭的顏色 const black = "#211F1F"; // 陰影的顏色 const colorShadow = "#C39B88"; // 皮膚的顏色 const colorSkin = "#E5C0AA"; // 眼睛最外圈的顏色 const white = "#FFF"; //---------------------------- //下面的所有代碼將都在這裡書寫 //---------------------------- illo.updateRenderGraph();</script></body></html>2.2 畫頭

按照我們之前分解的,先畫 GitHub 章魚貓的頭。代碼如下:

// 可以添加到Zdog場景的所有項目都充當錨點。const head = new Zdog.Anchor({ addTo: illo, translate: { // 向y軸移動 y: 15 },});// 具有分離渲染順序的項目。繼承Anchor。const domepiece = new Zdog.Group({ addTo: head});// 真正進行畫頭,是一個實體矩形const noggin = new Zdog.RoundedRect({ addTo: domepiece, // 設置高度和寬度 width: 160, height: 66, // 渲染形狀線並設置線寬。默認筆劃:1。 stroke: 230, // 使用cornerRadius設置圓角半徑 cornerRadius: 20, // 設置顏色 color: black, path: [ { x: -4.5 }, { x: 5.5 } ]});效果如下:

2.3 畫臉

面部的實現代碼如下:

// 我們需要畫下一組圖形,那就是臉。臉被定義為一組const face = new Zdog.Group({ addTo: head, // 將陰影部分進行位置的調節 translate: { // x軸我們不動,保持正中 x: 0, // y軸進行往下移動 y: 36, // 為了3D更加真實,我們需要將臉部往外突出一點。這樣才更加逼真 z: 20 },});// 下面我們開始進行陰影的繪畫,它是由一個實體矩形組成const skinShadow = new Zdog.RoundedRect({ addTo: face, // 設置高度和寬度 width: 100, height: 0, // 渲染形狀線並設置線寬。默認筆劃:1。 stroke: 180, //使用cornerRadius設置圓角半徑 cornerRadius: 40, // 設置顏色 color: colorShadow,});// 下面開始畫臉的部分const skin = new Zdog.RoundedRect({ addTo: face, // 高寬和上面需要一直,為了產生陰影的效果,我們只需要將我們的畫筆的寬度小一點並就可以看到想要的效果。 width: 100, height: 0, // 比之前的陰影部分減小一點 stroke: 170, // 圓角半徑和陰影部分是一致的 cornerRadius: 40, // 設置顏色 color: colorSkin, // 為了和陰影的下半部分重疊,需要將其往下移動 translate: { y: 4.5 }});效果如下:

2.4 畫眼睛

眼睛部分因為是相同的,所以我們會用到 copy 方法,代碼如下:

// 眼睛最外部分為純白色const iris = new Zdog.Ellipse({ addTo: eye, // 渲染內部形狀區域 fill: true, width: 40, height: 56, // 圓角半徑 stroke: 2, // 放大或縮小項目幾何體 scale: 1.5, color: white,});// 瞳孔部分const pupil = new Zdog.Ellipse({ addTo: eye, // 設置長寬 width: 37, height: 56, stroke: 0, fill: true, color: colorFeatures, // 由於它的位置需要更靠近右邊 translate: { x: 3, y: 5, z: 0 },});// 然後是瞳孔裡的小白點const anotherpupil = new Zdog.Ellipse({ addTo: pupil, // 設置寬度 width: 10, height: 10, color: white, fill: true, stroke: 0, // 設置位置 translate: { x: -7, y: -12, z: 3 }});// 這裡將剛繪畫好的左眼複製出來const eyeright = eyeleft.copyGraph({ // 並調整好眼睛的位置 translate: { x: 76, y: 6, z: 80 }, rotate: { y: TAU / -14 }});效果如下:

2.5 畫鼻子

代碼如下:

// 畫鼻子部分,相對很簡單,因為就是一個圓形const nose = new Zdog.Ellipse({ addTo: face, // 設置寬度 width: 6, height: 6, fill: true, stroke: 10, // 設置顏色 color: colorFeatures, // 調整位置 translate: { x: 0, y: 32, z: 74 },});效果如下:

2.6 畫嘴巴

代碼如下:

//接下來是畫嘴巴部分const mouth = new Zdog.Ellipse({ addTo: face, // 設置圓的直徑 diameter: 30, // 將其設置為1/4的圓,我們取值為2,所以獲得半圓 quarters: 2, // 設置圓角半徑 stroke: 4, // 將半圓進行縮放,使其更加逼真 scale: { x: 0.8, y: 1 }, color: colorFeatures, // 將半圓進行旋轉,讓開口向上 rotate: { x: TAU / 2.3, z: TAU / -4 }, // 然後再對其調整合理的位置 translate: { x: 0, y: 46, z: 74 },});效果如下:

2.7 畫耳朵

// 畫耳朵// 帶圓形底座的方形圓柱// 繪畫左耳const ear = new Zdog.Cone({ addTo: head, // 設置圓的直徑 diameter: 120, // 設置長度 length: 90, stroke: false, color: black, // 調整位置 translate: { x: -120, y: -105 }, // 圓角朝向為正z軸,因此需要對其旋轉 rotate: { x: TAU/4, y: TAU/12 },});// 繪畫右耳,將左耳進行複製,移動,旋轉ear.copy({ translate: { x: 120, y: -105 }, rotate: { x: TAU/4, y: TAU/-12 },});效果如下:

2.8 最後一步畫鬍鬚

終於到了最後一步,它即將生靈活現起來。代碼如下:

// 開始進行畫鬍鬚// shape自定義形狀const whisker = new Zdog.Shape({ addTo: whiskers, path: [ // 起始點 { x: 100, y: 0 }, // 曲線的橢圓適合由前一個拐角和終點形成的矩形。 { arc: [ // 拐角 { x: 30, y: -10 }, // corner // 終點 { x: -30, y: 0 }, // end point ]} ], closed: false, // 鬍鬚的寬度 stroke: 4, color: black,});// 左側的另一條鬍鬚,只需要按照上面的設置進行下移即可whisker.copy ({ path: [ { x: 100, y: 0 }, { arc: [ { x: 30, y: -5 }, // corner { x: -30, y: 10 }, // end point ]} ], // 將鬍鬚往下移 translate: { y: 20 },});// 將左側的鬍鬚複製進行移動並旋轉const whiskersright = whiskersleft.copyGraph({ translate: { x: 290, y: 20 }, rotate: { y: TAU/2, },});完成效果如下:

三、總結

文中的代碼已開源到 GitHub 地址:https://github.com/HelloGitHub-Team/Article/blob/master/contents/JavaScript/Zdog_advance/index.html

當我們對代碼進行分析時,其實感覺並沒有想像中的複雜,我們需要精心去進行分析。把需要的形狀先構思好,然後再參考 zdog 文檔,有沒有快捷的方式獲得你想要的形狀。有了這個庫是不是對自己的畫畫能力又有了新的認識呢?這裡是 HelloGitHub 擴充你的武器庫從這裡開始!

閱讀完本文後 「靈魂小畫師」 是否從此誕生了呢?

「旋轉跳躍我閉著眼睛」

四、參考資料

Zdog 官方文檔[1]效果來源[2]參考資料

[1]Zdog官方文檔: https://zzz.dog/

[2]效果來源: https://www.17sucai.com/preview/1750622/2019-08-08/ztocat/index.html

『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發起者不再孤單。跟著我們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯繫我們、加入我們,讓更多人愛上開源、貢獻開源~

相關焦點

  • QRCanvas-動態生成二維碼的開源優秀js庫
    QRCanvas-動態生成二維碼的開源優秀JS庫 今天分享的 QRCanvas 則是專門滿足如何在前端生成動態二維碼的需求。QRCanvas 功能特性API 非常簡單,簡單到只需要一個文本參數就能生成二維碼雖然調用簡單,但也提供了強大的定製化功能零依賴,只需要瀏覽器支canvas,兼容性極佳支持 vue / react 等框架以及 cdn 引入的方式在前端使用,也支持 node.js 後端調用
  • Bootstrap Icons - bootstrap 專用的漂亮開源圖標庫,可以免費商用
    Bootstrap 圖標庫 全部是 SVG 文件格式,能夠輕鬆快捷地進行縮放,保證清晰,並可以通過 CSS 設置顏色。雖然 Bootstrap 圖標庫 是為 Bootstrap 而開發的,但也可以應用在任何項目。
  • 2018 年度新增開源軟體排行榜之國產 TOP 50
    項目主頁:https://github.com/vuejs/vuepress開源協議:MIT開發語言:JavaScript、TypeScript項目作者:@EvanYouZeu.js 是一個 JavaScript 庫,其中包含一系列預構建的可視化組件,用於構建實時 TV 儀錶板,監控 UI 和物聯網 Web 界面。
  • 2018年1月份GitHub上最熱門的開源項目
    通過 Python 腳本自動運行,讓你輕鬆霸榜。可能剛開始上手的時候,因為時間距離之間的關係把握不恰當,只能跳出幾個就掉到了臺子下面。如果能利用圖像識別精確測量出起始和目標點之間測距離,就可以估計按壓的時間來精確跳躍。
  • Feather Icon - 簡單漂亮的免費開源圖標庫
    一套面向設計師和開發者,功能性強、風格高度一致的免費開源圖標庫。介紹Feather 是一套面向設計師和開發者的開源圖標庫,是一個簡單漂亮的開源圖標庫。 每個圖標都設計在一個24×24的網格上,強調簡單,一致性和易讀性。
  • "妙筆"生花:一個易用、高效的文本生成開源庫
    隨著研究的不斷深入,文本生成領域下的子任務和相應的模型越來越豐富,一些優秀的開源框架也紛紛湧現。 現有的開源文本生成庫大致可分為兩類,一類傾向於模塊化驅動,提供各個組件供研究者搭建不同的模型,但缺點在於許多特殊的baseline無法通過模塊完成;另一類傾向於baseline驅動,方便用戶快速調用baseline,但缺點在於整體結構不夠統一,可擴展性有限。
  • 讓你的GitHub下載飛速提升到2M/s以上
    GitHub 鏡像訪問這裡提供兩個最常用的鏡像地址:https://github.com.cnpmjs.orghttps://hub.fastgit.org也就是說上面的鏡像就是一個克隆版的Github,你可以訪問上面的鏡像網站,網站的內容跟Github是完整同步的鏡像,然後在這個網站裡面進行下載克隆等操作。2.
  • GitHub 熱榜:天才黑客開源新項目,不到 1000 行代碼,1400 Star!
    除了這類主流框架之外,開發者們也會開源一些小而精的框架或者庫。比如今年 4 月份,特斯拉人工智慧部門主管 Andrej Karpathy 開源了其編寫的微型 autograd 引擎 micrograd,該引擎還用 50 行代碼實現了一個類 PyTorch api 的神經網絡庫。目前,micrograd 項目的 GitHub star 量達到 1200 星。
  • GitHub重新上架星標7.2萬熱門開源項目YouTube-dl,是...
    RIAA訴訟理由無效YouTube-dl是一個Python庫,用戶通過該庫可以從七百多個視頻平臺下載付費源文件,包括YouTube、優酷、愛奇藝、B站等主流平臺。YouTobe-dl重新開源案件得以澄清後,GitHub立即恢復了YouTube-dl開源項目,並發布官方博客進行了說明。隨後GitHub執行長Nat Friedman也在第一時間進行了轉推。他說,我們站在開發者的立場上恢復了Youtube-dl回購協議。
  • 這6個開源圖標網站,你知道嗎?
    本期給大家整理了可商用的圖標網站,你還在苦苦的畫 icon 嗎?這些圖標網站可以解放你的雙手公眾號:友設青年一、IconPark網址:http://iconpark.bytedance.comIconPark 是字節跳動公司內部產品體系使用的官方圖標庫,現在可以免費使用了。
  • 用ClickHouse在GitHub上數星星
    在最大的基友交友網站GitHub上,來自世界各地的開源開發者們進行著數百萬個項目。
  • 開源動物園一日遊,獅子,老虎,企鵝,技術圈的這些飛禽走獸你認識多少?
    整理 | 八寶粥 責編 | 張紅月 很多企業的 logo 或者吉祥物都很有意思,以動物居多,天上飛的、地上跑的、草棵裡蹦的、水裡遊的,只有你想不到,沒有畫不出來的。
  • 「挖洞神器」 資產安全燈塔(ARL)正式開源
    鬥象TCC團隊正式發布「ARL資產安全燈塔」開源版,該項目現已上線開源社區GitHub。ARL旨在快速偵察與目標關聯的網際網路資產,構建基礎資產信息庫。協助甲方安全團隊或者滲透測試人員有效偵察和檢索資產,發現存在的薄弱點和攻擊面。
  • Vue.js 0.11.5 發布,JavaScript 庫
    Vue.js 0.11.5 發布,此版本主要是功能改進和 bug 修復:改進bug 修復Fixed an issue
  • Github高贊:給文字打馬賽克=形同虛設,AI看透你一切小心思
    如果現在告訴你,」打碼「已經不再安全,你所想保護的信息,已然如」皇帝的新衣「,你會作何想?不,這不是聳人聽聞,最近一個名為Depix的GitHub項目火了,上線僅僅三天,star量就已經高達7K。截止發文,此項目已經火速達到1w+的star量:而就是這項技術,能夠解碼被打上馬賽克的文字,你的所有努力,甚至有了」欲蓋彌彰「的效果。
  • Bootstrap 開源 SVG 圖標庫 Bootstrap Icons
    Bootstrap 開源了首套 SVG 圖標庫 Bootstrap Icons,其團隊表示這是有史以來第一次擁有自己的圖標庫,此圖標庫起初專門針對其從表單控制項到導航等組件和文檔進行定製設計和構建,現在可以免費用於任何項目,無論此項目是否使用了 Bootstrap。
  • 從噹噹看打造高星 GitHub 開源項目的經驗
    「我們認同馬丁福勒這位代碼溝通大師的理念,任務代碼是給人看的,不是僅僅給機器編譯用的。維護一個有缺陷但是代碼清晰的項目,遠比維護一個代碼混亂但暫時未發現缺陷的項目要更加容易、更加受歡迎。」所以,這兩個組件可以在只做很少改動的情況下開源。1.3 標準既然已經決定開源,項目的質量要求即是以開源的標準來要求。公開給所有人的並不只是功能和文檔,而是全部代碼,這樣的質量要求和做一個內部項目是不同的。我們認同馬丁福勒這位代碼溝通大師的理念,任務代碼是給人看的,不是僅僅給機器編譯用的。
  • 人工智慧拯救渣畫手,我分分鐘畫只貓給你看!
    不過,我們剛剛發現了一個AI小應用,分分鐘就能畫只貓出來。這個網頁版小應用叫edges2cats,你畫個輪廓,它會自動生成一隻貓。總的來說效果還看得下去:但也有網友生成出了驚人之作:這個項目的作者是Christopher Hesse,Pushbullet聯合創始人。
  • React Native 0.16 發布,用 React 編寫移動應用
    Modules using RCTSparseArray should update. fa0b45cRCTWebViewExecutor was removed. 0764e4e下載:https://github.com/facebook/react-native/archive/v0.16.0.zip。