《传送门》游戏中传送机制简析
相信大家对于传送门应该在电影或者游戏看过很多了,无缝传送门这个机制也不是Value公司第一次在游戏中实现,早已经有很多游戏实现过,比如《影子武士》、《雷神之锤》等等都使用了各种方式实现了无缝传送门这个机制;而我个人觉得传送门效果最惊艳,最贴合游戏设计的,还得是V社的《传送门》,所以今天在这里简单分析一下这个无缝传送门的实现机制。
首先,我们把传送门分为两个方面去进行分析,一个是画面显示,另一个是交互。
画面显示方面:
1、确定传送门的位置和朝向
游戏里面需要点击鼠标左键就让一个传送门出现在我们瞄准的墙上,在射击游戏中,常见对于弹道的检测,有把子弹做成实体通过物理碰撞检测以及射线检测两种方法;
因为《传送门》这个游戏不需要对射出的子弹进行物理效果处理(比如碰撞动画、飞行时间等等),所以为了提高性能,在这里我们采用射线检测的方法。
简单理解就是我们按下左键时,从玩家摄像机位置往视线方向发射一根射线,如果它击中了一个面,这时候我们就能得到击中的点在空间中的位置以及被击中面的法线,这样就可以确定传送门的位置和朝向了。(这里需要注意传送门和墙的空间关系,不要让传送门被墙遮挡住)
2、确定传送门内显示的画面
游戏中传送门入口显示的是出口视角所看到的场景,所以在这里我们就需要第二个摄像机来帮助我们,我们将它称为传送门摄像机。
传送门摄像机的位置和朝向都是和玩家摄像机相关联的,入口需要看到出口视角的场景,所以传送门摄像机需要放在传送门出口的背后,它与出口的距离、角度和玩家摄像机与入口的距离、角度都是一致的,当玩家摄像机做出改变时,传送门摄像机也要实时进行改变。
到这里是不是直接把传送门摄像机看到的场景以贴图的形式渲染到传送门入口上就大功告成了呢?理论上是这样的,但是现实是十分残酷的。
直接以贴图的方式渲染,会在“门中门”(相当于两面镜子相对)的情况下,占用十分大的显存,并且《传送门》使用的引擎无法对其进行抗锯齿处理,所以我们这里使用另一种方法——模板缓存(stencil buffer)。
模板缓存简单来说,就是预先告诉GPU在这次绘制中,有哪一些像素需要被重新绘制,哪一些是不需要重新绘制的,只需要存储需要重新绘制的信息就可以了,从而达到减少显存使用的目的。
在游戏中屏幕每一个像素都可以存储一个整数,将每次需要被绘制的像素整数都 +1,依次递增,直至达到程序设定的显示层数上限,接下来GPU就可以开始从最里层开始绘制,每次只需要绘制当次数值最大的像素,绘制完传送门之后,再进行其他场景的绘制。
当然,这样的做法也只能减少显存的使用,如果显示层数过多,还是有显存溢出的可能,所以到了一定的层数之后,需要将之前的图像缓存下来进行复制而不进行实时的渲染,对游戏显示效果不会有太大影响,这里就不深入讲解了。
至此,传送门的显示效果就已经完成了。
交互方面:
1、传送玩家
要穿过传送门有一个流畅的体验首先传送门后的这个墙不能挡住玩家,需要在传送门前设置一个触发区域,当玩家触发之后就关闭后面墙壁与玩家的碰撞,然后在门后加上个箱子防止玩家穿越时掉落出地图外。
下一步就要实现传送了,传送玩家其实就是传送玩家的摄像机和运动惯性,先把玩家摄像机变换到传送门入口的空间,得到玩家相对于入口的坐标和方向,再变换到出口的空间,得出相对于出口的坐标和方向,这样玩家在传送后的惯性就会被保持并且方向会根据出口的方向而改变;
而触发传送也十分简单,只要再加上一个触发区域,当玩家中心点进入这个触发区域后就会触发传送,得到玩家在出口的坐标后再稍微往前移动一点,防止反复触发传送区域,这样就能实现传送传送玩家的功能了。
2、传送物品
传送物品其实和传送玩家类似,物品的位置、线速度和角速度也要经过同样的变换得出相对于出口的信息,然后同一帧内把物体放到最终的位置,再加上新的速度,那么下一帧玩家就能看到一个被传送的物体;
但是传送物体有个特别的地方,他整个过程能被玩家所看到,也就是整个过程必须流畅,不能出现瞬移,这里会使用到一个小技巧,不需要真的传送了物品。
实现这种流畅的效果最简单的方法就是复制一个同样的物品,当物品触碰到了入口时,它的复制体就会使用它相对于出口的信息渲染在传送门后,当我们的物品慢慢进入传送门时,出口处的复制体也会慢慢的出来,看起来就像是真的进行了传送一样。
到这里,基本的传送门原理就简单分析完了,还有很多比较细节的内容没有讲到,还有很多特殊的东西需要考虑,但是主要的原理都说明了,也算是简单做一个总结分享给大家。
《传送门》游戏中传送机制简析相关推荐
- 今晚直播 | 强化学习在比赛和自动机器学习中的应用简析
「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...
- 离散数学中Warshall算法简析
离散数学中Warshall算法简析 最近学了离散数学的图论,突然感觉离散数学的作用十分强大,相信学好离散数学中的算法,编程的魅力也不言而喻.闲话不多说,这篇博客中记录的是Warshall算法的简单解析 ...
- pythonimportre_python中re模块简析
python中re模块简析 发布时间:2020-05-20 20:01:47 来源:51CTO 阅读:383 re的分组功能 python的re模块有一个分组功能.所谓的分组就是去已经匹配到的内容里面 ...
- PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——PHP SDK中Demo程序简析
PHP+新浪微博开放平台+新浪云平台(SAE) --新浪微博应用开发的一个解决方案 一.PHP+新浪微博开放平台+新浪云平台(SAE)方案的基础 二.建立微博应用的过程 三.PHP SDK中Demo程 ...
- Linux I2C设备regmap机制简析
在Linu 3.1开始,Linux引入了regmap来同意管理内核的I2C, SPI等总线,将I2C, SPI驱动做了一次重构,把I/O读写的重复逻辑在regmap中实现. 用一个I2C设备为例,在3 ...
- 游戏中Buff机制及其实际运用
首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种从逻辑思想到代码实现的小窍门的组合,只有当你把它运用到一个实际项目中去了,它才能帮助你建立一个系统.我不敢说它是最好的,但这套东西帮 ...
- STL中sort算法简析
STL里sort算法简析 文章目录 STL里sort算法简析 一.引入 二.正解 三.源码 **`sort的源码`**: **`其中,__introsort_loop便是内省式排序:`** 插入排序 ...
- ahp层次分析法软件_层次分析法在历史街区研究中的应用简析
摘要 AHP (Analytic Hierarchy Process)层次分析法通常被运用于解决多目标.多标准.多要素.多层次的非结构化的复杂决策性问题,特别是战略决策性问题,在建筑.规划.风景园林等 ...
- \t\tFlash网页游戏辅助工具制作简析
<热血三国>好像是比较热,玩的人也挺多的,年前一个朋友希望能让我写一个这个游戏的外挂,也出于无聊,所以去玩了一下,谁知道一玩就有点喜欢这个游戏了,当然玩归玩,东西还是要做地,当然还不能算得 ...
最新文章
- 区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!
- FTP的主动模式和被动模式,你应该用那种?
- Postman批量跑接口
- 中怎么构建ebug模式_自动挡中的“手自一体”,该怎么用?多少人把手动模式当成摆设?...
- gridview实现分页
- [html] 你有使用过meter标签吗?说说它的用途有哪些?
- linux 禁用smb服务,Samba 4.11 发布,更好的可扩展性与默认禁用SMB1
- 关于Android学习要问的一些问题
- html正常php不正常,不完全的HTML头消息,可能被某些PHP服务器拒绝.
- 如何调试Python extension
- Xenu-死链接检测工具
- ListView分页显示数据
- Linux:关于设置PS1提示符输入长命令格式出现的问题及解决
- 就 3 点,提升工作效率
- 数据结构系列三---[一周leetcode刷题记录3.7-3.13]
- 基于Anaconda 搭建 OpenCV for Python 环境(全平台通用)
- Ethercat学习-GD32以太网学习
- OpenJWeb(v1.9)企业级信息化应用平台开源版发布公告(基于Java语言开发)
- React项目实战之租房app项目(四)长列表性能优化城市选择模块渲染列表
- Mac OS X 10.5 Leopard: Direcory Utility, The end of Netinfo
热门文章
- AutoCAD .Net 不同文档间复制对象
- cesium绘制卫星
- 个人支付方案(免签约)-支付宝当面付开通教程
- Windows Server 创建域、加入域、域管理
- mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍
- git如何安装aur_Linux┊一个好用的AUR工具yaourt | 简单.生活
- CPU性能衡量参数-主频,MIPS,CPI,时钟周期,机器周期,指令周期
- 解决Win7缺失MSVCR120.DLL问题
- This may cause NPE so Data Binding will safely unbox it.
- iMeta | 德加合作揭示葛藤菌根真菌的遗传多样性和群落组成