【ZDog】国庆七天乐,吃了薯条更快乐,今天就来画个3D薯条【国庆特别版】

1,944 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

介绍

我们心心念念的国庆就要开始啦,假期人挤人,不如宅家里,自然少不了废宅快乐水和薯条啦。

本期我们就会利用Zdog.js这款轻量级的3d引擎绘制薯条。因为我也是刚开始玩这款引擎,所以如果做的不好还请多包含。。

VID_20210929_163958.gif

因为本期存在这大量重复的绘制代码,所以我们只讲关键的部分。大致会从基本结构,薯条盒子,绘制薯条来讲解。

正文

1.基础结构

我们本次由vite做的搭建,不说别的,先来安装一下vite和zdog吧。

yarn add -D vite
yarn add zdog

接下来,我们要在创建index.html,里面用module模式引入app.js作为主逻辑脚本。

<canvas id="canvas"></canvas>
<script type="module" src="./app.js"></script>

当然我们吃薯条前要有个仪式感,当然要先铺个桌布啦。

* {
    padding: 0;
    margin: 0;
}

html,
body {
    width: 100%;
    min-height: 100vh;
    position: relative;
    overflow: hidden;
}
#canvas {
    background-image: repeating-linear-gradient(
        0deg,
        hsla(340, 87%, 75%, 0.2) 0px,
        hsla(340, 87%, 75%, 0.2) 30px,
        transparent 30px,
        transparent 60px
    ),
        repeating-linear-gradient(
            90deg,
            hsla(340, 87%, 75%, 0.2) 0px,
            hsla(340, 87%, 75%, 0.2) 30px,
            transparent 30px,
            transparent 60px
        ),
        linear-gradient(90deg, rgb(255, 255, 255), rgb(255, 255, 255));
}

很轻松的,我们就利用repeating-linear-gradient循环出一个铺满全屏的粉色桌面。

微信截图_20210929165132.png

然后,我们就开始写主逻辑了,先引入然后初始化一下。

/*app.js*/
import * as Zdog from "zdog";

const illo = new Zdog.Illustration({
  element: "#canvas",
  resize: "fullscreen",
  dragRotate: true,
  zoom: 1.2
});

function animate() {
  illo.updateRenderGraph();
  requestAnimationFrame(animate);
}

animate();

这里不像three.js那样要假设摄像机,各种灯光等操作。我们只要使用Illustration产生实例,element是要使用的画布元素,resize为fullscreen,我们期望画布会铺满屏幕,dragRotate开启后就可以用鼠标来拖动,zoom是缩放大小。

然后只要调用实例下的updateRenderGraph方法来更新,配合 requestAnimationFrame来实现重绘。

2.薯条盒子

我们这里主要讲述几种形状的绘制。

new Zdog.Rect({
  addTo: illo,
  width: 150,
  height: 100,
  stroke: 5,
  color: "rgb(249,78,65)",
  fill: true,
  translate: {
    x: 0,
    y: 120,
  },
  rotate: {
    x: Zdog.TAU / 4,
  },
});

我们利用Rect类先创建一个矩形,这些参数顾名思义,需要注意的是Zdog.TAU是zdog里面的常量,可以理解为2*PI。

微信截图_20210929170344.png

然后我们继续再学Shape类,他是zdog中最强的图形类,因为他可以根据你传入的路径变成任何图形。

let cartonSide1 = new Zdog.Shape({
  addTo: illo,
  path: [
    {
      x: 75,
      y: 120,
      z: 0,
    },
    {
      x: -75,
      y: 120,
      z: 0,
    },
    {
      x: -100,
      y: -30,
      z: 30,
    },
    {
      x: 100,
      y: -30,
      z: 30,
    },
  ],
  stroke: 5,
  fill: true,
  color: "rgb(255,111,86)",
  translate: {
    x: 0,
    y: 0,
    z: 50,
  },
  rotate: {
    x: 0,
  },
});

微信截图_20210929170943.png

我们是要形成盒子,这样写还是太麻烦了,我们就可以利用实例中的copyGraph方法,克隆出一个相同的面来,改变一下角度就可以满足需求了~

cartonSide1.copyGraph({
  translate: {
    x: 0,
    y: 0,
    z: -50,
  },
  rotate: {
    y: Zdog.TAU / 2,
  },
});

微信截图_20210929171150.png

至于后面的操作,也是蛮繁琐的,就是利用这些简单的方法去绘制,这里就不多占用篇幅了。

最后,是这样的:

微信截图_20210929171219.png

3.绘制薯条

我们绘制薯条还会学一个Box类,顾名思义,他是专门绘制盒子的,具有长宽高等属性设置起来十分的方便。

let ff = new Zdog.Box({
  addTo: illo,
  width: 20,
  height: 20,
  depth: 240,
  stroke: false,
  color: "rgb(255,222,93)",
  leftFace: 'rgb(255,222,73)',
  rightFace: 'rgb(255,222,64)',
  translate: {
    x: 0,
    y: -10,
  },
  rotate: {
    x: Zdog.TAU / 4,
  },
});

另外还要值得说的就是zdog也可以设置面的颜色,我们这里就设置了左右面不同的颜色。

微信截图_20210929171624.png

就一根太像香炉了,咱们多方几根吧,国庆七天咱们就放气根,还是利用copyGraph做拷贝来实现。

ff.copyGraph({
  depth: 220,
  translate: {
    x: -50,
    y: 0,
  },
  rotate: {
    x: Zdog.TAU / 4,
    y: Zdog.TAU / 36,
    z: Zdog.TAU / 2,
  },
})

这里就先写一个,后面太多重复的就不占用篇幅了。

大功告成,在线演示

微信截图_20210929155834.png


Zdog.js还可以创造出好多好有趣的效果,不来尝试一下么~

微信截图_20210929172436.png