微信小游戏之使用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 相关文章推荐
用JQuery 实现的自定义对话框
Mar 24 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
jQuery 获取URL参数的插件
Mar 04 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
May 15 Javascript
js简单抽奖代码
Jan 16 Javascript
js实现div在页面拖动效果
May 04 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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 cache类代码(php数据缓存类)
2010/04/15 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
js动态生成表格(节点操作)
2021/01/12 Javascript
python增加矩阵维度的实例讲解
2018/04/04 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
廉政教育的心得体会
2014/09/01 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
学生会辞职信
2015/03/02 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
python元组打包和解包过程详解
2021/08/02 Python
CentOS MySql8 远程连接实战
2022/04/19 MySQL