【MC运动理论】竖直运动与卡角原理(二)[全版本]
我是聪_cong
2026年07月31日 15:49

第二章 一维运动(I)——竖直运动与卡角原理

在我们开始深入竖直方向运动之前,请务必确认第一章的三条公理已经刻在你的脑海中,因为本章及以后所有关于玩家运动的讨论,最终的底层逻辑都将回归到这三大公理。

本章我们将做三件事:

1. 彻底理解“跳一下”到底发生了什么——从按下空格到落回地面,每一个tick的速度如何变化,位置如何累加,最高点在哪里,为什么跳得最高不是第6tick的起点而是终点。

2. 将离散的递推关系升华为优雅的通项公式——从此不必逐tick迭代,直接输入t就能知道任意时刻的速度和高度。

3. 解析《我的世界》最迷人的垂直运动异常——卡角。你将亲眼见证,一个为“跨上台阶”而生的步行辅助机制,如何被我们驯化为突破高度极限的精确工具。

本章是该系列定量计算的真正起点。请准备纸笔,我们将一起完成这些推导。


2.1 自由落体:最简单的离散系统(游戏内有模拟阻力过程,但我们仍然叫它自由落体)

2.1.1 从递推关系开始

在没有任何垂直初速度的情况下,玩家从空中释放。游戏每tick对垂直速度执行两个操作:

1. 加重力:速度减去 0.08 b/t²(方向向下,符号为负)

2. 乘阻力:速度乘以 0.98

用数学语言描述,这就是一个一阶线性递推关系。设第 t 个tick开始时的垂直速度为 v(t)(注意:这里的下标t是“时刻t开始”还是“tick t结束”?为了和后续跳跃公式统一,我们采用与MCPK Wiki一致的约定:v₁是起跳后第1个tick结束时的速度,即位移,但自由落体通常从v₀=0开始,第一个tick结束时获得速度v₁ = -0.08*0.98=-0.0784)。

为了推导清晰,我们先定义符号体系:

· 记 v₀ = 玩家在起跳/下落前一刻的垂直速度。对于从静止释放的自由落体,v₀ = 0。

· 对于 t ≥ 1,vₜ 表示第t个tick结束时的瞬时速度,也是该tick内的平均位移(单位:b/t)。

于是,自由落体的运动规则可以写成:

```

v₁ = (0 - 0.08) × 0.98 = -0.0784

v₂ = (v₁ - 0.08) × 0.98

v₃ = (v₂ - 0.08) × 0.98

...

```

更一般地,递推公式如下:

公式 2.1(自由落体速度递推)

其中初始条件 v₀ = 0 。

2.1.2 为什么要先学自由落体?

你可能会问:我们最终关心的是跳跃,为什么要先研究下落?因为跳跃就是自由落体的逆过程加上一个初始冲量。跳跃上升段和下落段服从完全相同的物理规则——都是“每tick减去0.08再乘以0.98”。唯一的区别是起始速度的方向和大小。

深刻洞察:重力加速度 -0.08 b/t² 和空气阻力 0.98 是垂直运动唯二的两个参数。它们不仅是自由落体的核心,也是跳跃、卡角、顶头的核心。掌握了这个递推关系,你就掌握了《我的世界》垂直运动的秘密。

2.1.3 通项公式的推导(等比+等差复合数列)

公式2.1是一个经典的一阶线性非齐次递推。我们如何求解它的通项?

步骤1:寻找不动点(稳定速度)

这个 -3.92 b/t 就是终端速度。无论你从多高的地方落下,速度最终会趋近于这个值,永远不会超过它(绝对值)。这是指数衰减的特性。

步骤2:构造新数列消去常数项

一个聪明的方法是从递推式直接观察结构:

这是一个等比数列,公比 q = 0.98 。

步骤3:确定初始项并写出通项

公式 2.2(自由落体速度通项)

2.1.4 位移公式:前t项和

公式 2.3(自由落体位移通项)

关于负号:在我们的坐标系中,竖直向上为正,向下为负。因此下落位移为负值是正常的。如果你习惯讨论“下落了多少格”,只需取绝对值。


