跳转到主要内容
BFladderbeanawa
字数: 3,545
预计阅读时间: 14 分钟
最后编辑: 2026-07-08

I. 附录

下面总结一些常见的实体的运动相关属性,其中运算顺序含义见 3.1 节,A 为重力之外的某种加速。为了方便实际应用,这里给出的是实体的速度乘数,也就是公式中用到的 "k",阻力系数并未直接给出。

表 A1 常见实体运动属性表

实体重力/(m/gt2m/gt^2)速度乘数(k 值)高度/m宽度/m眼部高度/m运算顺序1
TNT0.040.980.980.980.15GMD
下落的方块0.040.980.980.980.833GMD
空中的物品0.040.9820.250.250.2125GMD
空中的经验球0.030.9830.50.50.425GMD
空中的船0.04水平 0.9,Y 轴 10.56251.3750.5625GDM
空中的矿车0.040.950.70.980.595GMD
空中的箭矢/三叉戟0.0540.9940.50.50.13MDG
空中的雪球/鸡蛋/末影珍珠0.0340.99450.250.250.2125MDG6
空中的药水瓶0.0540.99450.250.250.2125MDG6
空中的附魔之瓶0.0740.99450.250.250.2125MDG6
空中的恶魂和末影龙火球00.954110.85MAD
空中的烈焰人火球/普通凋零之首00.9540.31250.31250.265625MAD
空中的鱼竿浮标0.030.920.250.250.2125GMD
空中的蓝色凋零之首00.7340.31250.31250.265625MAD
空中的羊驼唾沫0.0640.9940.250.250.2125MDG
无有效目标的潜影贝导弹0.0410.31250.31250.265625GM
空中或地面上的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架)0.08水平 0.914,Y 轴 0.984站立时 1.8,睡觉和濒死时 0.2,鞘翅飞行和游泳和激流飞行时 0.6,潜行时 1.5站立、潜行、鞘翅飞行和游泳和激流飞行时 0.6,睡觉和濒死时 0.2睡觉时为 0.2,游泳、鞘翅飞行和激流飞行时为 0.4,潜行时为 1.27,站立时为 1.62MGD
水中的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架)0.005水平取决于深海探索者等级,Y 轴 0.84 同上同上同上同上MDG
较深熔岩中的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架)0.0050.5同上同上同上同上

这是第 3 节中部分公式对于不同实体类型的各种形式,除 MDA 类实体对应各式和求出Δdn\Delta d_{n}、dnd_{n}、v0v_{0}、Δdmax⁡\Delta d_{\max}和dmax⁡d_{\max}的各式以及 "万能方程组" 基本确定无误外,其它公式不排除仍存在推导错误或录入错误,但缺少检验方法,希望有人帮忙检查一下。

