微信小游戏之使用three.js 绘制一个旋转的三角形


Posted in Javascript onJune 10, 2019

three.js是一个可以使用javascript绘制3d图形的库,它对WebGL的api进行封装,使开发更加方便,就像jQuery对DOM的api进行封装一样。接下来就记录一下在小游戏中绘制一个 旋转的三角形的步骤:

一. 初始化项目

下载微信官方的开发者工具,然后新建项目

微信小游戏之使用three.js 绘制一个旋转的三角形

appid选择测试号即可,项目路径自行指定

用编辑器打开项目,得到如下目录:

微信小游戏之使用three.js 绘制一个旋转的三角形

然后除了game.js,game.json, project.config.json全部删除,并把game.js中的内容清空。

微信小游戏之使用three.js 绘制一个旋转的三角形

game.js是整个小游戏的入口,game.json是小游戏配置。具体参考文档。

二. 引入three.js 和 Adapter

Adapter

小游戏的运行环境中是没有 BOM 和 DOM 的,使用 wx API 模拟 BOM 和 DOM 的代码组成的库称之为 Adapter。官方提供了一个Adapter,用它就行了。

Adapter文档

three.js

gitHub地址

微信小游戏之使用three.js 绘制一个旋转的三角形

复制three.min.js中的内容

新建目录libs,将three.js和Adapter的源码放在该目录下

微信小游戏之使用three.js 绘制一个旋转的三角形

在game.js中添加:

import './libs/weapp-adapter'
import * as THREE from './libs/three'

三. 绘制三角形

根据adapter的文档只要引入了adapter就会创建一个上屏 Canvas,并暴露为一个全局变量 canvas。

使用three.js渲染一个图形必备的三个条件:渲染器,场景,相机

Renderer 渲染器

渲染器看名字就知道了,就是用于将图形渲染到屏幕上的方法。

Scene 场景

假如把绘制的图形看做是一个个物体的话,那么场景就是用来存放这些物体的地方。

Camera 相机

相机就好像人的眼睛一样,相机用于确定在什么地方去看场景中的物体,就好像有一个东西,不同的角度去看这个物体,看到的有可能是不一样的形状。

在game.js 中创建这三个东西

import './libs/weapp-adapter'
import * as THREE from './libs/three'
const width = window.innerWidth
const height = window.innerHeight
// 创建WebGL渲染器
const renderer = new THREE.WebGLRenderer({
 // 由于weapp-adapter会自动创建一个全屏的canvas所以这里直接用
 canvas
})
// 创建场景
const scene = new THREE.Scene()
/** 
 * OrthographicCamera是正交相机,
 * 在这种投影模式下,无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变。 
*/
const camera = new THREE.OrthographicCamera(-width / 2, width / 2, height / 2, -height / 2, 0, 1000)
new THREE.OrthographicCamera 的参数可以参考官方文档或者 Three.js基础探寻二——正交投影照相机

现在必要的三个条件都有了,就要添加物体到场景中了。

物体在three.js中叫做mesh,它由几何体(geometry)和材料(material)组成。

我的理解就是几何体就是物体的基本形状,就像WebGL中的顶点着色器,材料就是几何体的颜色啊,光照等信息,就像WebGL中的片元着色器。

three.js中提供了很多几何体,但是好像没有基本的三角形,所以要自己画一个三角形。

在game.js 中添加:

// 画一个三角形
const triangleShape = new THREE.Shape()
triangleShape.moveTo(0, 100) // 三角形起始位置
triangleShape.lineTo(-100, -100)
triangleShape.lineTo(100, -100)
triangleShape.lineTo(0, 100)

这里说一下three.js的坐标系

微信小游戏之使用three.js 绘制一个旋转的三角形

有了三角形的基本形状,通过three.js中提供的api,将这个三角形变成几何体

在game.js 中添加:

// 将三角形变成组成物体的几何体
const geometry = new THREE.ShapeGeometry(triangleShape)

组成物体的几何体就搞定了。

然后就是材料了:

在game.js 中添加:

// 物体的材料
const material = new THREE.MeshBasicMaterial({
 color: new THREE.Color('#7fffd4'), // 颜色信息
 side: THREE.DoubleSide   // 用于确定渲染哪一面,因为是旋转的,所以需要正反面都渲染,也就是两面
})

用几何体 + 材料组成物体,并添加到场景中:

