Jacques Kerner是Avalanche Studios的高级软件工程师。好像游戏之前还不够疯狂引言
Just Cause和Avalanche Studios系列游戏因其开放世界技术而闻名,可提供丰富多彩且令人兴奋的游戏玩法。 游戏的最新版本-Just Cause 4-增加了风和天气灾害,这在加深游戏玩法的技术堆栈中成为新事物。 但是最初设想极端环境条件不仅仅是模拟一个更真实世界的方法。 大自然的愤怒是由与里科·罗德里格斯相对的邪恶力量控制的。 我们打算使风更清楚地表现出来,极端天气情况看起来并不像这个世界陌生的突发事件。 本文从物理角度介绍了我们开发的用于以各种表现形式实施风的技术,以及所有对象对其的反应。
[在猫下约120 MB GIF文件]JC4热带风暴-早期概念(伏打)我们无法拒绝的报价
随着《正当防卫3》的开发接近尾声,大多数团队都转向了《正当防卫4》的预生产阶段,这个微型内核不得不为JC3和可下载内容(“ DLC”)制作补丁。 Hamish Young和我,首席程序员和首席车辆设计师,专注于Mech Land Assault DLC。 我们本来应该是物理学的首席设计师(以及玩家的力学)和物理学的JC4的首席程序员,但是在创建新系列产品的设计,确定其引人注目的功能和重要功能时,我们完全被DLC所吸引。 这次创建了一个大型原型,以测试新的基本力学和Rico对风的反应。 编写了该图的草稿,出版商Square Enix批准了最初的开发方向。 剩下的唯一事情就是掌握这个概念。 但是如何做到这一点而又不影响性能呢? 在开始项目后,我们从两个方面对问题进行了攻击:1.设置范围广,避免出现最坏的情况(破坏者:我们没有成功)2.处理极端天气情况的各种表现,尤其是飓风,创建一个提供逼真的行为但可以很好地缩放到所需数量和密度的对象的系统。
JC4中的沙尘暴-早期概念艺术(Volta)损害控制
实时模拟(尤其是开放世界游戏)的瓶颈是碰撞的物理物体的数量。 主要费用的产生是由于计算了许多移动物体相互碰撞以及与静态环境(浮雕,建筑物)的碰撞。 这就是为什么像Havok这样的物理引擎将活动和不活动的实体分开的原因。 检查活动物体是否与其他物体发生碰撞,并需要全部计算成本。 如果活动主体在几个帧中都没有移动,则物理引擎会将其标记为非活动状态,从那时起,可以将其完全忽略,直到它被接近的活动主体“唤醒”为止。 这种不活动的物体通常搁置在地面上,不再进行与地球之间的碰撞检查。 显然,开放世界中无处不在的风将对该系统构成威胁,因此对于我们而言,重要的是要确保风在暴露于大面积区域时保持适度和纯净的外观,或者在小批量和有风潜在的活动体很小。 我在开发的早期阶段就对我们的设计部门谈到了这些限制,以便不会被困住。 最初,设计师似乎已经听取并决定将极端天气事件的轨迹限制为预定的破坏路线,在此路线中应采用更严格的建筑规则。 他们确实遵守了其中一些限制。 但是诱惑太大了,想要使游戏尽可能达到最佳状态的同事所承受的压力是无法克服的。 我在想什么 此后,设计师立即制作了几公里高的龙卷风,直达该国首都-该岛人口最稠密的地区。 这种龙卷风不仅大胆地浪费了一半的资本,而且还冒着一些毫无戒心的程序员,他们没有严格遵守游戏的这一基本功能。
JC4中的暴雪-早期概念艺术(Volta)一般方法
通常,JC4的极端天气物理学需要以下成分:
- 考虑到其形状和大小,将气动阻力模型应用于世界上所有动态物体
- 风源的形状和分布与极端天气条件(风暴,龙卷风)相对应,但也提供了在全世界传播的风的模式
- 优化上述系统,使游戏适合计算负荷的预算
这三个问题需要同时并尽快解决。 许多设计决策取决于实现这三个方面的可能性,在最初的几个月中,我们对那些耐心等待机会有机会大规模使用该系统的设计师感到不满意。
首先,我们创建了空气阻力模型。 完成后,每个物体突然学会了以一种相当现实的方式对风做出反应。 例如,如果有任何物体从悬崖上掉下来或被爆炸甩开,则所有物体都会减速并在空中真实旋转,这本身已经值得努力。 但是在没有风源的情况下,很难说出它们在极端风的情况下的表现。 尽管我们为自己感到自豪,并且经验和直觉帮助我们迅速找到了满足性能要求的前两个问题的方法,但我们还是决定,当第一版龙卷风开始按预期运行时,我们感到非常幸运。 她提起了所有动态对象,并以一种相当现实的方式扭曲了它们,而没有占用所有处理器时间。 经常问起龙卷风情况的JC4导演弗朗切斯科·安托尼(Francesco Antollini)出现在我的工作场所旁,表示宽慰:我想我错过了因怀疑我而羞辱他的机会。 但实际上我也有同样的感觉。
从物理角度来看,JC4与JC3相比是一个突破:它是一个更加密集,充满,充满活力和美丽的世界,破坏起来更加有趣。 所有这一切都可以在相同的目标平台(XBox One和PlayStation 4)上进行。 毫不奇怪,优化花费了很长时间。 我们的技术总监戴夫·巴雷特(Dave Barrett)立即利用了我们的优势:我们拥有JC3的必要性能指标,因此发动机开发部门负责人丹尼尔·皮埃尔罗尼(Daniel Pieroni)的任务是确定可以在每个技术方面使用最大的性能和内存成本。 在33毫秒的处理器时间内,我们在4个线程上给了我们8.5毫秒的宽裕时间,分配给它以每秒30次的频率创建一个帧。 Havok在此预算中占据了很大一部分,用于识别物体之间可能发生的碰撞,计算接触,解决约束以及“整合”所有活动物体的运动以在经过33 ms的模拟时间后确定其位置。 我粗略估算出,与空气动力学和风有关的所有计算的预算应在4个线程上大约为1毫秒。 基本上,我们设法将预算保持在预算之内,尽管最好向Daniel询问。 当在现代CPU上计算数百个对象时,下面介绍的解决方案对于实时而言足够快。 当然,可以通过调整使其在GPU上运行来进一步优化它。
在本文的其余部分,我将简要讨论如何解决每个问题,对于感兴趣的人,我将在应用程序中提供详细信息和数学计算。
JC4中的风-早期概念艺术(Ironklad Studios)阻力模型
我们创建阻力模型的目的是评估阻力和扭矩的作用力,这些作用力与现实世界中应用于任意形状的物体的作用力近似。 请注意,我们在这里很坦率-没有人要求巨大的现实主义。 但是,我们有一些要求。 首先,阻力必须抵消身体的运动。 其次,必须根据空气阻力的基本方程式计算力。 根据图形的表面积和空气移动速度的平方而变化。 最后,必须以某种方式考虑身体的形状和大小,以使具有相同表面积但形状完全不同的对象的行为有所不同。 我很想根据描述它的平行四边形来简单地估计每个物体的形状,但是我认为还需要做更多的事情,因为这很明显-许多物体的形状可能与盒子甚至少量盒子有很大不同。 我以前在使用体素或球体大致估计3D对象体积的系统上工作的经验,使我寻求更好的解决方案。 我可以为每个对象手动选择电阻系数,但是我想避免在已经很复杂的管道中进行另一阶段的手动调整。 因此,我继续寻找一种自动化的方法。 我很高兴我没有退缩。
评估物体碰撞形状的每个表面上的风压的最简单方法是仅考虑传入的风,而忽略物体周围的所有空气循环以及物体周围空气的粘性。 好像空气阻力仅由向前移动物体前面的空气质量或吸收空气组成。 早期的原型表明,此方法足以满足我们的目的。
“唯一”的问题是,在游戏执行期间,每个人物的成千上万个三角形的贡献之和要比所需的成本水平高一个数量级。 在“沉重”的场景中,我们可以轻松达到100,000张以上的面孔。 如果我们可以提前计算出力,那将是很好的。 “强力”的第一种方法是对空气动力和扭矩的初步计算,当物体在不同方向上以不同角速度旋转时,当物体在静止空气中沿多个方向以不同速度运动时,就会产生气动力和扭矩。 因此,我们获得了一个查询表,可以在游戏执行期间从中获取值。 可以将其想象为虚拟风洞,包括在内容编译过程中,其中,我们依次放置所有对象并将它们暴露于不同的移动或旋转速度,将每个对象放置在不同的角度,并每次测量力和扭矩。
这张桌子是什么样的? 运行时的已知值是物体的线速度和角速度,因此
,即每个对象仅约300 KB。 而且,这至少比允许的内存消耗大一个数量级。
为了显着减少样本数量,我使用了两种技术。 首先,我将计算结果转换为线性形式,将其分别基于仅针对运动和旋转体的力和扭矩的初步计算得出的总和。 其次,我将其近似为一个解析公式,用于基于预先计算的反应以任意速度外推值,并且仅以1 m / s的速度和1 rad / s的速度外推值。 这样可以将每个对象的预计算表减少到仅7 KB。 不幸的是,为此,我不得不执行几种近似方法。 该问题的原因在于,即使使用非常简单的阻力模型,我们也面临这样一个事实,即施加到身体上的力(即旋转和位移)不仅仅是旋转和位移分别施加的力之和。 即使必须添加近似值,也可以保存一些由移动时旋转组合引起的项,类似于科里奥利组件。 措词的结论可以在附录1中找到。因此,我们不直接存储每个样本的力和扭矩,而是存储项的向量
在线性公式中使用。 每个样本在特定方向上对应于相对于1m / s的空气的单位线速度或相对于1rad / s的空气的单位角速度。 此向量的分量用于公式中,该公式在计算需要施加到对象的力和扭矩时,还考虑了对象相对于空气的真实线性和角速度。 附录1详细说明了这种情况。
为了存储搜索表,我们使用了一个立方体贴图,即 一个立方体,其表面被分成大小为3x3的网格,就像魔方。 我们将值存储在单元格的角落,因此每个面都可以存储4x4的值。 在单元的每个角,我们计算从立方体的中心到角的向量,并对这个向量进行归一化以获得单位方向。 我们使用这个单位方向向量作为
在细胞的角落。 结果,我们得到6个表(每个边缘一个),每个表包含16个元素,每个元素具有19个浮点值,略大于7 KB,这非常方便。 有一些方法可以进一步减少样本数量,但是使用此方法可以很容易地插值任意速度的方向:由于它总是落入单元格中,因此始终可以使用此单元格四个角中的值对该特定方向执行双线性插值。 三次贴图和双线性插值技术在渲染中使用非常广泛,因此查找有关它的信息和相应的代码非常容易。
图1.单位速度相对于空气的三次方图。 在此图中,我用红色突出显示了立方图的一个单独的单元以说明原理。 具有线速度 相对于空气,我们再次对同一立方图进行采样以找到蓝色单元,并使用存储在其角部的4个系数。 然后,我们根据附录1中的公式混合所有值。尽管这在大多数情况下可行,但在运行时更改对象的质心或比例中心时遇到了困难。 我们针对这些问题的解决方案可以在附录2和3中找到。
在开发此模型时,我不确定样本的数量足以使物体在空中移动和旋转时表现良好,因此我不确定在运行时磁盘上是否有足够的内存。 同时,我们开始为Havok创建新的销毁资产,其中包括数百个各种大小的碎片,有时一个资产有数百个零件。 我突然意识到,如果每个片段都有自己的立方图,那么其中的某些资产将需要与其他许多资产一样数量的内存。 通用模型很好地传达了复杂对象的一些独特特征,但对于小碎片来说实在太多了。 另外,我不确定运行时的成本,因此能够返回到较低成本的模型是降低风险的好方法。 因此,我发现仅基于对象边界框的措辞非常紧凑(进行大体近似)。 可以在附录4中找到。
风量
我们引入了风量的概念,以支持强烈的,物理激活的对象风只能在有限的空间中发生的观点,并开始根据风的形状和分布对其进行分类。 我们将风量分为以下主要类型:
- 用于暴风雪,沙尘暴和热带风暴的圆柱形风量
- 龙卷风风量-一组垂直于垂直花键的圆柱体,它们随时间而变形
- 风洞由几个相互连接的胶囊状图形(半径不同的胶囊在不同末端组成)组成,形成类似“虫洞”的形状
最终体积对风的限制受到了多次批评,最后,他们几乎放弃了风,取而代之的是“地形风”。 到处的风被认为与高层大气中的云运动相对应,并且在遇到地形不断增加的坡度时为玩家提供向上的气流。
我们实现了它,但是缺少清晰的图形显示风迫使我们放弃了此功能。渲染部门的工作人员已经承担了太多的任务,包括出售云,河流,瀑布,升级到DirectX 12等。回想起来,事实证明,无论是形状(圆柱体)还是风分布(对于沙尘暴来说几乎是单向的,对于暴风雪来说都是围绕中心轴旋转的),风暴变成了最简单的风。另一方面,龙卷风和风洞却变得更加复杂,应该得到更详细的解释。龙卷风
我们对物体应如何围绕龙卷风旋转有一个清晰而简单的想法,但是对于达成该结果所必需的风的分布,我们没有达成共识。无需无休止的辩论,我们使风场的各个组件在运行时可自定义,以便Hamish可以对其进行试验并迅速找到可行的选择。龙卷风实质上是一堆水平圆柱体,其中心位于中心花键上,随着时间的推移会发生变形。在这些水平圆柱体中,我们将龙卷风风场分解为具有切线分量,径向分量和垂直分量的圆柱坐标。每个组件都可以使用可变曲线进行调整。2. — . , , . . , .与许多其他功能一样,在我们行业中通常如此,Hamish和我经常从设置到编码,直到结果足够好为止。 Hamish调整了曲线以适应自己的喜好,沿着龙卷风扔了数十个12米的容器,以观察它们的行为。他为龙卷风使用了记录的最大风速(约230 mph)。一段时间后,哈米什(Hamish)发现他的装置很复杂,因为有必要使到处的风对应于简单的旋转运动,但同时又将物体吸引到中心。角速度已经成为领域的一部分,不仅在龙卷风中推动而且旋转物体。这样可以确保,例如,粘在中心的对象可以根据需要旋转到位。因此,哈米什(Hamish)要求从风开始,在中心处与该角速度相对应的任何地方,即从理想旋转场的速度场开始,可以在其中添加自定义风场。最后设置之后,曲线开始由以下组件组成:- -径向分量的系数(径向运动)
- 是切线分量(径向运动)的因数
- -垂直分量的系数(径向运动)
- -水平分量乘数(垂直运动)
- -垂直分量的因子(垂直运动)
哪里 是龙卷风底部上方的高度,并且是距中心的距离。龙卷风的风速由下式给出:
当物体在给定距离上加速至龙卷风的切线速度时,空气阻力的切线分量基本上为零,因为空气和物体都沿切线一致移动。其余的风速将物体向内吸引,因为该星球吸引了卫星弯曲其轨迹,使其保持在轨道中。同样,物体被推到更高的高度。向上推物体是最重要的性能优化,它可以防止计算数百个物体和地球之间的接触而进行昂贵的计算。它还有助于通过龙卷风的高度通过在空间上分布对象来增加半径,以减少其碰撞和接触计算的可能性。当一层冷空气位于一层暖空气之上时,空气交换形成了现实世界中的龙卷风。温暖的空气像龙卷风中心周围的漩涡一样上升,这是冷空气的下落。因此,原则上,在漏斗的中心,风速应强烈向下。如您所见,这不是为了减少将物体推到地面并将其拉入龙卷风的可能性而实施的,否则会增加成本高昂的碰撞计算。3. (), (). 为了更好地了解龙卷风的正常运行是否需要额外的磁场,我们开始使用的风的旋转磁场。 在右侧的版本中,添加了旋转字段。 在远处,我们看到一个非常快的风,在任何指向半径大约45度的点处。 左侧的垂直部分显示龙卷风应拉入中心的位置。 然后是一个很小的过渡间隔,在该过渡间隔中几乎没有风,而在其后面,中心处有一个很强的旋转场。 风场的强度用颜色显示,越红,越强。
图4.龙卷风场周围的路径线-直线的中心样条线。直接龙卷风似乎很无聊。 为了使它变形,我们使用了两个由两端相连的三次样条,它们的3个控制点在轨道上,并围绕假想的垂直线以不同的速度移动。 最终的龙卷风剖面随时间变化,因此它从S形缓慢过渡到C形,反之亦然。 附录5详细介绍了如何创建样条曲线。 有趣的是,在扭曲模式下的龙卷风也不起作用。 现在,一旦龙卷风的中央裂口移开,在直接龙卷风轨道上盘旋的物体便散开了,可悲的是掉到了地上。 为了解决这个问题,由于龙卷风本身的变形,我们在速度上添加了另一个术语。 最后,这种变形应该主要是由于空气的运动而引起的,对我们来说,添加此分量似乎是很自然的。 这很好地解决了问题,使我们的路径线与下图非常相似。
图5.龙卷风场周围的路径线-中心花键随时间弯曲图6.游戏中龙卷风的一个示例,它破坏并吸收了路径中的所有东西。 这是Havok Visual Debugger(VDB),这是一个非常有用的工具,可让我们观察模拟的元素。风洞
风洞的设计旨在提供世界各地的物理风控制,例如峡谷和洞穴,以及巨大的工业风扇和大炮前面的烟柱。 它们可用于在某些空间或任务中引导玩家。 我们的第一个原型使用的是传统的圆柱体,该圆柱体具有与圆柱体的旋转轴平行的恒定速度的均匀矢量场。 将所有这些圆柱体放置在场景中是一项艰巨的任务,因此,我们改用三次贝塞尔曲线样条线,在其周围拉伸半径不同的圆。 通过将中心花键划分为胶囊形图形(即,圆柱状图形)可以近似此形状。 边缘周围半径不同的胶囊上。 它们中的速度场也发生了一些变化。 最初,隧道中的风与中心花键相切。 我们在样条曲线的每个控制点上设置风速,并沿着样条曲线段从一个控制点向另一个控制点内插风速。 但是,约书亚·埃斯皮诺萨(Joshua Espinosa)(在风洞中工作的设计师以及玩家在风洞上的动作)很快发现他还需要两个组件。 一个组成部分是上游,为玩家提供了额外的人工提升,始终向上。 我们将另一部分称为“回缩”,它将玩家推向中心花键,但最重要的是位于隧道的边缘,降至中心为零。 最终,隧道外部的减小边界确保了从隧道外部到外部的平滑过渡。 该边界的厚度指定为半径的百分比; 它作用于整个风洞。
图7.风洞分成一系列重叠的胶囊状图形。 当样条的方向改变时,或者不再可能进行半径(A)或风速(B)的线性纵向插值时,就会发生分离。 我们沿着样条线计算了这些变量的二阶导数,以确定何时拆分。图8.在Apex Engine中编辑的风洞。 根据样条线,风洞沿样条线的半径和速度的变化会以正确的方式将其分成小包。 如下一节所述,您还可以看到将胶囊形图形分类为Morton曲线的空间分隔。 这些计算足够快以进行实时更新。 此外,您可以快速与风洞进行交互以对其进行测试。 该编辑工具是通过对河流创建工具的某些部分进行重新加工并添加调试渲染而成的。图9.一个长风洞的示例,允许玩家向上游移动到山上。 河水将里克推向大海,风可以使他迅速回到同一条河上的土地内。 玩家的机械部门注意到Rico的侧风太急,因此风的主要影响是使玩家加速(带顺风)或制动(逆风)并给他额外的升力(上游部分)。图10.相同风洞中机翼上的Rico。 此处玩家没有控制方向。 起初,Rico失去高度,直到到达风洞的外部,这逐渐减缓了它的下降速度。 然后,中央部分产生足够的向上流动来克服重力,并迅速将其加速到峡谷上方。 JC3 Wingsuit代码由Joshua Espinosa,Hamish Young和Rickard Granfeld开发,用于与风进行适当的交互。风请求优化
具有数百个活动物体的潜力,计算位置上的局部风应该是一个快速的过程。 我们通过为每个风量计算AABB(轴向对齐的边界框)并将其存储在紧密排列的数组中来开始优化查询。 由于可以快速检查每个ABB的位置,而不会丢失缓存,因此可以排除暴力。 在每个AABB框架中,阵列中的风量都会更新以准备请求。
如果位置在风暴量之内,则我们使用圆柱形状直接计算风的影响。 对于龙卷风,您需要进行更多的计算,因为在顶部龙卷风比在底部宽得多,而对象的最高密度在底部。 AABB解决方案无法很好地切割龙卷风附近的物体,因此我们使用了彼此堆叠的圆柱体。 它们将龙卷风的形状传递得更近,并在计算风之前用于修剪物体。 最新的龙卷风优化是为了避免将查询位置投影到中央样条曲线上。 这是可能的,因为尽管样条龙卷风已插值到3D点中,因此它是一条参数化3D曲线,但实际上,由其插值的控制点沿垂直方向均匀且顺序地分布,这给了我们一个相当简单的曲线。 通常,将点投影到3D样条线上或在该样条线上找到具有相同高度的点都需要沿着该样条进行搜索。 但是,相反,我们决定使用龙卷风底部上方的高度作为样条线本身的采样参数来更改样条线的采样方式。 这会稍微改变样条曲线的形状,但样条曲线仍会穿过插值点。 但是,与此同时,要在样条线上找到相同高度的点,将其归结为将请求位置的高度转移到该位置,然后将点的高度固定在请求的高度中。 对于沿垂直轴不均匀放置的控制点,差异是明显的,但是当它们均匀放置时,几乎看不到。 我们还可以更改使用三次方高度函数而不是参数曲线来构建中心曲线的方式,但是,与许多其他优化一样,此优化似乎为时已晚。
风洞还需要优化,因为甚至没有考虑每个查询点在每个风洞的中心样条上的投影。 幸运的是,我们设法利用了Engin Silasun同时为河流实施的技术:稀疏的空间数据库。 我们将空间分为32
。 如果该单元不在空间数据库中,则在查询点没有风洞引起的风。 如果找到该单元,则需要执行更昂贵的检查。 此外,这种检查应该相当快,因此我们将风洞切成胶囊状。 在一般情况下,使用胶囊是因为可以以低成本计算到其中心段的距离。 胶囊形状的图形要贵一些,但比找到到三次样条线的最短距离还快。 风洞空间整体系统的另一个特性是,我们可以记住位于前一帧中的某个对象的单元格索引,并将其用作提示以加快下一帧中的查询,因为它很可能已位于此帧或相邻帧中细胞。
图11.根据风洞穿过的小室,将胶囊形状的风洞图形输入到稀疏空间数据库中。 结果是9个单元格的阵列,每个单元格只有几个胶囊状的图形。总结
我们使用的技术的结合已被证明是非常有效的。 这些技术本身被积极地用于编程中。 大多数工作在于他们的选择,并确保他们进行适当的协作以解决当前的问题。 这是编程视频游戏的典型方法:充满了许多小问题,需要简单但可靠的解决方案。
空气阻力模型得到了极大简化,没有反映实际流体流动的一些重要特性。 例如,与我们的粗糙模型相比,以45度角旋转的图纸将产生更大的升力。 但是,这样做的好处是,不会在运行时计算力和扭矩,并且使用三次方图的解决方案可以避免进行更详细的仿真。 实际上,我们使用开源计算流体动力学软件(OpenFOAM)检查了在测试对象(JC4的老式汽车)的整个立方图中生成的力和扭矩的计算。 比较结果表明,我们与正确的结果相差不远,但是三次贴图的“形状”有所不同,我希望对于机翼形状的物体,它的差异甚至更大。 但是,计算该软件需要花费几个小时,因此很明显,这种解决方案并不适合在所有对象上使用。 我们的方法花费每个对象不到一秒钟。 但是我认为,对于基于物理的游戏来说,对所有物体都具有快速但逼真的空气动力学系数将是非常有趣的。 假设Rico可以在巨大的回旋镖中收集物体。 我短暂地尝试了这个想法,观看了枫树直升机种子的快速下落和旋转,并在Maya中创建了一个模型来观察发生了什么。 结果证明比预期的要好,并且当物体掉落时,它的旋转确实很慢。 但是在我看来,为了更快地旋转,有必要显着改善空气阻力模型。 通常,我们只是没有足够的时间。
图12.左:Just Cause 4的老式油车的所有方向,放置在虚拟风洞中,以在每个面上填充5x5网格的立方图。 右:Paraview可视化两个方向的结果-上方(上方)和后面(下方)成一定角度。 红色表示高压,蓝色表示低压,线表示流量。龙卷风和风暴非常有效。 龙卷风变形仍然可以改善。 如果我们花更多时间在此上,我们可能能够制造龙卷风(当然是用鲨鱼代替牛),漩涡或火龙卷风。 我们还有另一个想法-开发能制造迷你龙卷风的加农炮。
风洞已在世界的不同地方用于控制岛屿上的风,例如在一些军事基地周围的峡谷,任务等。 它们以战略性定位的上升风帮助玩家穿越开放世界的广阔广阔天地。 但是我认为最好使用地形风的概念,因为我们没有时间来实施它。 首先实施它会更合理,它将为我们提供几乎不需要调整的系统性无处不在的风,并且风洞将提供对其偏离的局部控制。
最后,使用风障作为游戏机制是一个合乎逻辑的想法。 我们实现了一个可播放的障碍物原型,该原型已在团队内部显示,但由于缺乏正确实施的时间而放弃了它。 他的物理学只是该功能总成本的一部分,而大多数开发团队都应该支持。
但是,没有什么能使我对在JC4中所做的事情感到骄傲而感到分心。 我们对极端天气条件(尤其是龙卷风)的可视化,再加上Rico在太空中移动的能力,可以创造出绝对独特而出色的游戏玩法。 希望您像我们创建JC4一样喜欢玩JC4。
附录1:空气阻力模型
我们看身体
由网格定义
。
图13.身体 。考虑一个三角形
:
图14.三角形和中心速度。现在我们需要写元素力
作用于这个三角形。 我们需要在这里考虑我们的要求:
这几乎符合要求,因为力几乎总是逆着运动方向指向侧面,与三角形的表面积成正比,并且与三角形相对于空气的速度的平方成正比。 为了使力作用在整个身体上,对于我们来说,总结这些力就足够了:
当我们努力将一切降低到1 m / s和1 rad / s时,让我们用
:
现在是第一个大近似值:
这等效于用三角形两侧的长度之和来近似三角形的斜边的长度。 这种近似也称为“城市街区距离”(曼哈顿距离)。 当我从事这项工作时,我只是在曼哈顿,所以不使用它是愚蠢的。 因此,我们有以下内容:
我们分解:
起初,这似乎令人生畏。 但是随后您注意到这就是我们想要的。 请注意,仅找到金额
所有三角形之间的平均值:
让我们用
。 现在我们终于可以写:
其中:
\开始{align *} \ vec {F} _t(\ hat {v})&= \ sum {-A_i \ hat {v} \ cdot \ hat {n} _i \ \ hat {n} _i} \\ \ vec {F} _r(\ hat {\ omega})&= \ sum {-A_i \ | \ hat {\ omega} \ times \ vec {OC_i} \ |(\\ hat {\ omega} \ times \ vec { OC_i}} \ cdot \ hat {n} _i \ \ hat {n} _i} \\ \ vec {F} _c(\ hat {\ omega})&= \ sum {-A_i(\ hat {\ omega} \次\ vec {OC_i})\ cdot \帽子{n} _i \ \帽子{n} _i} \\ \上线{v_r}(\帽子{\ omega})&= {1 \超过N} \总和{\ | \帽子{\ omega} \次\ vec {OC_i} \ | } \ end {align *}
这些力相对于点的力矩
可以以类似的方式获得。 结果,我们得到以下信息:
其中:
根据以上定义,我们现在可以形成一个向量
:
这是19个值的向量,我们参考示例表
,但我们可以找到相当接近的值,然后直接使用它们,或使用它们对输出进行插值。 在此阶段,本文中描述的立方图开始起作用。
附录2:质心
您可能会注意到上面显示的值是相对于任意点计算的
。 作用在身体上的总力就是所有力的总和:
片刻
设置为:
以及这些力相对于该点的总力矩
等于:
现在只是一个数学定义,一个公式不能直接用于改变身体的运动,因为重心 沙尔定理在该公式中的 G等于:
我们认识到力量的时刻 ,因此:
如果我们计算总强度,这对我们非常有用 不变,并向质心施加以下扭矩:
起初,我决定以身体的原点为准 位于身体边界平行四边形的中心,该位置应仍靠近质心,并将风采样定位在相对于身体最合理的位置。附录3:缩放
当气球被引入游戏时,另一个缺陷出现了。这些球是球形的,其大小可能会以5或10的倍数变化。就质心而言,重新计算运行时的空气动力学特性过于昂贵。是否可以导出分析公式?图15主体 再次考虑身体,但现在是缩放对象。我们得到:
使用与第一次相同的近似值,并替换 我们得到:
用于缩放身体的质心 。
附录4:平行四边形的简化电阻模型
有许多方法可以近似估计平行四边形的力和扭矩,并且可以获得不同的公式。足够紧凑,易于在运行时在代码和计算中实现,可以通过忽略角运动对线性力的影响以及线性速度对转矩的影响来推断。取边界平行四边形尺寸 ,我们可以得出以下紧凑公式:
附录5:龙卷风中心花键
龙卷风以形状缓慢变化的中央曲线为中心。我们使用两个连续的Bezier三次样条曲线实现了这一点: 为底部和 为顶部。花键 有控制点 ,
,
和
和 由点控制 ,
,
和
。
龙卷风本身的位置是一个点 在地面和最高点 它从云层的上方开始,但时间较晚,慢慢跟随地球的位置。由于曲线在一端相连, 和
在空间上重合。我们还使用了3个水平参考轨道作为点 ,
和
。
终于 恰好位于之间的中点 和
和 在之间的中点 和
。
 |  |
创建龙卷风中心样条 | 龙卷风中心花键随时间的演变 |
参考文献
- 正当原因4
- 哈沃克
- 多维和度量数据结构的基础。哈南沙美
- Z阶曲线
- 多维数据集映射
- 开孔泡沫
- 伏打
- 铁甲工作室