Δdn=kn−1v0t0+at02(1−kn−1)1−k(B.1.1)\Delta d_{n} = k^{n - 1}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( 1 - k^{n - 1} \right)}{1 - k} \tag{B.1.1} dn=v0t0(1−kn)1−k+at02[kn+n(1−k)−1](1−k)2(B.1.2)d_{n} = \frac{v_{0}t_{0}\left( 1 - k^{n} \right)}{1 - k} + \frac{a{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{B.1.2} v0=dnt0−1(1−k)−at0n1−kn+at01−k(B.1.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}n}{1 - k^{n}} + \frac{at_{0}}{1 - k} \tag{B.1.3} n=−log⁡k[1k−v0(1−k)at0k](B.1.4)n = - \log_{k}\left\lbrack \frac{1}{k} - \frac{v_{0}(1 - k)}{at_{0}k} \right\rbrack \tag{B.1.4} Δdmax⁡=at021−k(B.1.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}}{1 - k} \tag{B.1.5} dmax⁡=v0t01−k(B.1.6)d_{\max} = \frac{v_{0}t_{0}}{1 - k} \tag{B.1.6} tan⁡αn=gt0(kn−1−1)kn−1(1−k)vx02+vz02−vy0vx02+vz02(B.1.7){\tan\alpha}_{n} = \frac{gt_{0}\left( k^{n - 1} - 1 \right)}{k^{n - 1}(1 - k)\sqrt{{v_{x0}}^{2} + {v_{z0}}^{2}}} - \frac{v_{y0}}{\sqrt{{v_{x0}}^{2} + {v_{z0}}^{2}}} \tag{B.1.7} {y=vy(1−k)−gt0vx0(1−k)x−gt021−klog⁡k[1−x(1−k)vx0t0]y=vy(1−k)−gt0vz0(1−k)z−gt021−klog⁡k[1−z(1−k)vz0t0](B.1.8)\begin{cases}y = \frac{v_{y}(1 - k) - gt_{0}}{v_{x0}(1 - k)}x - \frac{g{t_{0}}^{2}}{1 - k}\log_{k}\lbrack 1 - \frac{x(1 - k)}{v_{x0}t_{0}}\rbrack \\ y = \frac{v_{y}(1 - k) - gt_{0}}{v_{z0}(1 - k)}z - \frac{g{t_{0}}^{2}}{1 - k}\log_{k}\left\lbrack 1 - \frac{z(1 - k)}{v_{z0}t_{0}} \right\rbrack \end{cases} \tag{B.1.8} tan⁡αxn2+zn2=gt02(1−kn)(1−k)2−gt02n−vy0′t0(1−kn)1−k−yn(B.1.9)\tan\alpha\sqrt{{x_{n}}^{2} + {z_{n}}^{2}} = \frac{g{t_{0}}^{2}\left( 1 - k^{n} \right)}{(1 - k)^{2}} - \frac{g{t_{0}}^{2}n - v_{y0}^{'}t_{0}\left( 1 - k^{n} \right)}{1 - k} - y_{n} \tag{B.1.9} Δdn=knv0t0+at02(k−kn)1−k(B.2.1)\Delta d_{n} = k^{n}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( k - k^{n} \right)}{1 - k} \tag{B.2.1} dn=v0t0(k−kn+1)1−k+at02k[kn+n(1−k)−1](1−k)2(B.2.2)d_{n} = \frac{v_{0}t_{0}\left( k - k^{n + 1} \right)}{1 - k} + \frac{a{t_{0}}^{2}k\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{B.2.2} v0=dnt0−1(1−k)−at0knk−kn+1+at01−k(B.2.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}kn}{k - k^{n + 1}} + \frac{at_{0}}{1 - k} \tag{B.2.3} n=−log⁡k[1k−v0(1−k)at0k](B.2.4)n = - \log_{k}\left\lbrack \frac{1}{k} - \frac{v_{0}(1 - k)}{at_{0}k} \right\rbrack \tag{B.2.4} Δdmax⁡=at02k1−k(B.2.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}k}{1 - k} \tag{B.2.5} dmax⁡=v0t0k1−k(B.2.6)d_{\max} = \frac{v_{0}t_{0}k}{1 - k} \tag{B.2.6} Δdn=knv0t0+at02(1−kn)1−k(B.3.1)\Delta d_{n} = k^{n}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( 1 - k^{n} \right)}{1 - k} \tag{B.3.1} dn=v0t0(k−kn+1)1−k+at02[kn+1+n(1−k)−k](1−k)2(B.3.2)d_{n} = \frac{v_{0}t_{0}\left( k - k^{n + 1} \right)}{1 - k} + \frac{a{t_{0}}^{2}\left\lbrack k^{n + 1} + n(1 - k) - k \right\rbrack}{(1 - k)^{2}} \tag{B.3.2} v0=dnt0−1(1−k)−at0nk−kn+1+at01−k(B.3.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}n}{k - k^{n + 1}} + \frac{at_{0}}{1 - k} \tag{B.3.3} n=−log⁡k[1−v0(1−k)at0](B.3.4)n = - \log_{k}\left\lbrack 1 - \frac{v_{0}(1 - k)}{at_{0}} \right\rbrack \tag{B.3.4} Δdmax⁡=at021−k(B.3.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}}{1 - k} \tag{B.3.5} dmax⁡=v0t0k1−k(B.3.6)d_{\max} = \frac{v_{0}t_{0}k}{1 - k} \tag{B.3.6} Δdn=kn−1v0t0+at02(k−kn)1−k(B.4.1)\Delta d_{n} = k^{n - 1}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( k - k^{n} \right)}{1 - k} \tag{B.4.1} dn=v0t0(1−kn)1−k+at02k[kn+n(1−k)−1](1−k)2(B.4.2)d_{n} = \frac{v_{0}t_{0}\left( 1 - k^{n} \right)}{1 - k} + \frac{a{t_{0}}^{2}k\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{B.4.2} v0=dnt0−1(1−k)−at0kn1−kn+at0k1−k(B.4.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}kn}{1 - k^{n}} + \frac{at_{0}k}{1 - k} \tag{B.4.3} n=−log⁡k[1k−v0(1−k)at0k2](B.4.4)n = - \log_{k}\left\lbrack \frac{1}{k} - \frac{v_{0}(1 - k)}{at_{0}k^{2}} \right\rbrack \tag{B.4.4} Δdmax⁡=at02k1−k(B.4.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}k}{1 - k} \tag{B.4.5} dmax⁡=v0t01−k(B.4.6)d_{\max} = \frac{v_{0}t_{0}}{1 - k} \tag{B.4.6} Δdn=kn−1v0t0+at02(1−kn)1−k(B.5.1)\Delta d_{n} = k^{n - 1}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( 1 - k^{n} \right)}{1 - k} \tag{B.5.1} dn=v0t0(1−kn)1−k+at02[kn+1+n(1−k)−k](1−k)2(B.5.2)d_{n} = \frac{v_{0}t_{0}\left( 1 - k^{n} \right)}{1 - k} + \frac{a{t_{0}}^{2}\left\lbrack k^{n + 1} + n(1 - k) - k \right\rbrack}{(1 - k)^{2}} \tag{B.5.2} v0=dnt0−1(1−k)−at0n1−kn+at0k1−k(B.5.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}n}{1 - k^{n}} + \frac{at_{0}k}{1 - k} \tag{B.5.3} n=−log⁡k[1−v0(1−k)at0k](B.5.4)n = - \log_{k}\left\lbrack 1 - \frac{v_{0}(1 - k)}{at_{0}k} \right\rbrack \tag{B.5.4} Δdmax⁡=at021−k(B.5.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}}{1 - k} \tag{B.5.5} dmax⁡=v0t01−k(B.5.6)d_{\max} = \frac{v_{0}t_{0}}{1 - k} \tag{B.5.6} tan⁡αn=gt0(kn−1)kn−1(1−k)vx02+vz02−vy0vx02+vz02(B.5.7){\tan\alpha}_{n} = \frac{gt_{0}\left( k^{n} - 1 \right)}{k^{n - 1}(1 - k)\sqrt{{v_{x0}}^{2} + {v_{z0}}^{2}}} - \frac{v_{y0}}{\sqrt{{v_{x0}}^{2} + {v_{z0}}^{2}}} \tag{B.5.7} tan⁡αxn2+zn2=gt02(k−kn+1)(1−k)2−gt02n−vy0′t0(1−kn)1−k−yn(B.5.8)\tan\alpha\sqrt{{x_{n}}^{2} + {z_{n}}^{2}} = \frac{g{t_{0}}^{2}\left( k - k^{n + 1} \right)}{(1 - k)^{2}} - \frac{g{t_{0}}^{2}n - v_{y0}^{'}t_{0}\left( 1 - k^{n} \right)}{1 - k} - y_{n} \tag{B.5.8} Δdn=knv0t0+at02(k−kn+1)1−k(B.6.1)\Delta d_{n} = k^{n}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( k - k^{n + 1} \right)}{1 - k} \tag{B.6.1} dn=v0t0(k−kn+1)1−k+at02k[kn+1+n(1−k)−k](1−k)2(B.6.2)d_{n} = \frac{v_{0}t_{0}\left( k - k^{n + 1} \right)}{1 - k} + \frac{a{t_{0}}^{2}k\left\lbrack k^{n + 1} + n(1 - k) - k \right\rbrack}{(1 - k)^{2}} \tag{B.6.2} v0=dnt0−1(1−k)−at0knk−kn+1+at0k1−k(B.6.3)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}kn}{k - k^{n + 1}} + \frac{at_{0}k}{1 - k} \tag{B.6.3} n=−log⁡k[1−v0(1−k)at0k](B.6.4)n = - \log_{k}\left\lbrack 1 - \frac{v_{0}(1 - k)}{at_{0}k} \right\rbrack \tag{B.6.4} Δdmax⁡=at02k1−k(B.6.5)\Delta d_{\max} = \frac{a{t_{0}}^{2}k}{1 - k} \tag{B.6.5} dmax⁡=v0t0k1−k(B.6.6)d_{\max} = \frac{v_{0}t_{0}k}{1 - k} \tag{B.6.6}

