3D探索

    得益于手机厂商爆炸式的配置堆砌与移动互联时代到来,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性能等方面做一下对比,其大致数据如图


drewPerfromance.jpg

其中,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()

至此,一个立方体就出来了。


boxGemotry.png

渲染器

浏览器支持

支持 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()
        }

你可能感兴趣的:(3D探索)