这是一个类似第三人称射击游戏(TPS)的3D场景,可以通过https://ljzc002.github.io/FPS2/index.html访问。场景运行效果如下图:

  场景环境由一个天空盒和一个地面网格组成,屏幕中央是准星,左下部带有纹理的球体代表玩家模型,玩家模型外的绿网是玩家模型的物理仿真器,玩家模型的背部的随机字符表示玩家id,玩家模型的右前方是一个枪械模型,每隔一段时间场景中刷新一个球体网格代表射击目标,场景的右上角是一个以玩家为中心的小地图。

  直接移动鼠标即可调整游戏视角,使用WASD控制前后左右移动,按下空格玩家可以跳起,玩家碰到目标物体会被挡住,按下鼠标左键枪械会进行射击动作,如果击中目标物体则目标物体会消失。

  场景的构建基于Babylon.js库,为了给物体的运动赋予物理效果,我在场景中使用了cannon物理引擎。在基于Babylon.js库的WebGL场景中模拟物理效果的常见方法有三种,第一是使用Babylon.js内置的相机碰撞检测和重力模拟来操纵相机的位置(可以参考http://doc.babylonjs.com/tutorials/cameras,_mesh_collisions_and_gravity的官方教程),这种方法在一些简单的3D示例中非常常见,但是相机碰撞检测在需要呈现玩家自身模型时的表现并不理想,因为Babylon.js的渲染流程是先计算网格的位置再计算相机的视角,如果让物体跟随相机运动,在每一帧中物体的位置都会略微滞后于相机的位置,进而产生画面抖动,并且相机碰撞检测本身的功能也并不完善,且个性化定制较为困难,所以这种方法不适用于复杂场景。

  第二种模拟物理效果的方法是结合使用Babylon.js内置的moveWithCollisions方法和自定义的运动控制方法来对物体的位置进行控制,然后让相机跟随物体运动,这种方法能够提供给编程者足够的自由定制空间,且足以应对一般的场景浏览需求,但在涉及到复杂碰撞、反弹等情况时需要编程者自己编写一个类似物理引擎的东西。(简单用法可以参考我的博客中的例子http://www.cnblogs.com/ljzc002/p/6029095.html)

  第三种就是使用物理引擎对物体的位置和姿态进行较为精确的计算,然后让相机跟随物体,Babylon.js内置了三种物理引擎的接口,可以方便的将物理计算添加到每一帧的渲染中。但是使用物理引擎的缺点也非常明显——物理引擎过于“叫真”,比如这个场景中的玩家物体被定义为了一个体重为70KG、具有少许摩擦力和弹性的球体,这时如果你像前两种方法一样通过在每一帧修改玩家的position属性来改变玩家的位置,你会发现玩家并没有像想象中那样直线移动过去,而是按照一个球体应该表现的那样一路滚动过去,到达目标位置后玩家也不会停止而是在惯性的作用下继续滚动,好吧,我们的可怜的玩家已经晕车了。(物理引擎的基本用法可以参考http://doc.babylonjs.com/overviews/using_the_physics_engine)

  针对这一情况我在网上找到了两种解决方案,其一是把物理仿真器网格和玩家模型网格剥离开,物理仿真器负责在场景中做物理滚动,玩家模型则只需要与物理仿真器保持位置相同,而玩家模型的姿态则由相机视角控制不受物理仿真器影响,这也是我这个TPS场景所使用的方式;第二种方案则是使用物理引擎中的“接头”和“马达”功能,大意是由马达负责把物体的线运动转化为轮子的角运动,再通过接头带动玩家模型的主体部分,但是三种物理引擎对马达和接头的定义并不完全相同,这给我们的使用带来了一些局限性。

  这个场景的编写参考了http://www.pixelcodr.com/tutos/shooter/shooter.html、https://blog.raananweber.com/2016/09/06/webgl-car-physics-using-babylon-js-and-oimo-js/、https://spritehand.blob.core.windows.net/babyloncharacterwalk/index.html(这篇教程的原网址找不到了,暂时把demo放在这里)三篇教程,场景中用到的各项技术在这三篇教程和官方教程中都能找到解释这里就不再重复,它们相关的简单翻译可以在这里找到:http://files.cnblogs.com/files/ljzc002/shooter.rar,在此对这三个demo作者的无私奉献表示感谢。场景的完整代码可以在我的github下载:https://github.com/ljzc002/ljzc002.github.io。

  

  

一个使用物理引擎的WebGL3D场景的更多相关文章

  1. cocos2dx 3.2中的物理引擎初探(一)

    cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需 ...

  2. 将 Android* Bullet 物理引擎移植至英特尔® 架构

    简单介绍 因为眼下的移动设备上可以使用更高的计算性能.移动游戏如今也可以提供震撼的画面和真实物理(realistic physics). 枪战游戏中的手雷爆炸效果和赛车模拟器中的汽车漂移效果等便是由物 ...

  3. cocos2d-x 3.0 使用最新物理引擎的一个源代码实例

    1.碰撞函数參数由两个变成一个了 2.检測不到碰撞.须要设置那三个參数.同一时候还要设置成动态的. body进行设置. 3.初始入口文件也发生了改变. 附录上我近期调试好的cocos2d-x 3.1 ...

  4. three.js cannon.js物理引擎制作一个保龄球游戏

    关于cannon.js我们已经学习了一些知识,今天郭先生就使用已学的cannon.js物理引擎的知识配合three基础知识来做一个保龄球小游戏,效果如下图,在线案例请点击博客原文. 我们需要掌握的技能 ...

  5. 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘

    计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...

  6. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...

  7. Bullet物理引擎在OpenGL中的应用

    Bullet物理引擎在OpenGL中的应用 在开发OpenGL的应用之时, 难免要遇到使用物理来模拟OpenGL中的场景内容. 由于OpenGL仅仅是一个关于图形的开发接口, 因此需要通过第三方库来实 ...

  8. [Cocos2D-x For WP8]Box2D物理引擎

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而, ...

  9. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]

    通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩 ...

随机推荐

  1. MySQL之表操作

    1 创建表 2 查看表结构 3 数据类型 4 表完整性约束 5 修改表 6 复制表 7 删除表  一创建表 语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 ...

  2. php的二维数组排序

    //建立一个$arr的二维数组 $arr=array( array('name'=>'e','age'=>5), array('name'=>'b','age'=>2), ar ...

  3. pyqt4桌面软件各种画布组合结构实例

    import sys reload(sys) sys.setdefaultencoding('utf8') from PyQt4 import QtGui, QtCore try: from PyQt ...

  4. React-Native 学习笔记-Android开发平台-开发环境搭建

    详细步骤请查看官网对应文档,BUT,有些注意事项请注意! 1,优先安装Node.js,因为后面可以使用npm安装软件, 2,注意不要使用CNPM!!!!!!!!! 3,Android Studio 请 ...

  5. 下载的js文件本地编辑器打开中文乱码如何解决

    今天遇到的小问题,已解决,直接上图 下载直接打开是这样的 用记事本打开 另存为utf-8格式 正常了!

  6. UVA 1030 - Image Is Everything【模拟+思维+迭代更新】

    题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...

  7. angular2 路由

    路由是个模块,命令行生成:ng generate module routerTest; 自己组建: 路由模块说明: Routes:路由配置,路由配置文件类型.比如:const routing:Rout ...

  8. (一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装

    (1)下载erlang: http://www.erlang.org/download/otp_win64_17.3.exe 并安装 (2)下载RabbitMQ: http://www.rabbitm ...

  9. 从零开始学习前端开发 — 3、CSS盒模型

    ★  css盒模型是css的基石,每个html标签都可以看作是一个盒模型. css盒模型是由内容(content),补白或填充(padding),边框(border),外边距(margin)四部分组成 ...

  10. Win7如何分享局域网并设置共享文件夹账户和密码

    https://jingyan.baidu.com/article/ceb9fb10ddf6c08cad2ba017.html 在办公或者其他场所,我们需要分享自己的文件给朋友或者同事,但又不想同一局 ...