大部分实验内容来自 Minecraft Java 版 1.16.4,极少部分来自 Java 版 1.16.5 的 MCP,在 1.16.4 的实验中用到了以下辅助 Mod:

(1) fabric-carpet-1.16.4-1.4.17+v201111

(2) mcwmem-1.16.4-20210714

(3) chunkmap-20210718

(4) malilib-fabric-1.16.4-0.10.0-dev.21+arne.1

(5) minihud-fabric-1.16.4-0.19.0-dev.20201103.184029

(6) tweakeroo-fabric-1.16.4-0.10.0-dev.20201110.132827

mcwmem 全称为 Minecraft World Manipulation Enchantment Mod(Minecraft 世界控制增强,似乎名称起的太大了,现已重命名为 MessMod),是我临时赶工期开发的一个用于进行世界数据访问和修改的 Mod,内容很乱,当时功能较不完善且仅支持 1.16.4 和 1.16.5,但是够研究使用。最近又对此进行了一些进一步开发,较新版本可以在以下地址下载:

MOD:

https://modrinth.com/mod/messmod

https://github.com/lovexyn0827/MessMod/releases/tag/1.16.4-20220408

README:

https://github.com/lovexyn0827/MessMod/blob/main/README.md。

https://github.com/lovexyn0827/MessMod/blob/master/README_zh_cn.md

