最近在捣鼓 Three.js 相关知识,同时觉得微信小游戏是个不错的试错场呢。不错,本项目就是为了试错而存在。

先来一张 场景图,

这个格局是不是很眼熟,就是网页游戏2048的变版呢。乍一看,2D的呀,与Three.js 没半毛线关系。请仔细看,有阴影,有透明度, 有立体感,一切都在细节中…

这里吐槽一哈, 微信 7.0.15 版本,及相近版本进游戏可能会闪退, 具体原因不详。

概述 Three.js 来构建一个小游戏场景, 过程是比较简单的,三步走。

  • 新建场景,打好灯光,设置摄像机位置;
  • 将几何图形和材质的组合,构建出不同的模型
  • 在场景中将模型渲染出来。一个 3D 界面就出来了

前置条件

  • 浏览器方面,用谷歌准没错, 具体兼容性, 请查看https://caniuse.com
  • 假定你一定程度上掌握了 JavaScript,最好有一定三维图形学知识。

基本概念

场景:提供一个带三维坐标轴的空间

相机: 相当于人的眼睛,就是视角。相机分两种,正投影相机 OrthographicCamera 和透视投影相机 PerspectiveCamera。 针对不同应用的三维场景需要使用不同的投影方式,比如机械、工业设计领域常常采用正投影(平行投影), 大型游戏场景往往采用透视投影(中心投影)。

光源: Threejs 虚拟光源是对自然界光照的模拟。光源分环境光(AmbientLight), 平行光(DirectionalLight), 半球光(HemisphereLight),点光源(PointLight),平面光光源(RectAreaLight),聚光灯(SpotLight)。threejs 搭建虚拟场景的时候,为了更好的渲染场景,往往需要设置不同的光源,设置不同的光照强度,就像摄影师给你拍照要设置各种辅助灯光一样。

几何体:模型的几何形状,如:立方体,圆柱体,或是 自定义几何体之类。three.js 封装了一些几何模型 立方几何体(BoxGeometry),圆柱几何体(CylinderGeometry)等。

材质:几何体的外观。three.js 封装了一些材质,如 具有镜面高光的光泽表面的材质(MeshPhongMaterial),没有镜面高光的网格材质(MeshLambertMaterial)等等;

纹理:材质表面的贴图, 可以是图片,也可以是canvas绘制出来的图形
渲染器 就是将场景相机光照以及模型以某方式结合并呈现出来

了解上面的概念,足够用了。

代码实例

  • new 场景,我这里是 new 了两个场景,游戏界面需要立体感,采用中心投影; 得分描述文字等模型对象,只需要平铺在界面上,采用平行投影。 中心投影场景中添加辅助线,灯光和背景色。

createScene() {this.scene = new THREE.Scene();this.hudScene = new THREE.Scene();const axesHelper = new THREE.AxesHelper(1000);const lights = this.createLight();Object.keys(lights).forEach((value) => {this.scene.add(lights[value]);});this.scene.add(axesHelper);this.scene.background = new THREE.Color(0x3498db);}
  • new 相机,也是两个,一个正投影相机, 一个透视相机。需要设置朝向,相机位置,以及聚焦位置。
createCamera() {this.camera = new THREE.PerspectiveCamera(45,screenWidth / screenHeight,0.1,5000);this.camera.up.set(0, 1, 0);this.camera.position.set(0,0,2000);this.camera.lookAt(this.scene.position);}createHudCamera() {this.hudCamera = new THREE.OrthographicCamera(-screenWidth / 2,screenWidth / 2,screenHeight / 2,-screenHeight / 2,-1000,1000);this.hudCamera.up.set(0, 1, 0);this.hudCamera.position.set(0, 0, 1000);this.hudCamera.lookAt(new THREE.Vector3(0, 0, 0));}
  • 光源设置,这里根据实际场景设置,我这里设置了环境光和平行光。其中平行光可以设置阴影。
 createLight() {const directionalLight = new THREE.DirectionalLight(0xffffff, 0.3);directionalLight.position.set(400, 100, 500);directionalLight.castShadow = true;directionalLight.shadow.camera.near = 0.5;directionalLight.shadow.camera.far = 1000;directionalLight.shadow.camera.left = -500;directionalLight.shadow.camera.right = 500;directionalLight.shadow.camera.top = 500;directionalLight.shadow.camera.bottom = -500;directionalLight.shadow.mapSize.width = 3024;directionalLight.shadow.mapSize.height = 3024;return {ambientLight: new THREE.AmbientLight(0xffffff, 0.7),directionalLight,};}
  • 渲染器
 createRenderer() {let { devicePixelRatio, innerWidth, innerHeight } = window;this.renderer = new THREE.WebGLRenderer({canvas,antialias: true,precision: "highp",});this.renderer.setClearColor(0xffffff, 1);this.renderer.setPixelRatio(devicePixelRatio);this.renderer.setSize(innerWidth, innerHeight);this.renderer.shadowMap.enabled = true;this.renderer.autoClear = false;}
  • 渲染动作
