zoukankan      html  css  js  c++  java
  • 教你用开源 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=" 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,
        // 设置高度和宽度
         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,
        // 设置高度和宽度
         100,
        height: 0,
        // 渲染形状线并设置线宽。默认笔划:1。
        stroke: 180,
        //使用cornerRadius设置圆角半径
        cornerRadius: 40,
        // 设置颜色
        color: colorShadow,
    });
    
    // 下面开始画脸的部分
    const skin = new Zdog.RoundedRect({
        addTo: face,
        // 高宽和上面需要一直,为了产生阴影的效果,我们只需要将我们的画笔的宽度小一点并就可以看到想要的效果。
         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,
         40,
        height: 56,
        // 圆角半径
        stroke: 2,
        // 放大或缩小项目几何体
        scale: 1.5,
        color: white,
    });
    
    // 瞳孔部分
    const pupil = new Zdog.Ellipse({
        addTo: eye,
        // 设置长宽
         37,
        height: 56,
        stroke: 0,
        fill: true,
        color: colorFeatures,
        // 由于它的位置需要更靠近右边
        translate: {
            x: 3,
            y: 5,
            z: 0
        },
    });
    
    // 然后是瞳孔里的小白点
    const anotherpupil = new Zdog.Ellipse({
        addTo: pupil,
        // 设置宽度
         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,
        // 设置宽度
         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 扩充你的武器库从这里开始!

    阅读完本文后 “灵魂小画师” 是否从此诞生了呢?✌️

    “旋转跳跃我闭着眼睛”

    四、参考资料


    『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

  • 相关阅读:
    Run Loop简介 分类: ios技术 ios相关 2015-03-11 22:21 73人阅读 评论(0) 收藏
    iOS Socket第三方开源类库 ----AsyncSocket 分类: ios相关 ios技术 2015-03-11 22:14 59人阅读 评论(0) 收藏
    CocoaPods安装和使用教程 分类: ios技术 ios相关 2015-03-11 21:53 48人阅读 评论(0) 收藏
    详解Objective-C的meta-class 分类: ios相关 ios技术 2015-03-07 15:41 51人阅读 评论(0) 收藏
    IOS即时通讯XMPP搭建openfire服务器 分类: ios技术 2015-03-07 11:30 53人阅读 评论(0) 收藏
    IOS之富文本编辑 分类: ios技术 2015-03-06 22:51 89人阅读 评论(0) 收藏
    IOS第三方数据库--FMDB 分类: ios技术 2015-03-01 09:38 57人阅读 评论(0) 收藏
    ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏
    python+day6 json,pickle 模块
    python_day6 log模块
  • 原文地址:https://www.cnblogs.com/xueweihan/p/11611416.html
Copyright © 2011-2022 走看看