实体运动研究中不能过于相信贴图(或者说是客户端上显示出的实体以及碰撞箱),因为贴图位置比在服务端上实体的真正位置通常是滞后的,研究过程中太相信贴图那么可以认为第一步就输了,而这个 Mod 个人认为最大的功能就是正确地显示服务端上实体的碰撞箱位置,防止被客户端欺骗。

chunkmap 是我主要在 7 月 9-18 日开发的一个用于可视化区块的加载、生成和区块加载票的 Mod,目前功能趋于完善。

最新版本下载地址:

https://github.com/lovexyn0827/Chunkmap/releases/tag/v20210825

https://modrinth.com/mod/chunkmap

MCBBS 上的介绍贴:

https://www.mcbbs.net/thread-1225181-1-1.html。

文中涉及所有源代码由 minecraft fabric 中 genSources 生成,mapping 使用 yarn-1.16.4+build.1-v2,如需要可以自行反编译。

用到的一些小程序(请在 classpath 中包含反混淆的 Minecraft 及其运行库):

https://github.com/lovexyn0827/Entity。

这里仿照国际单位制选取时间和长度作为两个基本单位。定义时间是用于描述某一过程经过的运算周期的量,长度是用于描述两个点之间距离的量。常用单位及其换算关系如下,其中格与米是等价的,大家可以按照个人喜好使用,文中以米为准:

表 D1 主要符号表

