本文作者: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. 最简单的DWR例子

    什么是DWR? DWR是一个Open Source的 java项目.DWR可以让JavaScript调用运行在Web服务器里面的JAVA程序.简单一点或者专业一点就是Easy AJAX for JAV ...

  2. android ——悬浮按钮及可交互提示

    一.悬浮按钮 FloatingActionButton是Design Support中的一个控件,它会默认colorAccent作为按钮的颜色,还可以给按钮一个图标. 这是没有图标的,这是有图标的. ...

  3. HDU 4635 (完全图 和 有向图缩点)

    题目链接:HDU  4635 题目大意: 给你一个有向图,加有向边,使得这个图是简单有向图.问你最多加多少条有向边. 简单有向图: 1.不存在有向重边. 2.不存在图循环.(注意是不存在 “图” 循环 ...

  4. echarts3.x遇到的坑

    此文章用来记录echarts3.x遇到的坑,方便以后自己不再犯. 1.柱形图设置了yAxis.splitArea.show=true,后面设置的splitLine就会变不可见了.也没在官方文档中找到说 ...

  5. 面试java后端面经_2

    1 自我介绍(介绍一下帅气的自己哦) 2 对象深浅复制(浅复制:对象内引用的对象不会复制,深复制会把引用对象复制.如何进行深浅复制,这块不懂的童鞋可以百度一下) 3 wait方法和sleep方法的区别 ...

  6. centos7通过yum安装docker

    ##yum源安装#1.更新yumyum update #2.删除旧版本yum remove docker \docker-client \docker-client-latest \docker-co ...

  7. Window服务基于Quartz.Net组件实现定时任务调度(二)

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  8. java学习二

    一.类 1.类是模子,确定对象将会拥有的特征(属性)和行为(方法) 2.类的特点: (1).类是对象的类型 (2).具有相同属性和方法的一组对象的集合 3.类是抽象的概念,仅仅是模板,比如说:“手机” ...

  9. JD面试 || 移除教室人数

    在昨天参加了东哥的笔试,选择题做的还算可以,但是还有道编程题和关于jdk8的Stream特性难住了.鉴于此用博客总结一下这道编程题,并结合Stream特性来简化代码,熟悉Api. 题目描述 某校在积极 ...

  10. OCP培训 MySQL OCP认证实战培训【低价送OCP考证名额】

    一.OCP培训 MySQL 5.7 OCP认证全套实战培训[低价送OCP考试名额] 课程目标: 风哥为满足想参加MySQL OCP考证的学员,而设计的一套比较全面OCP实战培训课程. 课程涉及MySQ ...