09 附录
1 附录 A 常见实体运动属性
下面总结一些常见的实体的运动相关属性,其中运算顺序含义见 3.1 节,A 为重力之外的某种加速。为了方便实际应用,这里给出的是实体的速度乘数,也就是公式中用到的 "k",阻力系数并未直接给出。
表 A1 常见实体运动属性表
| 实体 | 重力/(m/gt2) | 速度乘数(k 值) | 高度 / m | 宽度 / m | 眼部高度 / m | 运算顺序 (4) |
|---|
| TNT | 0.04 | 0.98 | 0.98 | 0.98 | 0.15 | GMD |
| 下落的方块 | 0.04 | 0.98 | 0.98 | 0.98 | 0.833 | GMD |
| 空中的物品 | 0.04 | 0.98***(1)*** | 0.25 | 0.25 | 0.2125 | GMD |
| 空中的经验球 | 0.03 | 0.98***(2)*** | 0.5 | 0.5 | 0.425 | GMD |
| 空中的船 | 0.04 | 水平 0.9,Y 轴 1 | 0.5625 | 1.375 | 0.5625 | GDM |
| 空中的矿车 | 0.04 | 0.95 | 0.7 | 0.98 | 0.595 | GMD |
| 空中的箭矢 / 三叉戟 | 0.05***(3)*** | 0.99***(3)*** | 0.5 | 0.5 | 0.13 | MDG |
| 空中的雪球/鸡蛋/末影珍珠 | 0.03***(3)*** | 0.99***(3)*** (6) | 0.25 | 0.25 | 0.2125 | MDG**(5)** |
| 空中的药水瓶 | 0.05***(3)*** | 0.99***(3)*** (6) | 0.25 | 0.25 | 0.2125 | MDG**(5)** |
| 空中的附魔之瓶 | 0.07***(3)*** | 0.99***(3)*** (6) | 0.25 | 0.25 | 0.2125 | MDG**(5)** |
| 空中的恶魂和末影龙火球 | 0 | 0.95***(3)*** | 1 | 1 | 0.85 | MAD |
| 空中的烈焰人火球 / 普通凋零之首 | 0 | 0.95***(3)*** | 0.3125 | 0.3125 | 0.265625 | MAD |
| 空中的鱼竿浮标 | 0.03 | 0.92 | 0.25 | 0.25 | 0.2125 | GMD |
| 空中的蓝色凋零之首 | 0 | 0.73**(3)** | 0.3125 | 0.3125 | 0.265625 | MAD |
| 空中的羊驼唾沫 | 0.06***(3)*** | 0.99***(3)*** | 0.25 | 0.25 | 0.2125 | MDG |
| 无有效目标的潜影贝导弹 | 0.04 | 1 | 0.3125 | 0.3125 | 0.265625 | GM |
| 空中或地面上的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架) | 0.08 | 水平 0.91***(3),Y 轴 0.98(3)*** | 站立时 1.8,睡觉和濒死时 0.2,鞘翅飞行和游泳和激流飞行时 0.6,潜行时 1.5 | 站立、潜行、鞘翅飞行和游泳和激流飞行时 0.6,睡觉和濒死时 0.2 | 睡觉时为 0.2,游泳、鞘翅飞行和激流飞行时为 0.4,潜行时为 1.27,站立时为 1.62 | MGD |
| 水中的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架) | 0.005 | 水平取决于深海探索者等级,Y 轴 0.8***(3)*** 同上 | 同上 | 同上 | 同上 | MDG |
| 较深熔岩中的玩家(除体积和眼部高度外也适用于大部分生物和盔甲架) | 0.005 | 0.5 | 同上 | 同上 | 同上 | 同上 |
(1):如需高精度计算水平运动,建议 X、Z 轴上使用这里给出的数值的单精度浮点真实值,可在表 2.5 中找到
(2):如需高精度计算竖直运动,建议 Y 轴上使用这里给出的数值的单精度浮点真实值,可在表 2.5 中找到
(3):如需高精度计算竖直运动,建议使用这里给出的数值的单精度浮点真实值,部分可在表 2.5 中找到
(4):以实体只受重力和一般阻力时为准,其他情况下可以参考 6.1 节或第 7 节。
(5):1.21.2 之后为 GDM
(6):1.20.5 之后改为双精度浮点数存储
2 附录 B 完整公式
这是第 3 节中部分公式对于不同实体类型的各种形式,除 MDA 类实体对应各式和求出Δdn、dn、v0、Δdmax和dmax的各式以及 "万能方程组" 基本确定无误外,其它公式不排除仍存在推导错误或录入错误,但缺少检验方法,希望有人帮忙检查一下。
2.1 MDA(移动 -> 阻力 -> 加速)
Δdn=kn−1v0t0+1−kat02(1−kn−1)(B.1.1)
dn=1−kv0t0(1−kn)+(1−k)2at02[kn+n(1−k)−1](B.1.2)
v0=1−kndnt0−1(1−k)−at0n+1−kat0(B.1.3)
n=−logk[k1−at0kv0(1−k)](B.1.4)
Δdmax=1−kat02(B.1.5)
dmax=1−kv0t0(B.1.6)
tanαn=kn−1(1−k)vx02+vz02gt0(kn−1−1)−vx02+vz02vy0(B.1.7)
⎩⎨⎧y=vx0(1−k)vy(1−k)−gt0x−1−kgt02logk[1−vx0t0x(1−k)]y=vz0(1−k)vy(1−k)−gt0z−1−kgt02logk[1−vz0t0z(1−k)](B.1.8)
tanαxn2+zn2=(1−k)2gt02(1−kn)−1−kgt02n−vy0′t0(1−kn)−yn(B.1.9)
2.2 DMA(阻力 -> 移动 -> 加速)
Δdn=knv0t0+1−kat02(k−kn)(B.2.1)
dn=1−kv0t0(k−kn+1)+(1−k)2at02k[kn+n(1−k)−1](B.2.2)
v0=k−kn+1dnt0−1(1−k)−at0kn+1−kat0(B.2.3)
n=−logk[k1−at0kv0(1−k)](B.2.4)
Δdmax=1−kat02k(B.2.5)
dmax=1−kv0t0k(B.2.6)
2.3 DAM(阻力 -> 加速 -> 移动)
Δdn=knv0t0+1−kat02(1−kn)(B.3.1)
dn=1−kv0t0(k−kn+1)+(1−k)2at02[kn+1+n(1−k)−k](B.3.2)
v0=k−kn+1dnt0−1(1−k)−at0n+1−kat0(B.3.3)
n=−logk[1−at0v0(1−k)](B.3.4)
Δdmax=1−kat02(B.3.5)
dmax=1−kv0t0k(B.3.6)
2.4 MAD(移动 -> 加速 -> 阻力)
Δdn=kn−1v0t0+1−kat02(k−kn)(B.4.1)
dn=1−kv0t0(1−kn)+(1−k)2at02k[kn+n(1−k)−1](B.4.2)
v0=1−kndnt0−1(1−k)−at0kn+1−kat0k(B.4.3)
n=−logk[k1−at0k2v0(1−k)](B.4.4)
Δdmax=1−kat02k(B.4.5)
dmax=1−kv0t0(B.4.6)
2.5 AMD(加速 -> 移动 -> 阻力)
Δdn=kn−1v0t0+1−kat02(1−kn)(B.5.1)
dn=1−kv0t0(1−kn)+(1−k)2at02[kn+1+n(1−k)−k](B.5.2)
v0=1−kndnt0−1(1−k)−at0n+1−kat0k(B.5.3)
n=−logk[1−at0kv0(1−k)](B.5.4)
Δdmax=1−kat02(B.5.5)
dmax=1−kv0t0(B.5.6)
tanαn=kn−1(1−k)vx02+vz02gt0(kn−1)−vx02+vz02vy0(B.5.7)
tanαxn2+zn2=(1−k)2gt02(k−kn+1)−1−kgt02n−vy0′t0(1−kn)−yn(B.5.8)
2.6 ADM(加速 -> 阻力 -> 移动)
Δdn=knv0t0+1−kat02(k−kn+1)(B.6.1)
dn=1−kv0t0(k−kn+1)+(1−k)2at02k[kn+1+n(1−k)−k](B.6.2)
v0=k−kn+1dnt0−1(1−k)−at0kn+1−kat0k(B.6.3)
n=−logk[1−at0kv0(1−k)](B.6.4)
Δdmax=1−kat02k(B.6.5)
dmax=1−kv0t0k(B.6.6)
3 附录 C 研究环境及辅助性工具
大部分实验内容来自 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。
4 附录 D 主要符号及单位
这里仿照国际单位制选取时间和长度作为两个基本单位。定义时间是用于描述某一过程经过的运算周期的量,长度是用于描述两个点之间距离的量。常用单位及其换算关系如下,其中格与米是等价的,大家可以按照个人喜好使用,文中以米为准:
表 D1 主要符号表
| 量 | 单位名 | 符号 | 简要的定义 | 换算 |
|---|
| 长度 | 米 | m | 完整方块的棱长 | 1m |
| | | | =1b |
| | | | =16px |
| | | | =1 / 16 区块 |
| 格 | b | 完整方块的棱长 | |
| 像素 | px | 方块最小渲染单元的边长 | |
| 区块 | 无 | 一个区块俯视图的边长 | |
| 时间 | 游戏刻 | gt | 一个游戏刻代表的时间 | 1gt |
| | | | =1/20s |
| | | | =1 / 2 红石刻 |
| 无卡顿的秒 | s | 在 TPS 为 20 时的一秒 | |
| 红石刻 | 无 | 一档红石中继器的延迟 | |
| 速度 | 米每刻 | m/gt | | 1m/gt |
| | | | =20m/s |
| 米每秒 | m/s | | |
| 加速度 | 米每平方刻 | m/gt2 | | 1m/gt2 |
| | | | =400m/s2 |
| 米每平方秒 | m/s2 | | |
| 阻力系数 | 负一次方刻 | gt−1 | | |
当然,这些单位的使用没有必要那么严格,把仅有 m 和 gt 组成的单位都看成 1 也行。
5 附录 E 定义索引
5.1 A
AI 加速度 (6)
5.2 B
爆炸半径 (5.15)
爆炸半径利用率 (8.1)
爆炸接触率 (5.15)
爆炸利用率 (8.1)
爆炸伤害半径 (5.15)
爆炸威力 (5.15)
爆炸影响力 (5.15)
爆炸中心 (5.15)
5.3 C
侧向加速度系数 (6)
冲量 (2.1)
5.4 D
地面移动加速度 (6)
地面阻力 (2.1)
5.5 F
FallDistance(2.4)
flyingSpeed(6.2)
forwardSpeed(6.2)
horizontalCollision(2.4)
方块网格 (4.2)
方块坐标 (2.1)
飞行时间利用率 (8.1)
飞行移动加速度 (6)
俯仰角 (2.1)
5.6 G
根实体 (2.2)
固体实体 (4.1)
5.7 H
horizontalCollision(2.4)
滑度 (5.4)
火球类 (2.3)
5.8 J
击退 (5.13)
加速度 (2.1)
加速度利用率 (8.1)
检查方块网格碰撞 (5.1)
接触率利用率 (8.1)
5.9 K
可攀登方块 (6)
空气阻力 (2.1)
空气阻力系数 (2.1)
5.10 L
LivingEntity(2.3)
流体加速 (2.1)
流体流向向量 (5.7)
流体深度阀值 (6)
流体阻力 (2.1)
5.11 M
Motion (2.1)
movementMultiplier(5.1)
movementSpeed(2.1)
5.12 N
noClip(2.4)
5.13 P
PersistentProjectileEntity(2.3)
pistonMovementDelta(2.4)
pistonMovementTick(2.4)
碰撞箱 (2.1)
偏航角 (2.1)
5.14 Q
前向加速度系数 (6.2)
取样点 (5.15)
5.15 R
raycast(4.2)
5.16 S
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)
5.17 T
同位实体 (2.2)
弹射物 (2.3)
投掷物 (2.3)
5.18 U
upwardSpeed(6.2)
5.19 V
verticalCollision(2.4)
5.20 W
位移趋势 (4.1)
位移趋势预处理 (4.1)
位移确定 (2.1)
5.21 X
向上的加速度系数 (6.2)
5.22 Y
沿轴移动 (4.1)
坐标 (2.1)
移动 (2.1)
5.23 Z
着地 (2.4)