跳伞速降分析2.0

avatar
关注
跳伞速降分析

前言

 

上一篇文章中,我们将跳伞划分为两个阶段,分别是坐飞机阶段,跳伞滑行阶段。坐飞机阶段很简单,就是一个匀速直线运动,飞机速度是500km/h。跳伞滑行阶段则比较复杂,至少需要分为四个阶段,分别是直飞阶段、开垂阶段、垂落阶段、压伞阶段。我们试过了对这四个阶段进行建模,然后计算时间,得出的结果却与游戏经验有较大差距。简单来说就是,待飞距离x约等于直线距离d加一百米。这明显不是最快的跳伞方法。经过多次对模型公式、数据的检查,没有发现错误,那只能得出一个结论,pubg采用的游戏引擎与真实世界有差异。回头想想也对,飞机速度是人物滑行速度的3倍,怎么着都得多坐一会飞机,尽可能逼近目的地然后再跳伞吧。游戏经验却告诉我们不是这么回事,那么只能说游戏的三维空间不均匀,不满足各向同性。如果站在程序员的角度思考,就解释得通了,计算机资源有限,大多数游戏角色大部分时间都集中在地面附近活动,那么高空的建模肯定要做近似处理,不能像地面一样耗费大量资源做精细建模,或许就是这个近似处理导致了误差。

 

思考

 

既然跳伞滑行阶段要进行高度上的大尺度移动,而建模结果又与游戏经验不符合,那么我们只能尝试绕开它。所以我们对模型进行简化,同样还是分为两个阶段,分别是坐飞机阶段、跳伞滑行阶段。但是跳伞滑行阶段的时间t2我们不通过数学计算来得到,直接通过测试在游戏内采集,那么就能回避上面提到的问题。而坐飞机时间t1很简单,就是匀速直线运动,而且高度不变, 一直是1500m,也回避了上面提到的问题。

 

实践

 

如何采集t2我尝试介绍得详细一点,方便有心人和后来者完善超越。我们知道x的变化范围是从d到L,我们只需要采集一些离散点的值就行,例如x为150、200、300、……、1200、1250。补充一下,最小平飞距离约为150m,最大平飞距离约为1250m。

 

1.      以测量800m的跳伞时间为例。补充一下,地图有5级缩放,分别对应的比例尺是411 m/cm、196.1 m/cm、102.7 m/cm、51.5 m/cm、25.7m/cm。标出一个目的地,然后计算出地图上的距离,以中间的三级缩放为例,800÷102.7≈7.8。

2.      用屏幕标尺软件找到航线上距离目的地标点为7.8cm的起跳点,并做出两点之间连线。

3.      从起跳点附近跳伞,朝着目的地直飞,保持飞行轨迹在地图上呈直线状态。

4.      落地后不要移动,测量从实际起跳点到实际落点之间的距离为7.7cm,通过比例尺换算成实际距离,7.7*102.7=790.79。

5.      通过视频剪辑软件找到出舱瞬间至落地瞬间的用时t2=37.22。就可以得到一组对应的取值x=790.79,t2=37.22。

 

公式

 

此时的计算公式如下

 

测试说明

 

其中,L=1250,x=790.79,v=138.9,t2=37.22,当d=0、50、100、……、1200、1250时,我们可以求得对应的T。以此类推,我们可以测试x为150、200、300、……、1200、1250附近对应的t2。考虑到测量的误差,所以这个对应关系还是不准确。需要大量测试来逼近极限值,只要保证x增大,t也增大,那么结果就可以接受,如果x增大,t反而减小了,说明前一个x的测试不够准确,没有逼近极限,需要再次测试。例如x=494.4时,t=35,假如再次测试x=612.85时,t=34.88<35,说明x=494.4时的极限用时也应该小于34.88,需要重新测试。整个研究的工作量就在这里,这里测得越精确,那么我们得到的最终结果就越精确。

更新结果只需要更新这部分代码,把键值对改一下就行,其他地方完全不用动。

 

代码

 

假设我们已经得到了足够精确的对应关系,我们写出python代码,让计算机帮我们算出T、x、d的对应关系,并且做成表格。

import mathimport pandas as pdfrom tabulate import tabulateL = 1250v = 138.9# 定义f(x)的值f_values = {    146.49: 34.15,    213.31: 34.31,    295.55: 34.47,    396.55: 34.67,    494.4: 35,    612.85: 35.57,    705.55: 36.53,    801.06: 36.92,    903.76: 38.53,    985.92: 40.53,    1088.62: 40.6,    1181.05: 40.65,    1222.13: 41.23}# 计算表格数据data = []d_values = range(0, L + 1, 50)  # d的取值范围为0到1250,增量为50for d in d_values:    row =     for x in f_values.keys():        if d <= x <= x <= L:            t1 = (math.sqrt(L 2 - d 2) - x * math.cos(math.asin(d / x))) / v            t2 = f_values            T = t1 + t2            row.append(round(T, 3))        else:            row.append('-')    data.append(row)# 打印结果headers = ['x'] + list(f_values.keys())table = tabulate(data, headers=headers, tablefmt='grid')print(table)# 创建DataFramedf = pd.DataFrame(data, columns=headers)# 保存为Excel文件df.to_excel('result.xlsx', index=False)print("表格已保存为result.xlsx文件。")

对表格数据进行处理,找出最小值,然后我们就可以得到当d等于某一个具体值时,对应的x的最小取值。图中显示,目的地与航线距离d小于700时,都采用801.6≈800m跳法最快,d介于700和1000中间时采用1200米跳法最快,d大于1000采用1250米跳法最快,也就是平飞。

 

总结

上图的最终结果不一定准确,但是能看出已经部分贴近游戏经验了,800m确实是一个万金油跳法。如果职业玩家不满足于这个近似结果,那么只需要照着流程去大量测试x和t的对应关系,逼近极限,然后修改代码重新计算做表格,那么我们将得到一个无限趋近于最优跳法的结果。领先0.1s就可以领先1.5m,完美主义者的福音。

对于普通玩家,也有一个比800m万金油跳法更好的选择,x=(d+L)/2,这个结果是在大量测试中凭直觉猜的一个公式。对应关系如下。

我用这个表格去普通匹配模式跳宿舍楼测试了二十局左右,暂时还没有碰见更快的玩家,也可能是强度不够高,感兴趣的普通玩家可以去排位模式测试一下。职业玩家就没必要参考这个凭感觉猜测的结果了,还是第一种方法通过大量测试计算才能达到职业比赛的精度要求。

结语

 

有志者,事竟成,破釜沉舟,百二秦关终属楚;

苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

Python的运行环境和视频剪辑软件clipchamp的使用都不算困难,希望有兴趣的人可以多动手尝试,获取一手数据,修炼成自己的葵花宝典。

涉及工具

 

屏幕标尺软件《fastone capture》

视频剪辑软件《clipchamp》

AI软件《chatgpt》

代码编辑软件《idea》

绘图软件《onenote》

表格处理软件《excel》

发布于四川阅读 5953

这些回复亮了

discusser-avatar

一把石首

· 浙江
最纯粹的izuoOK@pero收起

pero:你觉得这是我能看懂的?

亮了(18)
查看回复(1)
回复