本文作者:HelloGitHub-kalifun

HelloGitHub 的《讲解开源项目》系列,项目地址:https://github.com/HelloGitHub-Team/Article

今天给大家推荐一个使用 JavaScript 语言编写的开源 Web 3D 模型项目 —— Zdog。

一、介绍

1.1 Zdog

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

Tips: 本文出现的所有作品都是通过 Zdog 完成的。

圆形、扁平、设计师友好用于 canvas 和 SVG 的伪 3D 引擎。

使用 Zdog 您可以在 Web 上设计和渲染简单的 3D 模型。Zdog 是一个伪 3D 引擎。它的几何形状存在于 3D 空间中,但呈现为扁平形状,这使 Zdog 特别。

1.2 Zdog 特点

  • 体积小:整个库只有 2100 行代码,最小体积为 28 KB。
  • 图形圆滑:所有的圆形都呈现为圆边,没有多边形锯齿。
  • 使用友好:使用 API 完成建模。

二、方法介绍

解释说明均在代码中以注释方式展示,请大家注意阅读。

2.1 初始静态演示

让我们进入一个基本的非动画演示。

静态演示只需要在画布上将想要绘画的图像渲染出来就可以了。

// Illustration是顶级类,用于处理<canvas>或<svg>元素,保存场景中的所有形状,并在元素中显示这些形状。
let illo = new Zdog.Illustration({
// 用class选择器设置画布
element: '.zdog-canvas',
}); // 画圆
new Zdog.Ellipse({
// 将形状添加到illo
addTo: illo,
// 设置圆的直径
diameter: 80,
// 设置画笔宽度
stroke: 20,
// 设置圆的颜色
color: '#636',
}); // 更新所有显示属性并渲染到illo画布上
illo.updateRenderGraph();

2.2 动画

为实现动画场景,我们需要每帧重新渲染图形在画布上。

let illo = new Zdog.Illustration({
// 用id选择器设置画布
element: '#zdog-canvas',
}); // 画圆
new Zdog.Ellipse({
addTo: illo,
diameter: 80,
// 你可以理解z轴向前移动40个像素
translate: { z: 40 },
stroke: 20,
color: '#636',
}); // 画矩形
new Zdog.Rect({
addTo: newcanvas,
width: 80,
height: 80,
// 你可以理解z轴向后移动40个像素
translate: { z: -40 },
stroke: 12,
color: '#E62',
fill: true,
}); function animate() {
// 通过逐步增加xxx.rotate.y来改变场景的旋转。值越大越快。
illo.rotate.y += 0.03;
illo.updateRenderGraph();
// 动画下一帧继续执行函数
requestAnimationFrame( animate );
}
// 开始动画,执行函数
animate();

2.3 放大

Zdog 需要设置大量数字。设置 zoom 将按比例缩放整个场景。

// Illustration是顶级类,用于处理<canvas>或<svg>元素,保存场景中的所有形状,并在元素中显示这些形状。
let illo2 = new Zdog.Illustration({
// 用class选择器设置画布
element: '.zdog-canvas2',
// 将图形放大4倍
zoom: 4,
});
// 画圆
new Zdog.Ellipse({
// 将形状添加到illo2
addTo: illo2,
// 设置圆的直径
diameter: 80,
// 设置画笔宽度
stroke: 20,
// 设置圆的颜色
color: '#636',
}); // 更新所有显示属性并渲染到illo画布上
illo2.updateRenderGraph();

2.4 拖动旋转

通过在插图上设置 dragRotate:true 来拖动来启用旋转。

let newcanvas2 = new Zdog.Illustration({
// 用id选择器设置画布
element: '#zdog-canvas2',
dragRotate: true,
}); // 画圆
new Zdog.Ellipse({
addTo: newcanvas2,
diameter: 80,
// 你可以理解z轴向前移动40个像素
translate: { z: 40 },
stroke: 20,
color: '#636',
}); // 画矩形
new Zdog.Rect({
addTo: newcanvas2,
width: 80,
height: 80,
// 你可以理解z轴向后移动40个像素
translate: { z: -40 },
stroke: 12,
color: '#E62',
fill: true,
}); function animate2() {
// 通过逐步增加xxx.rotate.y来改变场景的旋转。值越大越快。
newcanvas2.rotate.y += 0.03;
newcanvas2.updateRenderGraph();
// 动画下一帧继续执行函数
requestAnimationFrame( animate2 );
}
// 开始动画,执行函数
animate2();

三、快速入手

下面我们将一步步的讲解如何使用 Zdog 这个库。我们采用的是最简单的 CDN 引用方式,方便大家能够快速体检其魅力(复制代码便可查看效果)。

