讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog
本文作者: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 吧。如果各位感兴趣的话,下一期我将带领大家成为一位代码上的灵魂画手!
五、参考资料
『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~
讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog的更多相关文章
- 讲解开源项目:用 Python 生成有“灵魂”的二维码
本文作者:HelloGitHub-LITTLECHIEH 这是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家推荐一个 Python 开源生成二维码的项目--qrcode ...
- 讲解开源项目:5分钟搭建私人Java博客系统
本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和运行 Tale 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出的< ...
- 讲解开源项目:功能强大的 JS 文件上传库
本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 和付费网盘说再见,跟着本文自己起个网盘(Java 开源项目)
本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 网盘项目. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列. 今天给大家带 ...
- 不想加班开发管理后台了,试试这个 Java 开源项目吧!
本文适合有 Java 基础并了解 SpringBoot 框架的同学 本文作者:HelloGitHub-嘉文 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开 ...
- 不会 Web 开发,也能让数据“动”起来的开源项目!
本文面向有 Python 基础的小伙伴,有 Web 基础的更好 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天要向小伙伴们介绍的是一个 ...
- 支持中文!秒建 wiki 知识库的开源项目,构建私人知识网络
不知道有没有人和我一样,觉得自建的东西是互联网上的"自留地".私人空间,有一种自己的一亩三分地随心所欲的痛快. 比如自建的博客想写什么随笔就写什么,不用取悦读者可以自娱自乐:再比如 ...
随机推荐
- Web很脆弱,SQL注入要了解
SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 通过一下的例子更形象的了解SQL注入: 有一个Login ...
- windows server2012 nVME和网卡等驱动和不识别RAID10问题
安装2012---不识别M.2 nVME,下官方驱动,注入到系统里 缺多驱动---用ITSK万能驱动添加:|Win8012R2.x64(可解决不支持操作系统,win10与server2012R2通用) ...
- 从头开始制作OJ-在线IDE的搭建
大家好,我是Fred913. 之前,我看过各种OJ(OpenJudge) 但是,还是没有自己做的好. 所以,我就来写了这篇教程. 环境 这次,我打算使用这些:PHP 5.6 Nginx/Apache ...
- React 多副本问题
Element ref was specified as a string (MySider) but no owner was set. This could happen for one of t ...
- 『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
- windows+appium自动化,Desired Capabilities参数填写,查看界面信息
前言: 安装JDK并配置环境变量. 安装sdk并配置对应环境变量. 安装appium客户端. 手机打开开发者模式,并启用调试模式. 1.打开Appium客户端,点击Start Server V1.9. ...
- Java中访问修饰符public、private、protecte、default
Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...
- Flink中watermark为什么选择最小一条(源码分析)
昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值) 这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...
- HMM学习
参看博客: 1.https://www.cnblogs.com/skyme/p/4651331.html 2.https://blog.csdn.net/continueoo/article/deta ...
- Asp.NetCore源码学习[1-2]:配置[Option]
Asp.NetCore源码学习[1-2]:配置[Option] 在上一篇文章中,我们知道了可以通过IConfiguration访问到注入的ConfigurationRoot,但是这样只能通过索引器IC ...