2.2 标准跳跃:上升与下落的完整周期

2.2.1 起跳:初始速度的注入

当玩家在地面上按下跳跃键时,游戏执行以下操作。

起跳瞬间(t=1):

· 垂直速度直接设置为 0.42 b/t(这个常量是可以拆解的,但暂时不讨论)

· 如果有跳跃提升药水效果,每级增加0.1

递推起点:我们定义 v₁ = 0.42。

t ≥ 2 以后:无论玩家是否还在按着空格,垂直运动回归自由落体规则——每tick先减0.08,再乘0.98。

为什么?因为跳跃动作只在按下空格的那一刻“注入”了一次初始速度,之后游戏不再对垂直方向施加任何正向推力。这完全符合物理直觉:你跳起来之后,在空中再怎么按空格也不会飞得更高。

因此,标准跳跃的垂直速度递推公式就是:

公式 2.4(跳跃速度递推)

2.2.2 与自由落体的关系:一个简洁的变换

观察这个递推式,它与自由落体(公式2.1)形式完全相同,仅仅是初始条件不同(自由落体从0开始,跳跃从0.42开始)。这意味着我们之前推导的所有关于等比数列变换的技巧,可以直接套用。为了使文章更简洁,我们直接省略推导步骤,给出结果。

精度说明:Minecraft内部使用浮点数运算,每步都有微小的舍入误差。我们推导的公式在数学上是精确的,但与游戏实际值存在约10⁻⁵量级的偏差。在多数的跑酷计算中,这个偏差可以忽略;若你需要绝对精确的模拟,必须用递推逐tick还原浮点舍入过程(通常用Excel实现)。本教程所有公式均按数学精确值呈现。

下面我们来解读这些公式。

2.2.3 关键特征1:最高点出现在第几tick?

直觉告诉我们,当速度从正变为负的那一tick,玩家经过最高点。但注意:速度是tick结束时的瞬时值,不是整个tick的平均值。

·t=5:v₅ ≈ 0.08361(仍为正,仍在上升)

· t=6: v₆ ≈ 0.00394(极小的正值,几乎为0)

· t=7: v₇ ≈ -0.07454(已为负,开始下降)

玩家在第6个tick结束时达到最高点。这个tick内的位移(从第6tick开始到第6tick结束)仍然为正(约0.00394),所以最高点实际上是第6tick结束时的位置。

最高点高度 = 前6个tick位移之和。

我们先给出关键结论(Java1.8版本):

(Java1.9+版本因移动阻断阈值降低,最高点高度提升至约1.252b,Bedrock版本没有移动阻断,最大高度与之相同)

经过计算,这个高版本的最大高度精确等于1.252203352512b

2.2.4 关键特征2:落地时刻与Tier的定义

玩家从起跳(v₁=0.42)到落回地面(Y=0)需要多少个tick?

t=11时,位移累计为约0.1213(仍为正,在地面上方)

t=12时,位移累计为约-0.3235(已为负,穿过地面)

因此,落地的瞬间发生在第11个tick结束之后、第12个tick开始之前的某个时刻。按照我们在第一章的定义,将落回起跳平面的瞬间定义为 0 Tier。那么:

· 起跳瞬间(第1tick开始)是 +11 Tier

· 第2tick开始是 +10 Tier

· ……

· 第11tick结束是 +1 Tier(此刻Y≈0.1213,仍高于地面)

· 第12tick开始前瞬间是 0 Tier(Y=0)

· 第12tick结束时是 -1 Tier(Y<0)

这就是Tier与Tick的映射关系。这个映射是标准平地跳跃的固有属性,一旦跳跃周期长度因天花板、卡角或高低差而改变,映射关系也可能会变化。我们将在后续详细讨论。

2.2.5 Java1.8与1.9+的版本差异

1.9+版本对垂直运动做了两项微小调整:

1. 移动阻断阈值从 |v| < 0.005 降低至 0.003。

2. 起跳初速度保持不变(仍为0.42),但由于阈值降低,玩家在最高点附近会“多飘”一个tick。

