薛定谔的空气墙?一文带你了解其背后的技术原理

封面图

悟空来了都得撞墙?

目前,被称作“村里第一个大学生”的国产3A游戏《黑神话:悟空》发售已经有一段时间了,游戏采用虚幻引擎4技术,仿佛将传统与现代的界限模糊,玩家游玩时沉浸感极强。然而,游戏也有不少令人诟病的部分,今天要说的就是网上不少人吐槽的黑神话中的“空气墙”问题

“空气墙”指的是游戏场景设计中给玩家的视觉认知与操作反馈不统一的现象,具体表现为“这里看起来明明可以通行,但走近之后却被一堵无形的墙给挡住了”。

空气墙的存在只是问题的表象,因为它往往可以用来规避更大的问题。但与一般游戏防止跌落的悬崖边空气墙不同,《黑神话:悟空》中存在很多无意义的空气墙。比如如下图模型明明有个空缺,但人物就像是一直在撞墙,一直过不去。

《黑神话:悟空》中有趣的空气墙,来源:B站up主 LaSpeeee_

如果上面的空气墙属于无伤大雅,小打小闹,那么下面这种空气墙就比较逆天了,非常折磨玩家的游玩心态。明明眼前有那么大的场景看起来可以探索,制作者还是这块台阶前铺设了一排空气墙,就连两侧的空区域也无法通行。

《黑神话:悟空》中逆天的空气墙,来源:B站up主 BlaiteHe

有玩家戏称之为“薛定谔的空气墙”。“在撞到空气墙之前,永远不知道这里是通往隐藏的小路还是空气墙。不试一下又怕错过,试了又回让人有些失望。”

越是愿意探索,空气墙的存在感就越高,也在挫败着玩家探索隐藏的欲望。

游戏中空气墙的设立不是无缘无故,制作组肯定有其含义。个人推测是《黑神话:悟空》为了各种性能优化,砍掉了原本规划的游戏路线,导致原地图可探索部分被裁剪,又临近发售,所以只能在游戏中设置了空气墙。

空气墙为何会阻止玩家前进?这就要从从游戏中的物理碰撞说起。

空气墙背后的碰撞检测

游戏引擎中物体模型和其碰撞是分开设置的,玩家前进中遇到的各种石头、树木、建筑物等障碍物之所以会阻碍玩家前进,是因为在这些模型上添加了物理碰撞。如果模型和碰撞设置的良好,当玩家刚要撞到物体模型的时候,就会因为碰撞的阻挡而停下,这种情况就给玩家一种物理的真实感。

人物与墙的碰撞测试,来源:98K物理-轻量碰撞系统

碰撞检测是游戏碰撞中的一个重要算法,它模拟了现实世界中物体之间的相互作用,也是几乎所有游戏都要用到的一个算法。比如2020年的游戏《Control》(控制)中的碰撞检测就有出色的应用。

《Control(控制)》中的物理碰撞效果,来源:B站up主 施特劳斯Woo

被称为“车祸模拟器”的物理沙盒类游戏《BeamNG.drive》在不少玩家心中拥有全球最顶尖的物理碰撞模拟和损坏效果。网上也有不少游戏与现实车祸的碰撞对比,可以看到,《BeamNG.drive》在其独特的物理引擎的加持下,具有非常拟真的碰撞效果

具备优秀物理引擎的沙盒游戏《BeamNG.drive》中的汽车碰撞效果(下)与真实碰撞(上)测试比较,来源:B站up主 依然Dy

具备优秀物理引擎的沙盒游戏《BeamNG》中的汽车碰撞效果(下)与真实碰撞(上)测试比较,来源:B站up主 依然Dy

那么,游戏中碰撞检测的背后是什么原理呢?

试想一下,一个有N个物体的场景,如果我们对这些物体每两个之间进行碰撞检测,需要的计算复杂度是O(N²) ,这对于计算机显然是不能接受的.

所以我们将碰撞检测分成两个阶段来实现,Broad-Phase(粗略检测)和Narrow-Phase(精细检测)

Broad-Phase

Broad-Phase是碰撞检测的第一个阶段,其主要目的是快速筛选出可能相互碰撞的物体对。在这个阶段,游戏引擎会使用各种空间划分技术,如AABB(Axis-Aligned Bounding Boxes,轴向包围盒)、OBB(Oriented Bounding Boxes,方向包围盒)、Sphere(球体)等,来简化物体的形状,并将这些简化后的形状存储在一个易于检索的数据结构中。

模型包围盒种类,来源:haroldserrano技术博客

常见的空间划分技术包括Uniform Grid(均匀网格)、Hierarchical Grids(层次网格)、Bounding Volume Hierarchical(BVH,包围盒层次结构)等。这些技术通过将游戏空间划分为多个子空间,并将物体分配到相应的子空间中,从而实现了对潜在碰撞体的快速筛选。

