教你用开源 JS 库快速画出 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 创建画布

是时候开始表演了,首先需要创建画布。代码如下:



<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>GitHub 章鱼猫</title>

    <style>

        .zdog-canvas{

            display: block;

            margin: 0px auto;

        }

</style>

</head>

<body>

<!--Zdog在或元素上呈现。width和height属性以设置大小。-->

<canvas class="zdog-canvas" width="1200" height="800" style="width: 600px;height: 400px"></canvas>



<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 地址, 点击本文最下方的
“阅读原文”
即可获取

当我们对代码进行分析时,其实感觉并没有想象中的复杂,我们需要精心去进行分析。把需要的形状先构思好,然后再参考 zdog 文档,有没有快捷的方式获得你想要的形状。有了这个库是不是对自己的画画能力又有了新的认识呢?这里是 HelloGitHub 扩充你的武器库从这里开始!
阅读完本文后 “灵魂小画师” 是否从此诞生了呢?:v:


“旋转跳跃我闭着眼睛”

四、参考资料

  • Zdog 官方文档
    [1]

  • 效果来源
    [2]

参考资料

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

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

关注公众号加入交流群,一起讨论有趣的技术话题



讲解开源项目系列


——


让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。

跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎联系我(微信:xueweihan,备注:讲解)加入我们,让更多人爱上开源、贡献开源~



“阅读原文”


获取完整源码、

“在看”

让本文被更多人看到、

“赞赏”

支持我们。



讲解 Zdog 往



































 1


 






















让你成为灵魂画手的 JS 引擎:Zdog