量单位名符号简要的定义换算
长度米m完整方块的棱长1m
=1b
=16px
=1/16 区块
格b完整方块的棱长
像素px方块最小渲染单元的边长
区块无一个区块俯视图的边长
时间游戏刻gt一个游戏刻代表的时间1gt
=1/20s
=1/2 红石刻
无卡顿的秒s在 TPS 为 20 时的一秒
红石刻无一档红石中继器的延迟
速度米每刻m/gt1m/gt
=20m/s
米每秒m/s
加速度米每平方刻m/gt2m/gt^21m/gt2m/gt^2
=400m/s2m/s^2
米每平方秒m/s2m/s^2
阻力系数负一次方刻gt−1gt^{-1}

当然,这些单位的使用没有必要那么严格,把仅有 m 和 gt 组成的单位都看成 1 也行。

AI 加速度 (6)

爆炸半径 (5.15)

爆炸半径利用率 (8.1)

爆炸接触率 (5.15)

爆炸利用率 (8.1)

爆炸伤害半径 (5.15)

爆炸威力 (5.15)

爆炸影响力 (5.15)

爆炸中心 (5.15)

侧向加速度系数 (6)

冲量 (2.1)

地面移动加速度 (6)

地面阻力 (2.1)

FallDistance(2.4)

flyingSpeed(6.2)

forwardSpeed(6.2)

horizontalCollision(2.4)

方块网格 (4.2)

方块坐标 (2.1)

飞行时间利用率 (8.1)

飞行移动加速度 (6)

俯仰角 (2.1)

根实体 (2.2)

固体实体 (4.1)

horizontalCollision(2.4)

滑度 (5.4)

火球类 (2.3)

击退 (5.13)

加速度 (2.1)

加速度利用率 (8.1)

检查方块网格碰撞 (5.1)

接触率利用率 (8.1)

可攀登方块 (6)

空气阻力 (2.1)

空气阻力系数 (2.1)

LivingEntity(2.3)

流体加速 (2.1)

流体流向向量 (5.7)

流体深度阀值 (6)

流体阻力 (2.1)

Motion (2.1)

movementMultiplier(5.1)

movementSpeed(2.1)

noClip(2.4)

PersistentProjectileEntity(2.3)

pistonMovementDelta(2.4)

pistonMovementTick(2.4)

碰撞箱 (2.1)

偏航角 (2.1)

前向加速度系数 (6.2)

取样点 (5.15)

raycast(4.2)

sidewaysSpeed(6.2)

stepHeight(2.4)

实际位移趋势 (4.1)

实体 ID (2.4)

实体基础运算 (2.4)

实体挤压 (5.10)

实体所处方块 (5)

实体下方方块 (5)

实体支撑方块 (5)

实体着陆方块 (5)

输入位移 (4.1)

拴绳固定点 (5.19)

速度 (2.1)

速度乘数 (2.1)

同位实体 (2.2)

弹射物 (2.3)

投掷物 (2.3)

upwardSpeed(6.2)

verticalCollision(2.4)

位移趋势 (4.1)

位移趋势预处理 (4.1)

位移确定 (2.1)

向上的加速度系数 (6.2)

沿轴移动 (4.1)

坐标 (2.1)

移动 (2.1)

着地 (2.4)

  1. 以实体只受重力和一般阻力时为准,其他情况下可以参考 6.1 节或第 7 节。 ↩

  2. 如需高精度计算水平运动,建议 X、Z 轴上使用这里给出的数值的单精度浮点真实值,可在表 2.5 中找到 ↩

  3. 如需高精度计算竖直运动,建议 Y 轴上使用这里给出的数值的单精度浮点真实值,可在表 2.5 中找到 ↩

  4. 如需高精度计算竖直运动,建议使用这里给出的数值的单精度浮点真实值,部分可在表 2.5 中找到 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16

  5. 1.20.5 之后改为双精度浮点数存储 ↩ ↩2 ↩3

  6. 1.21.2 之后为 GDM ↩ ↩2 ↩3