下图是以BVH为例,建立的碰撞检测流程。

碰撞检测流程,来源:haroldserrano技术博客

Narrow-Phase

在Broad-Phase初步的筛选过后,我们选出所有可能会碰撞的几何体对,Narrow-Phase的步骤是再对这些几何体进行精确的碰撞检测,比如采用凸包作为边界的体积进行碰撞检测

模型凸包边界检测,来源:haroldserrano技术博客

在物理引擎中会用到各种各样碰撞体形状,有些形状的碰撞计算非常直观且简单,比如两个球形之间,判断两个圆心的距离是否大于半径之和,就能直接计算出是否碰撞.

其余的碰撞计算就不太直观,需要一些特定的算法,但是目的都是判断两个多边形是否相交,比如在游戏引擎中比较常用的是Gilbert-Johnson-Keerthi (GJK)算法

与许多其他距离算法不同,GJK算法不要求几何数据以任何特定格式存储,而是仅依赖于一个支持函数来迭代生成更接近正确答案的单纯形,使用两个凸形状的配置空间障碍(CSO),也被称为闵可夫斯基差来判断两个形状是否有交集

闵可夫斯基差中的面-顶点(Face-Vertex)碰撞类型和边-边(Edge-Edge)碰撞类型,来源:Wiki百科

地图引擎中的碰撞检测

在地图引擎中,碰撞检测技术同样扮演了重要的角色,也是渲染性能的重要组成部分。比如在二维瓦片、三维模型渲染之前,需要对其是否可见性进行判断,判断的依据就是根据模型的外包围盒进行碰撞检测,以此只渲染屏幕看得到的模型。这样做,大大提升了渲染性能。

Mapmost中碰撞检测应用之一——模型视锥体裁剪,来源:Mapmost引擎

碰撞检测在地图中的另一个重要运用是给标注添加避让效果。通过给定每个注记外包围盒,渲染时判断这些包围盒之间的距离是否小于某个阈值,小于了就只显示唯一一个,避免多个注记的重复叠加,影响用户的使用体验。

Mapmost中碰撞检测应用之一——注记避让效果,来源:Mapmost引擎

参考文献

https://www.bilibili.com/video/BV1PMWHeHEyb/?spm_id_from=333.880.my_history.page.click&vd_source=94abb2a8fc86022a0736e7f6850b4b2f

https://www.bilibili.com/video/BV1eSWpe3EBv/?spm_id_from=333.337.search-card.all.click&vd_source=94abb2a8fc86022a0736e7f6850b4b2f

https://www.bilibili.com/video/BV1Rf4y1J7WF/?spm_id_from=333.788.recommend_more_video.0&vd_source=94abb2a8fc86022a0736e7f6850b4b2f

https://mp.weixin.qq.com/s/7OG224y-uoA8ptLWzYzXrQ

https://www.bilibili.com/video/BV1T54y1H7Dm/?spm_id_from=333.337.search-card.all.click&vd_source=94abb2a8fc86022a0736e7f6850b4b2f

https://zhuanlan.zhihu.com/p/113415779

https://en.wikipedia.org/wiki/Gilbert%E2%80%93Johnson%E2%80%93Keerthi_distance_algorithm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522514.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理系列五十三》文本聚类算法》文本聚类介绍及相关算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列五十三文本聚类算法》文本聚类介绍及相关算法K…

四、基本电路设计笔记——4.1 DC-DC稳压电路