这导致1.9+的跳跃高度从1.249b提升至约1.252b,跳跃周期不变(仍为12tick),但位移公式中的常数需微调。

结论:若你使用1.9+版本或基岩版,计算跳跃高度时建议直接使用1.252b,而非1.249b;若进行精确到tick级的模拟,请使用1.9+专用递推公式。


2.3 卡角:步行辅助的“漏洞”如何成为高度增益工具

该部分需要一定空间想象能力,bilibili当中已经有视频介绍了相关机制,可以自行搜索观看辅助理解(墙卡角原理目前没有相关视频,但本文中有介绍)

2.3.1 步行辅助机制:设计初衷

在正式讨论卡角之前,我们必须先理解一个对玩家极为友好的机制——步行辅助(Stepping)。

当玩家在地面上移动并遇到一个高度≤0.6b的障碍物(如地毯、台阶、活板门)时,游戏不会让你撞墙停下,而是自动将你“跨”上这个障碍物。这个过程每tick最多提升0.6b。

执行步骤(按Y→X→Z顺序):

1. 重置:将玩家碰撞箱重置为该tick开始时的位置。

2. 提升:将碰撞箱向上平移,最多0.6b。如果上方有方块阻挡,则升至紧贴该方块底部。

3. 水平移动:先X轴后Z轴,将碰撞箱向玩家移动方向平移。如果碰到方块,则移至方块侧边。

4. 下落:将碰撞箱向下平移,最多0.6b。如果下方有地面,则落在地面上方。

这是一个物理引擎应有的友好设计。但漏洞出在第1步——重置位置。

2.3.2 地面卡角(Blip-Up/Ground Blip)的完整解析

漏洞根源:如果玩家在该tick开始时不在空中,那么重置位置会将其碰撞箱放回空中,然后再执行提升→水平→下落。如果下落步找不到地面(下落0.6b后仍在空中),玩家就会被“悬挂”在半空,同时游戏判定他处于地面状态。

这就是地面卡角。

触发条件(必须同时满足):

1. 垂直速度为负(玩家正在下落或跳跃下降段)。

2. 有一面矮墙(如地毯、睡莲、活板门),该墙的顶面高度低于玩家在该tick开始时的Y坐标。

3. 玩家与墙的水平距离必须足够近(下一t理论位移会撞墙),以触发水平移动碰撞。

执行特征:

· 玩家Y坐标不会降回地面,而是停留在半空(高度 = 墙顶 + 0.6b 或更低,取决于下落步的终止位置)。

· 玩家被判定为在地面,因此可以在下一tick立即起跳。

· 高度增益 = 玩家本应下落的距离 - 实际下落距离。增益值在0~3.92b之间,取决于下落速度和墙高。

2.3.3 连续地面卡角:高度增益的定量分析

每一次成功的地面卡角会给玩家增加一个固定的垂直高度增益。这个增益值不是随机的,而是由游戏版本和墙高共同决定的离散常数。

1.8版本:每次卡角增益 +0.104b

1.9+版本和Bedrock版本:每次卡角增益 +0.121b

然而实践表明,并非每次卡角都能让你收获一定的高度增益,也就是说,你不可能越卡越高,以至于无限高

随着每次卡角增加0.104/0.121b,玩家的起跳高度逐渐抬高。最终,某一次跳跃的滞空时间会从12tick延长到13tick——因为跳得更高,下落需要更多时间。一旦跳跃周期增加1tick,之前积累的高度增益受到损失,玩家回到较低的循环高度。

因此,连续卡角是一个循环态,而不是无限叠加。我们把增益高度持续增加的一个连续卡角阶段称为一个卡角周期。不难得出,平地连续卡角的极限高度增益为0tier时的竖直位移:0.4448b。从高处跃下的理论极限高度增益为终端速度下单位tick竖直位移:3.92b。优秀的跑酷地图设计者会精确利用这个循环态的最高点来通过原本无法通过的障碍。

我们使用Excel对平地卡角增益高度不断迭代,得到下表(部分)。

有意思的是,迭代结果显示在前2093次卡角中,没有哪次卡角的高度增益高于了第11次卡角,所以我们一般最多只卡11次角来获得最大高度增益

