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()
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343