教你用开源 JS 库快速画出 GitHub 章鱼猫

本文作者:HelloGitHub-kalifun
在上一篇文章我们介绍了 Zdog 如何使用,接下来这篇文章我将带领各位利用 Zdog 画出一个 GitHub 章鱼猫(和官方的还是有些差别的)。
Zdog 项目地址:https://github.com/metafizzy/zdog
一、分析
通过上面的动画,我们可以对 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 class="zdog-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 扩充你的武器库从这里开始!
阅读完本文后 “灵魂小画师” 是否从此诞生了呢?✌️

“旋转跳跃我闭着眼睛”
四、参考资料
『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~
教你用开源 JS 库快速画出 GitHub 章鱼猫的更多相关文章
- arcgis api for js之echarts开源js库实现地图统计图分析
前面写过一篇关于arcgis api for js实现地图统计图的,具体见:http://www.cnblogs.com/giserhome/p/6727593.html 那是基于dojo组件来实现图 ...
- arcgis api 3.x for js 之 echarts 开源 js 库实现地图统计图分析(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 学习OpenSeadragon之一(一个显示多层图片的开源JS库)
OpenSeadragon是一个可以显示多层图片(可放大缩小)的Web库,基于JavaScript,支持桌面和手机. 由于我项目需要,却没有找到任何中文教程,因此在官网上一边学习,一边总结于此. 官网 ...
- 2016 GitHub章鱼猫观察报告之开源统计
导读 GitHub 又发布了一年一度的章鱼猫观察报告.在这个报告中,分别对开源和社区做了一些有趣的统计,现将其中一些有趣的数据和趋势撷取出来分享给大家.完整的报告请移步Github. GitHub 上 ...
- 4种方法生成二维码 (js 控制canvas 画出 二维码)
随着网络的迅速发展 发展 发展,二维码的应用将会越来越多.同时很多只是很平凡的二维码,请拿起你的手 把这个二维码 设计起来吧.下面分享了几个非常好的二维码设计. 二维码原理: 二维条码/二维码可以分 ...
- mac下教你如何开源项目托管GitHub
自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 这里教大家如何把代码库上传到G ...
- 在Vue将第三方JS库封装为组件使用
第三方JS库地址:https://github.com/inorganik/CountUp.js 使用NPM进行安装: npm install --save countup 根据官方回答,CountU ...
- 一个很酷炫也挺实用的JS库leader-line
简单粗暴,直入主题,看看效果再说. 是不是这效果挺棒?这样的效果在做系统时,可以有很多的应用,可以让枯燥的页面生动起来. 具体效果,大家可以上这个搜索网站Mag[i]上面看,切身体会一下. 这是一个开 ...
- 进阶攻略|最全的前端开源JS框架和库
新的 Javascript 库层出不穷,从而Web 社区愈发活跃.多样.在多方面快速发展.详细去描述每一种主流的 Javascript框架和库近乎不可能,所以在这篇文章中主要介绍一些对前端发展最具影响 ...
随机推荐
- Ajax数据解析格式
Ajax数据解析格式 一.前言 在服务器端 AJAX 是一门与语言无关的技术.在业务逻辑层使用何种服务器端语言都可以. 从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送.服务器端的编 ...
- HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树
hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...
- 牛客暑假多校第五场 D inv
题意:给你一个n, 接来下给你一个 [1,n] 中偶数的排列, 还有一个 [1, n] 中 奇数 按照递增的顺序排列, 现在求一个原数列, 使得偶数列排序 和 奇数列 都是原数列的一个子序列, 现在求 ...
- 牛客小白赛4 A 三角形 数学
链接:https://www.nowcoder.com/acm/contest/134/A来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想 ...
- 多级树的深度遍历与广度遍历(Java实现)
目录 多级树的深度遍历与广度遍历 节点模型 深度优先遍历 广度优先遍历 多级树的深度遍历与广度遍历 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍 ...
- 创建最简单的exe形式COM组件并在MFC程序调用
来新公司学习接手新项目,拿到代码打开解决方案看到里面竟然有40几个工程,有点吃惊.具体看代码也有很多之前没见过的写法,上了几天火. 有件事就没太搞明白,按照文档的说法上层很多软件都要调用IO服务器,但 ...
- Java常见面试题-1
问: 1 面向对象的特征有哪些方面? 2 访问修饰符public,private,protected,以及不写(默认)时的区别? 3 String 是最基本的数据类型吗? 对象类型 基本类型 4 ...
- Erlang模块erl翻译
命令: erl 概述: Erlang模拟器 描述: erl程序启动一个Erlang运行时系统.准确的信息是依赖于系统的(举例,erl是否是脚本或程序,其它程序调用). ...
- Ubuntu系统添加用户权限
一.首先创建一个新用户: sudo adduser hadoop 其次设置密码: sudo passwd hadoop 如果无法使用root密码,请输入如下命令: sudo passwd root 二 ...
- javascript合并两个数组
在开发的过程中,我们很多时候会遇到需要将两个数组合并成一个数组的情况出现. var arr1 = [1, 2, 3]; var arr2 = [4, 5, 6]; // 将arr1和arr2合并成为[ ...