2.3.4 墙卡角(Wall Blip):择优路径的数学本质

墙卡角的发现比地面卡角晚得多(如果我没记错,应该是cant发现的),因为它需要同时满足天花板、墙壁、速度方向等多个苛刻条件。

触发条件:

1.洞口天花板:必须至少离地1.8b(玩家身高),且在该tick开始时,玩家头顶与天花板的距离 ≤ 0.6b(步行辅助的要求)。

2. 墙壁:必须是X轴向的墙(墙面法向量沿X轴),且墙上有一个可以容纳玩家碰撞箱的“洞口”。

3. 速度与位置:玩家正在下落且恰好没有进洞(Vy<0),且正在向墙移动。

核心机制——“二选优”算法:

游戏会计算两条候选路径,选择水平位移更大的那一条。

设:

· vₓ, v_Z = 玩家该tick的X、Z轴速度

· δX, δZ = 玩家与墙角在X、Z方向的距离

候选路径1(玩家正常进洞):水平位移 = √(vₓ² + δZ²)

候选路径2(根据步行辅助重定向):水平位移 = √(δX² + v_Z²)

手搓的强卡脚路径选择俯视图

手搓的墙卡角路径选择俯视图

公式 2.9(墙卡角触发条件)

如果此条件成立,游戏判定“重定向路线更远”,于是忽略玩家原有的X轴速度,将玩家直接传送至重定向路径的计算结果位置(X坐标变为墙角另一侧紧贴的位置)。

天花板的作用:阻止玩家在重定向过程中因步行辅助“走上墙顶”。天花板将玩家的垂直活动空间限制在洞口高度以下,确保卡角生效。

2.3.5 版本演进:从被修复到新漏洞(Java)

1.8:地面卡角和墙卡角的黄金时代。所有上述机制均有效。

1.14+:地面卡角被修复。游戏修改了下落步的逻辑:不再最多下落0.6b,而是下落至玩家高度减去垂直速度。这使得卡角几乎无法触发。

但修复带来了新漏洞——Blip-Down(低卡角)。玩家可以降落到地面以下,进入方块内部。这需要极其苛刻的条件,且实际应用场景有限,但理论上可以创造负tier起跳点(站内自有相关视频)。

墙卡角在1.14+被完全修复,不再可用。

1.15+:一个有趣的变化——正常卡角现在可以免除摔落伤害。如果你在落地瞬间触发卡角(即使只是正常卡角,不是Blip-Down),游戏会判定你没有“摔落”,从而免疫伤害。

1.16:修复正常卡角免除摔落伤害的bug

1.18-1.20间的某个版本:修复了Blip-Down

1.21快照24w18a:修复了“正常卡角”,但意外地重新引入了地面卡角

1.21正式版:重新修复了地面卡角,但引入了一个叫“e-7 stepping”的触发条件十分严苛的bug(原理很复杂,本文中不展开)。

遗憾的是,我并没有找到有关基岩版卡角特性历史的资料,但至少目前(该文发布日期)网易版本(同步国际版1.21.50)是存在卡角的。


2.4 本章核心公式速查清单


本章结语

我们从最简单的自由落体开始,建立了一阶线性递推的标准解法;然后引入跳跃,发现它不过是自由落体换个初始条件;最后,我们解剖了垂直运动中最迷人的异常现象——卡角,看到了“为友好而生的步行辅助”如何被漏洞利用转化为精准的高度控制工具。你也许已经注意到一个贯穿始终的模式:游戏的运动规则是极简的,但边界条件是丰富的。三条公理、两个常数(0.98和0.08),却衍生出卡角、墙卡角、低卡角等复杂现象。这就是《我的世界》运动学的魅力——极简的引擎,无穷的可能。下一章,我们将转向水平方向。在那里,你将看到同样的递推思想如何推广到水平运动,那将是另一片广袤的天地。

([哈欠]可算完成了,我自己都觉得自己搞得太快了,也许假期太闲了就是这样的。感谢@M33三角座星系 ​对卡角版本历史的修正和补充)