得益于手机厂商爆炸式的配置堆砌与移动互联时代到来,html在手机上的效果愈加丰富,Web开发者已经不满足于2D效果的实现,而把目标放到了更加炫酷的3D效果上
今天大概看一下当前主流的3D库
常见的3D库
- 01|Egret
官方将Egret定位为一整套游戏开发的“游戏解决方案”,包括游戏开发框架、开发辅助工具,生态环境相对完善。基于TypeScript进行开发,支持Flash到Egret的高效转换、跨平台支持,可打包为HTML5,以及iOS 和Android平台原生app。 - 02|Three.js
Three.js的定位是一个基于JavaScript 3D库,但无疑它非常的强大而轻量。从创建简单的3D动画到创建交互的3D游戏,通过暴露简单的API,将3D内容的开发复杂性降至最低。 - 03|Pixi.js
Pixi与Three.js一样,定义为“2D WebGL renderer with canvas fallback”。它只是一款轻量的2D Webgl库,但同样可以根据它的API来开发游戏,将2D WebGL开发复杂性降到最低。 - 04|Layabox
Layabox与白鹭一样,也是成熟的整套游戏开发的”游戏解决方案“,同时支持2D、3D、VR的H5引擎,专为高性能游戏而设计,支持ActionScript 3.0,TypeScript,JavaScript编程语言。开发一次,发布flash,HTML5,mobile。 - 05|Hilo
Hilo 是阿里巴巴集团开发的一款HTML5跨终端游戏解决方案,它可以帮助开发者快速创建HTML5游戏,多种渲染方式, 提供DOM,Canvas,Flash,WebGL等多种渲染方案。 - 06|Cocos2d
Cocos2d是老牌的游戏引擎,采用原生JavaScript语言,可发布到包括Web平台,iOS,Android,Windows Phone8,Mac,Windows等平台。 - 07|厘米秀引擎
厘米秀引擎是QQ轻游戏使用的引擎bricks,为腾讯自研的游戏引擎,脚本层使用JavaScript。bricks引擎支持原生、WebGL,Canvas等多种渲染以及开发方式,开发者可以直接调用bricks引擎,也可以使用第三方游戏引擎封装的进行开发。
02 基本对比
我们对上诉各个框架,引擎在2D Canvas,2DwebGL,3DwebGL,2D性能,3D性能等方面做一下对比,其大致数据如图
其中,Egret包括一整套框架,太重,不打算采用,下面来看一下three.js
three.js
快速入门
3D渲染需要3个部分,渲染器,相机,模型
初始化渲染器
// 渲染器 使用的是WebGLRenderer渲染器,当不支持WebGLRenderer,可以优雅降级使用其他几种渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染器的长宽值 如果希望尺寸不变,但以较低的分辨率来渲染时,将 updateStyle(第三个参数)设为false
renderer.setSize(window.innerWidth, window.innerHeight, false)
// 将render的元素添加到我们的html文档中
document.body.appendChild(renderer.domElement)
初始化相机
// three.js里有几种相机,这里的PerspectiveCamera是透视摄像机
// 视野角度(FOV):无论在什么时候,你能在显示器上看到的场景的范围(单位:角度单位)
// 长宽比(aspect ratio):宽/高,想达到适应屏幕的效果就可以写成window.width/height
// 进截面(near),远截面(far):当物体某些部分比摄影机的远截面远或者比近截面近的时候,这些部分就不会被渲染到场景里
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000)
camera.position.z = 5
初始化模型
// 立方几何体模型:BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer,
// heightSegments : Integer, depthSegments : Integer)
// width — X轴上面的宽度,默认值为1 height — Y轴上面的高度,默认值为1 depth — Z轴上面的深度,默认值为1。
const geometry = new THREE.BoxGeometry(1, 1, 1)
// const geometry = new THREE.SphereGeometry(50, 16, 16)
// 基础网格材质:MeshBasicMaterial( parameters : Object) parameters:用于定义材质外观的对象,具有一个或多个属性
// 其中color属性,可以作为十六进制字符串传递,默认情况下为0xffffff(白色)
const material = new THREE.MeshBasicMaterial({color: 0x00ff00})
// Mesh(网格) 网格包含一个几何体以及作用在几何体上的材质
const cube = new THREE.Mesh(geometry, material)
初始化完成后,要先显示一个模型,首先需要将模型添加到场景里去
// 默认情况下调用add方法,物体将被添加到(0,0,0)的坐标
scene.add(cube)
最后一步需要将场景和相机渲染出来
// 循环渲染(render loop)
function animate(){
// 浏览器自带的函数,可以将对个动画合并到一次执行,减少重绘和回流
requestAnimationFrame( animate )
// 旋转动画
cube.rotation.x += 0.01
cube.rotation.y += 0.01
cube.rotation.z += 0.01
renderer.render(scene, camera)
}
animate()
至此,一个立方体就出来了。
渲染器
浏览器支持
支持 WebGL的浏览器有Google Chrome 9+、Firefox 4+、Opera 15+、Safari 5.1+、Internet Explorer 11 和 Microsoft Edge
对于低版本的浏览器,需要多渲染器进行兼容,代码如下
if(Detector.webgl){ // 判断webgl兼容
renderer = new THREE.WebGLRenderer({antialias: true})
}else{ // 不兼容的话就用canvas
renderer = new THREE.CanvasRenderer()
}