// 组成物体并添加到场景中
const mesh = new THREE.Mesh(geometry, material)
mesh.position.set(0, 0, -200) // 设置物体在场景中的位置
scene.add(mesh)

设置相机的位置以及看向的坐标

camera.position.set(0, 0, 0) // 相机位置
camera.lookAt(new THREE.Vector3(0, 0, -200)) // 让相机从0, 0, 0 看向 0, 0, -200

最后一步就是渲染了:

renderer.setClearColor(new THREE.Color('#f84462')) // 设置背景色
renderer.setSize(width, height) // 设置最终渲染的尺寸
renderer.render(scene, camera)

这时候去在开发者工具中就可以看到一个三角形了:

微信小游戏之使用three.js 绘制一个旋转的三角形

四. 让三角形动起来

const render = () => {
 mesh.rotateY(0.05) // three.js 中旋转角度是通过弧度计算的,公式:度=弧度×180°/π
 renderer.render(scene, camera)
 requestAnimationFrame(render)
}
render()

完整代码:

import './libs/weapp-adapter'
import * as THREE from './libs/three'
const width = window.innerWidth
const height = window.innerHeight
// 创建WebGL渲染器
const renderer = new THREE.WebGLRenderer({
 // 由于weapp-adapter会自动创建一个全屏的canvas所以这里直接用
 canvas
})
// 创建场景
const scene = new THREE.Scene()
/** 
 * OrthographicCamera是正交相机,
 * 在这种投影模式下,无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变。 
*/
const camera = new THREE.OrthographicCamera(-width / 2, width / 2, height / 2, -height / 2, 0, 1000)
// 画一个三角形
const triangleShape = new THREE.Shape()
triangleShape.moveTo(0, 100) // 三角形起始位置
triangleShape.lineTo(-100, -100)
triangleShape.lineTo(100, -100)
triangleShape.lineTo(0, 100)
// 将三角形变成组成物体的几何体
const geometry = new THREE.ShapeGeometry(triangleShape)
// 物体的材料
const material = new THREE.MeshBasicMaterial({
 color: new THREE.Color('#7fffd4'), // 颜色信息
 side: THREE.DoubleSide   // 用于确定渲染哪一面,因为是旋转的,所以需要正反面都渲染,也就是两面
})
// 组成物体并添加到场景中
const mesh = new THREE.Mesh(geometry, material)
mesh.position.set(0, 0, -200) // 设置物体在场景中的位置
scene.add(mesh)
camera.position.set(0, 0, 0) // 相机位置
camera.lookAt(new THREE.Vector3(0, 0, -200)) // 让相机从0, 0, 0 看向 0, 0, -200
renderer.setClearColor(new THREE.Color('#f84462')) // 设置背景色
renderer.setSize(width, height) // 设置最终渲染的尺寸
const render = () => {
 mesh.rotateY(0.05) // three.js 中旋转角度是通过弧度计算的,公式:度=弧度×180°/π
 renderer.render(scene, camera)
 requestAnimationFrame(render)
}
render()

总结

以上所述是小编给大家介绍的微信小游戏之使用three.js 绘制一个旋转的三角形,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用ASP将SQL搜索出来的内容导出为TXT的代码
Jul 27 Javascript
JavaScript 无符号右移运算符
Apr 17 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
jQuery获取标签文本内容和html内容的方法
Mar 27 Javascript
JavaScript 封装一个tab效果源码分享
Sep 15 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
Aug 09 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
vue-model实现简易计算器
Aug 17 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 #Javascript
JavaScript内置对象math,global功能与用法实例分析
Jun 10 #Javascript
vue通信方式EventBus的实现代码详解
Jun 10 #Javascript
Vue将页面导出为图片或者PDF
Aug 17 #Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
Jun 10 #jQuery
发布订阅模式在vue中的实际运用实例详解
Jun 09 #Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 #Javascript
You might like
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
javascript中万恶的function实例分析
2011/05/25 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
pygame实现飞机大战
2020/03/11 Python
pandas数据拼接的实现示例
2020/04/16 Python
Python如何执行系统命令
2020/09/23 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
考试退步检讨书
2014/01/15 职场文书
中医临床专业自我鉴定范文
2014/01/15 职场文书
知识竞赛活动方案
2014/02/18 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
中标通知书范本
2015/04/17 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
七年级话题作文之执着
2019/11/19 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
python百行代码实现汉服圈图片爬取
2021/11/23 Python
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Redis过期数据是否会被立马删除
2022/07/23 Redis