Tips: 解释说明均在代码中以注释方式展示,请大家注意阅读。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>zdog</title>
<style type="text/css">
.zdog-canvas {
/*给class="zdog-canvas"的画布添加背景*/
background: #FDB;
}
</style>
</head>
<body>
<!--Zdog在<canvas>或<svg>元素上呈现。-->
<!--设置画布1,及长宽-->
<canvas class="zdog-canvas" width="240" height="240"></canvas>
<!--设置画布2,及长宽-->
<canvas id="zdog-canvas" width="240" height="240"></canvas>
<!--引入zdog文件-->
<script src="https://unpkg.com/zdog@1/dist/zdog.dist.min.js"></script>
<script>
// Illustration是顶级类,用于处理<canvas>或<svg>元素,保存场景中的所有形状,并在元素中显示这些形状。
let illo = new Zdog.Illustration({
// 用class选择器设置画布
element: '.zdog-canvas',
}); // 画圆
new Zdog.Ellipse({
// 将形状添加到illo
addTo: illo,
// 设置圆的直径
diameter: 80,
// 设置画笔宽度
stroke: 20,
// 设置圆的颜色
color: '#636',
}); // 更新所有显示属性并渲染到illo画布上
illo.updateRenderGraph(); let newcanvas = new Zdog.Illustration({
// 用id选择器设置画布
element: '#zdog-canvas',
}); // 画圆
new Zdog.Ellipse({
addTo: newcanvas,
diameter: 80,
// 你可以理解z轴向前移动40个像素
translate: { z: 40 },
stroke: 20,
color: '#636',
}); // 画矩形
new Zdog.Rect({
addTo: newcanvas,
width: 80,
height: 80,
// 你可以理解z轴向后移动40个像素
translate: { z: -40 },
stroke: 12,
color: '#E62',
fill: true,
}); function animate() {
// 通过逐步增加xxx.rotate.y来改变场景的旋转。值越大越快。
newcanvas.rotate.y += 0.03;
newcanvas.updateRenderGraph();
// 动画下一帧继续执行函数
requestAnimationFrame( animate );
}
// 开始动画,执行函数
animate(); </script>
</body>
</html>

第一个画布是初始静态演示,第二个画布是动画,第三个画布是由第一个画布放大,第四个画布是通过拖动实现不规则旋转

四、总结

Zdog 可以设计和显示简单的 3D 模型而不需要很多开销。这让我们成为一个灵魂画手简单了很多,如果你想给自己的网站增添色彩,不妨试试 Zdog 吧。如果各位感兴趣的话,下一期我将带领大家成为一位代码上的灵魂画手!

五、参考资料

Zdog官方文档


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

讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog的更多相关文章

  1. 讲解开源项目:用 Python 生成有“灵魂”的二维码

    本文作者:HelloGitHub-LITTLECHIEH 这是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家推荐一个 Python 开源生成二维码的项目--qrcode ...

  2. 讲解开源项目:5分钟搭建私人Java博客系统

    本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和运行 Tale 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出的< ...

  3. 讲解开源项目:功能强大的 JS 文件上传库

    本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  4. 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. 让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  6. 和付费网盘说再见,跟着本文自己起个网盘(Java 开源项目)

    本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 网盘项目. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列. 今天给大家带 ...

  7. 不想加班开发管理后台了,试试这个 Java 开源项目吧!

    本文适合有 Java 基础并了解 SpringBoot 框架的同学 本文作者:HelloGitHub-嘉文 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开 ...

  8. 不会 Web 开发,也能让数据“动”起来的开源项目!

    本文面向有 Python 基础的小伙伴,有 Web 基础的更好 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天要向小伙伴们介绍的是一个 ...

  9. 支持中文!秒建 wiki 知识库的开源项目,构建私人知识网络

    不知道有没有人和我一样,觉得自建的东西是互联网上的"自留地".私人空间,有一种自己的一亩三分地随心所欲的痛快. 比如自建的博客想写什么随笔就写什么,不用取悦读者可以自娱自乐:再比如 ...

随机推荐

  1. Java并发编程实战笔记—— 并发编程4

    1.同步容器类 同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁保护复合操作. 容器上常见的复合操作包括但不限于:迭代(反复访问数据,直到遍历完容器中所有的元素为止).跳转(根据指定顺 ...

  2. python基础--列表,元组

    list1 = [1,2,3,4,5,6]list2 = ['wang','cong']# 1对列表中的元素取值(通过索引)print(list1[3]) # 4print(list2[1]) # c ...

  3. 『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)

    0.前言 深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内 ...

  4. 面试java_后端面经_5

    情话部分: 小姐姐:为什么有很多人在感情中付出很多,却得不到想要的结果? 你答:我听过一个这样的故事:讲的是蚯蚓一家人,有一天,蚯蚓爸爸特别无聊,就把自己切成了俩段愉快的打羽毛球去了,蚯蚓妈妈见状,把 ...

  5. spring cloud 断路器 Hystrix

    一.微服务架构中使用断路器的原因 二.代码实现 1.在Ribbon中使用短路器 1.1.引入依赖 <dependency> <groupId>org.springframewo ...

  6. APP手机商城系统选择,混合开发与原生开发哪个好?

    关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...

  7. 《统计学习方法》极简笔记P5:决策树公式推导

    <统计学习方法>极简笔记P2:感知机数学推导 <统计学习方法>极简笔记P3:k-NN数学推导 <统计学习方法>极简笔记P4:朴素贝叶斯公式推导

  8. map redcue filter sorted函数

    sorted 函数 接收一个key函数来实现自定义的排序 # 训练集和验证集的文件命名不一样 # test1: data/test1/8973.jpg # train: data/train/cat. ...

  9. 《MyCat分库分表策略详解》

    在我们的项目发展到一定阶段之后,随着数据量的增大,分库分表就变成了一件非常自然的事情.常见的分库分表方式有两种:客户端模式和服务器模式,这两种的典型代表有sharding-jdbc和MyCat.所谓的 ...

  10. java学习之- 线程继承Thread类

    标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...