目录 4.1 DC-DC稳压电路 4.1.1 基于MT2492的DC-DC稳压电路 (1)芯片参数 (2)芯片引脚 (3)输出电压设置 4.1.2 基于MT2499A的DC-DC稳压电路 (1)芯片参数 (2&#xf…

多模态生成发文量大涨!最新成果统一Transformer和Diffusion,含金量超高

最近多模态生成领域也在“神仙打架”,比如Meta的全新训练方法Transfusion,用单个模型就能同时生成文本和图像! 还有之前华为、清华提出的个性化多模态内容生成技术PMG,生成的内容可“量身定制”,更能满足偏好。 这些…

深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 📚Linux线程📕什么是线程*可以使用多进程去并发的执行一个进程的代码,那为什么要由线程呢&#x…

搭子小程序开发,让社交更加有趣

如今,搭子成为了年轻人社交的新兴方式,它作为一种连接年轻人的社交纽带,深受大众的欢迎!各式各样的旅游搭子、健身搭子、游戏搭子等,让年轻人享受到社交的魅力。 随着互联网的发展,寻找搭子也发展到了线上…

一个好用的Maven依赖冲突解决插件:Maven Helper

在项目开发,或项目Maven需要新增依赖、项目依赖组件升级时,经常会出现添加后,因为各个模块中有相同的依赖、不同的版本而导致依赖冲突,从而导致项目启动不起来,这种冲突非常恶心,因为是传递依赖所以会看不出…

Hackme靶场渗透攻略

步骤一,注册登录进去 步骤二,点击search 我们发现有很多书 步骤三,搜索一本书抓包发放到重放器 步骤四,数据改为1*,复制数据包到1.txt,然后打开sqlmap 步骤五,sqlmap查看当前数据库 python s…

多模态AI:原理、应用与未来展望

随着人工智能技术的飞速发展,多模态AI逐渐成为构建智能系统的重要方向。传统的AI系统通常依赖于单一模态的数据,如文本、图像或音频。而多模态AI通过结合多种数据类型,能够在更复杂的场景下提供更智能的解决方案。本文将深入探讨多模态AI的原…

Android 11 (R)AMS Activity内部机制

一、AMS是如何被管理的 如我们在Android 11(R)启动流程中介绍的一样,AMS和ATMS是在SystemServer中被启动的 ActivityTaskManagerService atm mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService(); mActivityManagerSe…

使用vscode debug cpp/python混合编程的程序(从python调用的C++编译的dll)

使用vscode debug cpp/python混合编程的程序(从python调用的C编译的dll) 1. 安装插件 Python C Debugger https://marketplace.visualstudio.com/items?itemNamebenjamin-simmonds.pythoncpp-debug 2. 在.vscode/launch.json中增加配置 拷贝自 https:…

默默的学python——两个重要的函数dir()、help()

一、dir()函数 dir()函数在Python中用于返回一个对象的所有属性和方法的列表,当你对一个函数使用dir()时,它会返回函数对象的所有可访问的属性和方法的名字列表。 具体的说,dir()函数获取的内容包括: 1.特殊方法和魔法方法 如…

Kettle 锁表原因及解决办法【源码级分析】

文章目录 背景源码分析锁表场景1:资源库锁表锁表场景2:写日志锁表在哪里配置的kettle_log_table?官方解释自增 SQL 获取 BatchI 原理解决自增 SQL 获取 BatchID背景 Kettle 7.1.0 经常出现锁表的情况,体现为在数据库里有一条锁表 SQL,然后整个 Kettle 都无法运行。😂�…

App推广新姿势:Xinstall一键下载唤起,轻松提升用户体验!

在App推广和运营的道路上,你是否遇到过这样的困扰:用户点击下载链接后,却无法直接唤起App,导致用户体验不佳,甚至造成用户流失?别担心,今天我们就来科普一个神器——Xinstall,它能帮…

【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用

IDEA中最常见的UI操作:【GIT】Idea中的git命令使用-全网最新详细(包括现象含义) 文章目录 问题一: idea撤回仅commit错误的代码(仅本地仓库,因为还没推送到远程)问题二: idea撤回Com…

8个优质视频素材库,商用无忧

如果你正在寻找一些优质的视频素材库,不妨看看以下这些网站。它们提供了各种各样的视频素材,无论是用于家庭视频制作、Vlog、还是社交媒体内容,都能找到合适的素材。从生活日常到创意动画,这些网站都能帮你找到想要的视频素材。一…

学习react day01

(1)nodejs.cn 中文网 版本须较新 (2)全局安装 npm install create-react-app -g ( 版本查询 create-react-app -V) (3)创建app create-react-app test-app (4&…

5 - ZYNQ GPIO

文章目录 1 GPIO基本概念1.1 MIO-EMIO简介1.2 MIO-EMIO连接1.3 MIO-EMIO路由1.4 MIO-EMIO配置 2 GPIO控制寄存器2.1 输入/输出控制寄存器2.2 中断控制寄存器2.3 中断触发设置 3 GPIO在Vivado SDK中的使用 1 GPIO基本概念 在ZYNQ中,GPIO(General Purpose…

读取obj文件中的vt并转成需要的uv数据

先展示效果图 适用场景:加载的obj模型需要发生形变,同时还要展示模型的纹理效果,可以使用到面料模拟或者弹性物体的模拟当中 具体实现方案: 1、读取obj文件中的vt的值,存起来 2、读取f值,存v索引和vt索引 3…

宿舍|基于SprinBoot+vue的宿舍管理系统(源码+数据库+文档)

宿舍管理系统 基于SprinBootvue的私人诊所管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 学生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&…

文件包含PHP伪协议利用方法

1.file://协议 使⽤: file:// ⽂件的绝对路径和⽂件名 2.php?cmdfile://D:\phpstudy_pro\WWW\123.txt 2.php://filter协议 ⽤途:常⽤于读取⽂件 / 源码 2.php?cmdphp://filter/readconvert.base64-encode/resource1.php 3.php://input协议 步骤一&…