animate() {this.renderer.render(this.scene, this.camera);this.renderer.render(this.hudScene, this.hudCamera);requestAnimationFrame(() => {this.animate();});}

自此,前置条件全部设置完成,可以开心的开始建立模型了。

第二篇,简述怎么怎么建立模型。

扫码耍耍

下期见…

Three.js初探之微信小游戏---第一篇相关推荐

  1. js密室逃脱微信小游戏源码

    下载地址 js密室逃脱小游戏源码,微信朋友圈小游戏密室逃脱. dd:

  2. Unity转微信小游戏与JS交互

    微信小游戏JS交互方式: 微信小游戏机制问题,在微信小游戏中不会加载index.html,所以写在index.html的函数均不会被调用到 1.自行创建calljs.js文件中添加定义,每次编译该文件 ...

  3. 使用Laya引擎开发微信小游戏(下)

    本文由云+社区发表 6. 动画 6.1 创建伞兵对象 在src目录下创建一个新目录role,用来存放游戏中角色. 在role里创建一个伞兵Soldier.ts对象文件. module role{exp ...

  4. 【转】微信小游戏开发源码_教程_工具_资源最新集合

    [小游戏资源] 微信小游戏开发资源目录 一.微信官方游戏教程 小游戏简易教程 小游戏API大全 小游戏开发工具 二.微信小游戏图标资源 Game-icons.net 三.微信小游戏图片资源 Super ...

  5. [小游戏] 微信小游戏开发源码_教程_工具_资源最新集合

    [小游戏资源] 微信小游戏开发资源目录 一.微信官方游戏教程 小游戏简易教程 小游戏API大全 小游戏开发工具 二.微信小游戏图标资源 Game-icons.net 三.微信小游戏图片资源 Super ...

  6. Laya官方不会告诉你的坑(微信小游戏系列)

    Laya官方不会告诉你的坑(微信小游戏系列) 使用laya2系列调试微信小游戏的时候, 发现了以下问题, 看了一圈官网也没提及, 所以记录一下供大家参考和讨论. 1.报错 ReferenceError ...

  7. 微信小游戏---引入第三方库的方法

    引言 微信小游戏的开发中,群里面经常有一些同行问如何引入第三方库? 其实引入第三方库很简单.第三方库一般来说是JS文件,不管我们使用的是Laya引擎,还是白鹭引擎,还是cocos引擎,最后发布编译之后 ...

  8. 微信小游戏_China_Fighting——game.js、game.json、project.config.json

    目录 微信小游戏_China_Fighting--前言 微信小游戏_China_Fighting--基础支撑类(sprite.animation.pool) 微信小游戏_China_Fighting- ...

  9. 上手微信小游戏——官方实例学习,第一天学习游戏结构与逻辑

    上手微信小游戏--官方实例学习 文件结构 代码内容 文件结构 ├── base // 定义游戏开发基础类 │ ├── animatoin.js // 帧动画的简易实现 │ ├── pool.js // ...

最新文章

  1. Python 中 (,|)和(and,or)之间的区别 逻辑判断
  2. 科大星云诗社动态20210823
  3. C#6.0中$的用法
  4. CF444C-DZY Loves Colors【线段树,set】
  5. java发送post请求json格式_Linux QT 4G发送HTTP POST请求发送JSON格式的数据
  6. PN512使用的一些小技巧
  7. PS修改图片的背景颜色(无需抠图)
  8. The Thirty-eighth Of Word-Day
  9. ~囍~ 将欢乐进行到底篇
  10. payjs 源码_GitHub - wlijie/payjs_test: PAYJS 小程序支付框架与示例
  11. Adobe Audition CC 2019 下载安装教程
  12. 如何扩大计算机的硬盘空间,Win7系统怎么扩大C盘空间 Win7电脑扩大硬盘C盘空间方法介绍...
  13. ROM、RAM、FLASH、IRAM、IROM、DRAM、DROM等简单介绍
  14. 记录写博文用到的一些工具
  15. 2.12-3.20上周的习惯坚持下来了✌️精诚所至金石为开,加油兄弟
  16. 知心王姐小饭桌 IM消息应用开发:一看看懂Protocol Buffer(协议篇)
  17. 计算机视觉的科学计算,计算机视觉发展的四个主要阶段1:马尔计算视觉
  18. 网址铺吧网址导航程序按来路显示网址生成源码
  19. 网上卖东西怎么引流?微商怎样去解决客户信任呢?
  20. python求小于n的所有素数_快速找出N以内的所有素数解法,python版本。这个应该是最快的了...

热门文章

  1. Python菜鸟教程(一)-爬b站数据
  2. watchdog机制
  3. 数据小白之路-task1
  4. 使用scrapy来找出微博上没有加好友的熟人
  5. 字节跳动|后端|提前批|一面+二面+三面+HR 面
  6. comsol5.1 安装选项 自用
  7. 服务器名字怎么修改linux,linux服务器修改主机名字
  8. 算法技巧——双指针算法
  9. 套路:想戒手机?试试把屏幕变灰
  10. 企业所得税这么缴纳,会涉及虚假申报?各位老板注意了