跳转到主要内容
GTMC
  • 总序
    • 00引言
    • 01更新的概念与不同类型的更新
    • 02连续的方块更新及其分析方法
    • 01刻与刻间时序
    • 02初窥刻内时序
    • 03计划刻与计划刻元件
    • 04树电与脚电
    • 05方块实体
    • 06方块事件
    • 07活塞:方块事件与方块实体
    • 01Masa Gadget
    • 02投影模组教程
    • 00绪论
    • 01实体运动基础
    • 02实体移动过程及碰撞机制
    • 03实体自由运动相关公式推导
    • 04外界因素对运动的影响
    • 05LivingEntity运动机制
    • 06几类具体实体运动分析
    • 07实体运动应用举例
    • 08参考文献
    • 附录
    • I.附录
    • 01铁轨
    • 02铜灯
  • 附录
  • A.栈的概念
  • B.术语表

文章目录

  • 总序
    • 00引言
    • 01更新的概念与不同类型的更新
    • 02连续的方块更新及其分析方法
    • 01刻与刻间时序
    • 02初窥刻内时序
    • 03计划刻与计划刻元件
    • 04树电与脚电
    • 05方块实体
    • 06方块事件
    • 07活塞:方块事件与方块实体
    • 01Masa Gadget
    • 02投影模组教程
    • 00绪论
    • 01实体运动基础
    • 02实体移动过程及碰撞机制
    • 03实体自由运动相关公式推导
    • 04外界因素对运动的影响
    • 05LivingEntity运动机制
    • 06几类具体实体运动分析
    • 07实体运动应用举例
    • 08参考文献
    • 附录
    • I.附录
    • 01铁轨
    • 02铜灯
  • 附录
  • A.栈的概念
  • B.术语表
Loading article content
Loading
Loading article
GTMC

Graduate Texts in Minecraft

求知于方寸之间。

前言

文章
25
作者
12
最近修订
2026年8月

社区

  • 关于
  • 贡献者
  • 团队
  • QQ 群

参与

  • 参与贡献
  • 编辑政策
  • 议题

源码

  • 代码仓库
  • CC BY-NC-SA 4.0
  • Apache-2.0

本站为非官方 Minecraft 产品,与 Mojang Studios 无任何关联。

贡献者保留各自作品的版权。文章内容以 CC BY-NC-SA 4.0 协议发布,署名信息保存在文章元数据与源代码历史记录中。

© 2024–2026 GTMC Collectiveec529be

GTMC

  • 文章
  • PDF
  • 术语表
  • 关于
  • 贡献者
  • 总序
    • 00引言
    • 01更新的概念与不同类型的更新
    • 02连续的方块更新及其分析方法
    • 01刻与刻间时序
    • 02初窥刻内时序
    • 03计划刻与计划刻元件
    • 04树电与脚电
    • 05方块实体
    • 06方块事件
    • 07活塞:方块事件与方块实体
    • 01Masa Gadget
    • 02投影模组教程
    • 00绪论
    • 01实体运动基础
    • 02实体移动过程及碰撞机制
    • 03实体自由运动相关公式推导
    • 04外界因素对运动的影响
    • 05LivingEntity运动机制
    • 06几类具体实体运动分析
    • 07实体运动应用举例
    • 08参考文献
    • 附录
    • I.附录
    • 01铁轨
    • 02铜灯
  • 附录
  • A.栈的概念
  • B.术语表

文章目录

  • 总序
    • 00引言
    • 01更新的概念与不同类型的更新
    • 02连续的方块更新及其分析方法
    • 01刻与刻间时序
    • 02初窥刻内时序
    • 03计划刻与计划刻元件
    • 04树电与脚电
    • 05方块实体
    • 06方块事件
    • 07活塞:方块事件与方块实体
    • 01Masa Gadget
    • 02投影模组教程
    • 00绪论
    • 01实体运动基础
    • 02实体移动过程及碰撞机制
    • 03实体自由运动相关公式推导
    • 04外界因素对运动的影响
    • 05LivingEntity运动机制
    • 06几类具体实体运动分析
    • 07实体运动应用举例
    • 08参考文献
    • 附录
    • I.附录
    • 01铁轨
    • 02铜灯
  • 附录
  • A.栈的概念
  • B.术语表
Loading article content
Loading
Loading article
实体运动
路径: EntityMove/03-自由运动公式.zh.md
BFladderbeanawa
字数: 5,854
预计阅读时间: 21 分钟
最后编辑: 2026-07-08
贡献者:
  • BBFladderbeanawa
创建时间:
2026-07-07
最后编辑:
2026-07-08
链接:
https://www.techmc.wiki/zh/articles/entity-motion-intro/entity-motion-formulas
复用
CC BY-NC-SA 4.0

03 实体自由运动相关公式推导

1 符号定义及公式推导

首先,再次强调一下那个很让人迷惑的事实,Motion 不是速度,至少不完全是。

同一维度中,对于任意有效实体,定义如下:

该实体的第n gt(下文未特殊说明时 n 为正整数)自该实体第n次更新开始时开始,第n+1 次更新即将开始而未开始时(如果期间实体被移除,则为该实体被移除前开始的最后一次运算结束时)结束。

在该实体的第 1 gt 即将开始而未开始时,实体在 x、y、z 轴上的坐标分别为x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​,在 x、y、z 轴的上 Motion 分别为vx0v_{x0}vx0​、vy0v_{y0}vy0​、vz0v_{z0}vz0​。一游戏刻长度

t0=1gt(3.1.1)t_{0} = 1gt \tag{3.1.1}t0​=1gt(3.1.1)

在该实体的第 n gt 结束时,实体在 x、y、z 轴上的坐标与x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​的差分别为xnx_{n}xn​、yny_{n}yn​、znz_{n}zn​,在 x、y、z 轴的上 Motion 分别为vxnv_{xn}vxn​、vynv_{yn}vyn​、vznv_{zn}vzn​。

在该实体的的第n gt 内,实体在 x、y、z 轴上的位移分别为

Δxn=xn−xn−1(3.1.2)\Delta x_{n} = x_{n} - x_{n - 1} \tag{3.1.2}Δxn​=xn​−xn−1​(3.1.2) Δyn=yn−yn−1(3.1.3)\Delta y_{n} = y_{n} - y_{n - 1} \tag{3.1.3}Δyn​=yn​−yn−1​(3.1.3) Δzn=zn−zn−1(3.1.4)\Delta z_{n} = z_{n} - z_{n - 1} \tag{3.1.4}Δzn​=zn​−zn−1​(3.1.4)

其值与t0t_{0}t0​的比值分别为该实体在其第 n gt 中在 x、y、z 轴上的平均速度。

该实体每 gt 会受到加速度及阻力作用,当各轴上加速度及阻力作用都视为每 gt 仅进行一次且加速度和阻力系数均不变时,实体在 x、y、z 轴上的 Motion 在加速度作用后的值与作用前的值的差值与t0t_{0}t0​的比值(加速度)分别为axa_{x}ax​、aya_{y}ay​、aza_{z}az​,实体在 x、y、z 轴上的的 Motion 在阻力作用后的值与作用前的值的比值(速度乘数)分别为kxk_{x}kx​、kyk_{y}ky​、kzk_{z}kz​。

以上定义中各量在无需或无法指定具体坐标轴时用于指定坐标轴的角标可省略,位移符号中不是角标但用于指定坐标轴的字符的以 d 替换。即x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​统一记作d0d_{0}d0​,vx0v_{x0}vx0​、vy0v_{y0}vy0​、vz0v_{z0}vz0​统一记作v0v_{0}v0​,xnx_{n}xn​、yny_{n}yn​、znz_{n}zn​统一记作dnd_{n}dn​,Δxn\Delta x_{n}Δxn​、Δyn\Delta y_{n}Δyn​、Δzn\Delta z_{n}Δzn​统一记作Δdn\Delta d_{n}Δdn​,axa_{x}ax​、aya_{y}ay​、aza_{z}az​统一记作aaa,kxk_{x}kx​、kyk_{y}ky​、kzk_{z}kz​统一记作kkk。

为实现速度乘数与wiki中阻力系数的转换,有

k=1−ft0(3.1.5)k = 1 - ft_{0} \tag{3.1.5}k=1−ft0​(3.1.5)

无论何时。

以 MDA 型实体为例:

对任意自然数n0n_{0}n0​,有

vn0+1=kvn0+at0(3.1.6)v_{n_{0} + 1} = kv_{n_{0}} + at_{0} \tag{3.1.6}vn0​+1​=kvn0​​+at0​(3.1.6)

令n0=0n_0=0n0​=0,则可以得出

v1=kv0−gt0(3.1.7)v_{1} = kv_{0} - gt_{0} \tag{3.1.7}v1​=kv0​−gt0​(3.1.7) v2=k2v0−gt0k−gt0(3.1.8)v_{2} = k^{2}v_{0} - gt_{0}k - gt_{0} \tag{3.1.8}v2​=k2v0​−gt0​k−gt0​(3.1.8) v3=k3v0−gt0k2−gt0k−gt0(3.1.9)v_{3} = k^{3}v_{0} - gt_{0}k^{2} - gt_{0}k - gt_{0} \tag{3.1.9}v3​=k3v0​−gt0​k2−gt0​k−gt0​(3.1.9) ⋮\vdots⋮ vn=knv0−gt0∑i=0n−1ki(3.1.10)v_{n} = k^{n}v_{0} - gt_{0}\sum_{i = 0}^{n - 1}k^{i} \tag{3.1.10}vn​=knv0​−gt0​i=0∑n−1​ki(3.1.10)

因为

(1−k)∑i=qrki=kq+kq+1+⋯+kr−1+kr−kq+1−kq+2−⋯−kr−kr+1=kq−kr+1(3.1.11)\begin{aligned} &(1 - k)\sum_{i = q}^{r}k^{i} \\ &= k^{q} + k^{q + 1} + \cdots + k^{r - 1} + k^{r} - k^{q + 1} - k^{q + 2} - \cdots - k^{r} - k^{r + 1} \\ &= k^{q} - k^{r + 1} \end{aligned} \tag{3.1.11}​(1−k)i=q∑r​ki=kq+kq+1+⋯+kr−1+kr−kq+1−kq+2−⋯−kr−kr+1=kq−kr+1​(3.1.11)

所以

∑i=qrki=kq−kr+11−k(3.1.12)\sum_{i = q}^{r}k^{i} = \frac{k^{q} - k^{r + 1}}{1 - k} \tag{3.1.12}i=q∑r​ki=1−kkq−kr+1​(3.1.12)

令式 (3.1.12) 中q=0q=0q=0,r=n−1r=n-1r=n−1,代入式 (3.1.10) 中,得

vn=knv0+at0(1−kn)1−k(3.1.13)v_{n} = k^{n}v_{0} + \frac{at_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.13}vn​=knv0​+1−kat0​(1−kn)​(3.1.13)

由运算过程可知

Δdn=vn−1t0(3.1.14)\Delta d_{n} = v_{n - 1}t_{0} \tag{3.1.14}Δdn​=vn−1​t0​(3.1.14)

将式 (3.1.13) 代入其中,有

Δdn=kn−1v0t0+at02(1−kn−1)1−k(3.1.15)\Delta d_{n} = k^{n - 1}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( 1 - k^{n - 1} \right)}{1 - k} \tag{3.1.15}Δdn​=kn−1v0​t0​+1−kat0​2(1−kn−1)​(3.1.15)

易知

dn=∑i=1nΔdi(3.1.16)d_{n} = \sum_{i = 1}^{n}{\Delta d_{i}} \tag{3.1.16}dn​=i=1∑n​Δdi​(3.1.16)

将式 (3.1.15) 带入其中,有

dn=v0t0∑i=1nki−1+at02n1−k+at021−k∑i=1nki−1(3.1.17)d_{n} = v_{0}t_{0}\sum_{i = 1}^{n}k^{i - 1} + \frac{a{t_{0}}^{2}n}{1 - k} + \frac{a{t_{0}}^{2}}{1 - k}\sum_{i = 1}^{n}k^{i - 1} \tag{3.1.17}dn​=v0​t0​i=1∑n​ki−1+1−kat0​2n​+1−kat0​2​i=1∑n​ki−1(3.1.17)

令式 (3.1.12) 中q=0q=0q=0,r=n−1r=n-1r=n−1,并将其代入式 (3.1.17) 中,有

dn=v0t0(1−kn)1−k+at02[kn+n(1−k)−1](1−k)2(3.1.18)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{3.1.18}dn​=1−kv0​t0​(1−kn)​+(1−k)2at0​2[kn+n(1−k)−1]​(3.1.18)

解得

v0=dnt0−1(1−k)−at0n1−kn+at01−k(3.1.19)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}n}{1 - k^{n}} + \frac{at_{0}}{1 - k} \tag{3.1.19}v0​=1−kndn​t0​−1(1−k)−at0​n​+1−kat0​​(3.1.19)

令式 (3.1.15) 中Δdn=0\Delta d_{n} = 0Δdn​=0,解得

n=1−log⁡k[1−v0(1−k)at0](3.1.20)n = 1 - \log_{k}\left\lbrack 1 - \frac{v_{0}(1 - k)}{at_{0}} \right\rbrack \tag{3.1.20}n=1−logk​[1−at0​v0​(1−k)​](3.1.20)

可以证明,将求得nnn下取整1(取不大于nnn​的最大整数),代入式 (3.1.18) 中,可求得运动折返点(若有)。若直接将上式结果代入 (3.1.18) 当中,也可以给出运动折返点的一个近似值,误差通常不会太大:

dmax=v0t01−k−at021−klog⁡k[1−v0(1−k)at0](3.1.20.1)d_{max}=\frac{v_0t_0}{1-k}-\frac{at_0^2}{1-k}\log_k\left[1-\frac{v_0(1-k)}{at_0}\right] \tag{3.1.20.1}dmax​=1−kv0​t0​​−1−kat02​​logk​[1−at0​v0​(1−k)​](3.1.20.1)

令n→+∞n \rightarrow + \inftyn→+∞,则有kn→0k^{n} \rightarrow 0kn→0(0<k<1)

则可得恒定加速度与阻力共同作用下Δdn\Delta d_{n}Δdn​的最终稳定在

Δdmax⁡=at021−k(3.1.21)\Delta d_{\max} = \frac{a{t_{0}}^{2}}{1 - k} \tag{3.1.21}Δdmax​=1−kat0​2​(3.1.21)

若此时a=0a=0a=0,位移dnd_{n}dn​最终趋向于

dmax⁡=v0t01−k(3.1.22)d_{\max} = \frac{v_{0}t_{0}}{1 - k} \tag{3.1.22}dmax​=1−kv0​t0​​(3.1.22)

此时dnd_{n}dn​的绝对值亦取得最大值。

若

ax=az=0,ay=−g(3.1.23)a_{x} = a_{z} = 0,a_{y} = - g \tag{3.1.23}ax​=az​=0,ay​=−g(3.1.23)

而且

k=kx=ky=kz(3.1.24)k = k_{x} = k_{y} = k_{z} \tag{3.1.24}k=kx​=ky​=kz​(3.1.24)

则有

Δxn=kn−1vx0t0(3.1.25)\Delta x_{n} = k^{n - 1}v_{x0}t_{0} \tag{3.1.25}Δxn​=kn−1vx0​t0​(3.1.25) Δyn=kn−1vy0t0−gt02(1−kn−1)1−k(3.1.26)\Delta y_{n} = k^{n - 1}v_{y0}t_{0} - \frac{g{t_{0}}^{2}\left( 1 - k^{n - 1} \right)}{1 - k} \tag{3.1.26}Δyn​=kn−1vy0​t0​−1−kgt0​2(1−kn−1)​(3.1.26) Δzn=kn−1vz0t0(3.1.27)\Delta z_{n} = k^{n - 1}v_{z0}t_{0} \tag{3.1.27}Δzn​=kn−1vz0​t0​(3.1.27) xn=vx0t0(1−kn)1−k(3.1.28)x_{n} = \frac{v_{x0}t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.28}xn​=1−kvx0​t0​(1−kn)​(3.1.28) yn=vy0t0(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.29)y_{n} = \frac{v_{y0}t_{0}\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.29}yn​=1−kvy0​t0​(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.29) zn=vz0t0(1−kn)1−k(3.1.30)z_{n} = \frac{v_{z0}t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.30}zn​=1−kvz0​t0​(1−kn)​(3.1.30)

易知实体第nnngt 中位移俯仰角正切值

tan⁡αn=−ΔynΔxn2+Δzn2(3.1.31){\tan\alpha}_{n} = - \frac{\Delta y_{n}}{\sqrt{\Delta{x_{n}}^{2} + \Delta{z_{n}}^{2}}} \tag{3.1.31}tanαn​=−Δxn​2+Δzn​2​Δyn​​(3.1.31)

将式 (3.1.25)、(3.1.26)、(3.1.27) 代入式 (3.1.31),得

tan⁡αn=gt0(kn−1−1)kn−1(1−k)vx02+vz02−vy0vx02+vz02(3.1.32){\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{3.1.32}tanαn​=kn−1(1−k)vx0​2+vz0​2​gt0​(kn−1−1)​−vx0​2+vz0​2​vy0​​(3.1.32)

由式 (3.1.28) 得

vx0t0(1−kn)1−k=xn(3.1.33)\frac{v_{x0}t_{0}\left( 1 - k^{n} \right)}{1 - k} = x_{n} \tag{3.1.33}1−kvx0​t0​(1−kn)​=xn​(3.1.33)

将式 (3.1.33) 与式 (3.1.30) 相乘,得

zvx0=xvz0(3.1.34)zv_{x0} = xv_{z0} \tag{3.1.34}zvx0​=xvz0​(3.1.34)

即运动轨迹始终在同一垂直xOzxOzxOz平面的一平面θ\thetaθ上;

由式 (3.1.28)、(3.1.30) 分别解得

n=log⁡k[1−x(1−k)vx0t0](3.1.35)n = \log_{k}\left\lbrack 1 - \frac{x(1 - k)}{v_{x0}t_{0}} \right\rbrack \tag{3.1.35}n=logk​[1−vx0​t0​x(1−k)​](3.1.35) n=log⁡k[1−z(1−k)vz0t0](3.1.36)n = \log_{k}\left\lbrack 1 - \frac{z(1 - k)}{v_{z0}t_{0}} \right\rbrack \tag{3.1.36}n=logk​[1−vz0​t0​z(1−k)​](3.1.36)

分别代入式 (3.1.29) 中得

y=vy0(1−k)+gt0vx0(1−k)x−gt021−klog⁡k[1−x(1−k)vx0t0](3.1.37)y = \frac{v_{y0}(1 - k) + gt_{0}}{v_{x0}(1 - k)}x - \frac{g{t_{0}}^{2}}{1 - k}\log_{k}\left\lbrack 1 - \frac{x(1 - k)}{v_{x0}t_{0}} \right\rbrack \tag{3.1.37}y=vx0​(1−k)vy0​(1−k)+gt0​​x−1−kgt0​2​logk​[1−vx0​t0​x(1−k)​](3.1.37) y=vy0(1−k)+gt0vz0(1−k)z−gt021−klog⁡k[1−z(1−k)vz0t0](3.1.38)y = \frac{v_{y0}(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 \tag{3.1.38}y=vz0​(1−k)vy0​(1−k)+gt0​​z−1−kgt0​2​logk​[1−vz0​t0​z(1−k)​](3.1.38)

可以证明,式 (3.1.37) 对应曲面与平面 θ 的交线 = 式 (3.1.38) 对应曲面与平面 θ 的交线 = 式 (3.1.37) 对应曲面与式 (3.1.38) 对应曲面的交线,且运动轨迹点全部在该曲线上

设初速度仰俯仰角为α\alphaα,偏航角为β\betaβ,大小为v0v_0v0​,则各轴分量

vx0=−v0cos⁡αsin⁡β(3.1.39)v_{x0} = - v_{0}\cos\alpha\sin\beta \tag{3.1.39}vx0​=−v0​cosαsinβ(3.1.39) vy0=−v0sin⁡α(3.1.40)v_{y0} = - v_{0}\sin\alpha \tag{3.1.40}vy0​=−v0​sinα(3.1.40) vz0=v0cos⁡αcos⁡β(3.1.41)v_{z0} = v_0\cos\alpha\cos\beta \tag{3.1.41}vz0​=v0​cosαcosβ(3.1.41)

分别代入式 (3.1.28)、(3.1.29)、(3.1.30) 中,有

xn=−v0cos⁡αsin⁡βt0(1−kn)1−k(3.1.42)x_{n} = - \frac{v_{0}\cos\alpha\sin\beta t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.42}xn​=−1−kv0​cosαsinβt0​(1−kn)​(3.1.42) yn=−v0sin⁡αt0(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.43)y_{n} = - \frac{v_{0}\sin\alpha t_{0}\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.43}yn​=−1−kv0​sinαt0​(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.43) zn=v0cos⁡αcos⁡βt0(1−kn)1−k(3.1.44)z_{n} = \frac{v_{0}\cos\alpha\cos\beta t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.44}zn​=1−kv0​cosαcosβt0​(1−kn)​(3.1.44)

下面认为

vy0=−a0t0sin⁡α+vy0′(3.1.45)v_{y0} = - a_{0}t_{0}\sin\alpha + v_{y0}^{'} \tag{3.1.45}vy0​=−a0​t0​sinα+vy0′​(3.1.45)

其中a0a_{0}a0​是合初始加速度(如爆炸推进加速度),vy0′v_{y0}^{'}vy0′​是加速前的 y 轴 Motion,由此可得

yn=−t0(−a0t0sin⁡α+vy0′)(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.46)y_{n} = - \frac{t_{0}\left( - a_{0}t_{0}\sin\alpha + v_{y0}^{'} \right)\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.46}yn​=−1−kt0​(−a0​t0​sinα+vy0′​)(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.46)

可以证明

a0t0=(1−k)xn2+zn2cos⁡αt0(1−kn)(3.1.47)a_{0}t_{0} = \frac{(1 - k)\sqrt{{x_{n}}^{2} + {z_{n}}^{2}}}{\cos\alpha t_{0}\left( 1 - k^{n} \right)} \tag{3.1.47}a0​t0​=cosαt0​(1−kn)(1−k)xn​2+zn​2​​(3.1.47)

(3.1.42)、(3.1.44) 两边平方并相加得

xn2+zn2=v0t0cos⁡α(1−kn)1−k(sin⁡2β+cos⁡2β)=v0t0cos⁡α(1−kn)1−k\sqrt{x_n^2+z_n^2}=\frac{v_0t_0\cos\alpha(1-k^n)}{1-k}(\sin^2\beta+\cos^2\beta)=\frac{v_0t_0\cos\alpha(1-k^n)}{1-k}xn2​+zn2​​=1−kv0​t0​cosα(1−kn)​(sin2β+cos2β)=1−kv0​t0​cosα(1−kn)​

因为加速前认为

vx0′=vy0′=0v_{x0}'=v_{y0}'=0vx0′​=vy0′​=0

加速过程后

vx0=vx0′+Δvx=a0cos⁡α(−sin⁡β)v_{x_0}=v_{x_0}'+\Delta{v_x}=a_0\cos\alpha(-\sin\beta)vx0​​=vx0​′​+Δvx​=a0​cosα(−sinβ) vz0=vz0′+Δvz=a0cos⁡α(cos⁡β)v_{z0}=v_{z_0}'+\Delta{v_z}=a_0\cos\alpha(\cos\beta)vz0​=vz0​′​+Δvz​=a0​cosα(cosβ)

由此可得

vx02+vz02=v02cos⁡2α=a02cos⁡αv_{x_0}^2+v_{z0}^2=v_0^2\cos^2\alpha=a_0^2\cos\alphavx0​2​+vz02​=v02​cos2α=a02​cosα

即

v0cos⁡α=a0cos⁡αv_0\cos\alpha=a_0\cos\alphav0​cosα=a0​cosα

代入开始处的方程有

xn2+zn2=a0t0cos⁡α(1−kn)1−k\sqrt{x_n^2+z_n^2}=\frac{a_0t_0\cos\alpha(1-k^n)}{1-k}xn2​+zn2​​=1−ka0​t0​cosα(1−kn)​

整理可得 (3.1.47)

代入式 (3.1.46) 并解得

tan⁡αxn2+zn2=gt02(1−kn)(1−k)2−gt02n−vy0′t0(1−kn)1−k−yn(3.1.48)\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{3.1.48}tanαxn​2+zn​2​=(1−k)2gt0​2(1−kn)​−1−kgt0​2n−vy0′​t0​(1−kn)​−yn​(3.1.48)

对所有有效实体,式 (3.1.12)、(3.1.16)、(3.1.31) 通用;若式 (3.1.23) 和 (3.1.24) 成立 (3.1.34) 、(3.1.39) 、(3.1.40) 、(3.1.41)、(3.1.45) 式也通用。

对于 DA 型实体,式 (3.1.13) 通用

对于 DF 型实体,有

vn=knv0+at0(k−kn+1)1−k(3.1.49)v_{n} = k^{n}v_{0} + \frac{at_{0}\left( k - k^{n + 1} \right)}{1 - k} \tag{3.1.49}vn​=knv0​+1−kat0​(k−kn+1)​(3.1.49)

对于 M(速度不变,仅移动),N(无法移动)型实体,有

vn=v0(3.1.50)v_{n} = v_{0} \tag{3.1.50}vn​=v0​(3.1.50)

所有其它运动形式对应的公式可由式 (3.1.13),(3.1.49) 或 (3.1.50) 与下表中各式结合推导出。

表 2.1 运动形式对应 tick 末位移与 tick 末 Motion 关系式

类别公式类别公式
MDAΔdn=vn−1t0\Delta d_{n} = v_{n - 1}t_{0}Δdn​=vn−1​t0​AMDΔdn=k−1vnt0\Delta d_{n} = k^{- 1}v_{n}t_{0}Δdn​=k−1vn​t0​
DMAΔdn=kvn−1t0\Delta d_{n} = kv_{n - 1}t_{0}Δdn​=kvn−1​t0​ADMΔdn=vnt0\Delta d_{n} = v_{n}t_{0}Δdn​=vn​t0​
DAMΔdn=vnt0\Delta d_{n} = v_{n}t_{0}Δdn​=vn​t0​MΔdn=v0t0\Delta d_{n} = v_{0}t_{0}Δdn​=v0​t0​
MADΔdn=vn−1t0\Delta d_{n} = v_{n - 1}t_{0}Δdn​=vn−1​t0​NΔdn=0\Delta d_{n} = 0Δdn​=0

个人认为,此处式 (3.1.13)、式 (3.1.16) 的推导大概就是一个数列求和题,或者说就是初中的证明规律的那种题,后面的推导可以说很无脑,硬解就好了,有时候代入消元还是挺管用的。

当然也可以通过构造等比数列{vn−at01−k}\{v_n - \frac{at_0}{1-k}\}{vn​−1−kat0​​}推导 (3.1.16) 式,过程更清晰且严谨。

最后需要说明,完全准确的实体运动公式可不是这样就能推出来的,因为存在不可避免的浮点误差,但是这套公式已经足够在几乎所有情况下使用了。

2 公式的直接及拓展应用

在上一节给出关于 MDA 实体的 31 个等式中,只有 9 套是最常用的:

(3.1.13) 在某一刻末 Motion 和加速度已知的情况下,求任意刻实体运算结束时的 Motion。这在一些 TNT 炮设计中选择 TNT 数量的过程中是比较有用的,因为这个 Motion 直接参与了射出的初速的决定。

(3.1.15) 在某一刻末 Motion 和加速度已知的情况下,求任意刻内的平均速度,比较重要。

(3.1.18) 在某一刻末 Motion 和加速度已知的情况下,求任意刻末的位移,重要性可想而知。

(3.1.19) 在某一刻末位移、加速度和运动时间已知的情况下求出初速度,重要性可想而知。

(3.1.20) 在某一刻末 Motion 和加速度已知的情况下,求实体的折返时间,进而求出折返点(如最高点,向流体上游抛出的物品的折返点等)。

(3.1.20.1) 给出实体运动的折返点的近似值,以及折返点位置与速度的大致关系。

(3.1.21) 在时间不受限的情况下求出实体的理论最大速度,可以用于稳定的或周期性的加速过程中(如重力,行走,划船等)实体最终速度的估计,非常重要。

(3.1.22) 在时间不受限的情况下求出实体的理论最大位移。

(3.1.32) 求出实体的合速度俯仰角,但实际应用不多,有时可用于碰撞判定相关计算

(3.1.34)、(3.1.37)、(3.1.38) 给出了实体在空中平滑化的运动路径的解析式,可用于快速模拟实体运动轨迹,但实际应用不多,推这个主要就是想知道实体运动轨迹的解析式究竟是什么。图 3.2.1 中可以看出,运动轨迹在开始时接近为倾斜直线,而后发生较大转折,最后无限趋近于水平初速决定的一个竖直线。

// IMG_LOAD
图3.2.1 5m/gt初速37度斜向正东发射的TNT运动轨迹(平滑化)

图 3.2.1 5m/gt 初速 37 度斜向正东发射的 TNT 运动轨迹(平滑化)

(3.1.48) 一个 "万能方程",可以快捷地求出某种瞬时加速装置(如 TNT 炮)的最远落地位移等数据。

直接应用别的估计都好说,这里就只谈一下n的确定。n说简单了就是从自己选定的一个时间点(多数为实体创建或开始自由运动时)以来经过的刻数,或者说就是实体开始的运算周期数。但是,因为实体的运算过程问题,在计算位移时有时n会有 1 的偏差。例如,TNT 实体的爆炸是在位置更新(移动)后才进行的,TNT 的初始引信时间为 80gt,在引信时间为 0 时尝试爆炸会成功,从图中很容易想出它从创建到爆炸计算了 80 周期的运动,所以要想求出 TNT 的爆炸点可以选取n为 80;但是,如果是想知道一个末影珍珠在某一时刻触发了哪个拌线钩则需要将经过的刻数减 1 作为n,因为它检查方块网格碰撞(触发绊线)是在位置更新前就进行了,此时它移动的次数会比它开始的运算周期数少 1。这一类问题较复杂,对每种实体详细的说明在这里就显得太多余了,不过第七章中的介绍应该会解决多数常见的此类问题。

另外,如果可以保证实体的运动状态没有改变且实体一直存在,3.1 节公式中 n 的值可以取任意整数,而不局限于正整数。非整数值的 n 一般是没有意义的。

// IMG_LOAD
图3.2.2 TNT和末影珍珠的运算流程简图

图 3.2.2 TNT 和末影珍珠的运算流程简图

前面说的 MDA、AMD 等由三个步骤组成的运动只是理想情况,一般只适用于每 gt 只考虑至多一次加速、至多一次阻力作用和至多一次移动的情况(尽管已经满足大部分需求了),很多时候,特别是在计算玩家运算的时候经常会有实体在同一 gt 多次受到加速度、阻力甚至可能有多次移动的情况。一个典型的例子就是逆水行舟,根据源码,可以得到其在水中时水平方向上运动运算流程如下:

(1) 受到水流推动

(2) 受到大小为0.1gt−10.1gt^{-1}0.1gt−1的流体阻力,即 k 值为 0.9

(3) 受到沿视线的水平投影方向 0.04 或 0.005m/gt2gt^{2}gt2的动力

(4) 移动

也就是说,在它的运算过程中出现了两次加速,不能直接套用公式。

若要解决这个问题,我们不妨暂时忽略移动这一步骤,先将其下一刻的水平某轴上 Motion 用一个式子表示出来,其中afa_{f}af​为流体加速度在该轴上的分量,aca_{c}ac​为动力加速度在该轴上的分量,k 为步骤三后与步骤三前该轴上 Motion 的比值,v0v_{0}v0​、v1v_{1}v1​分别为原 Motion 与下一刻该轴上的 Motion:

v1=k(v0+aft0)+act0=kv0+(afk+ac)t0(3.2.1)v_{1} = k\left( v_{0} + a_{f}t_{0} \right) + a_{c}t_{0} = kv_{0} + \left( a_{f}k + a_{c} \right)t_{0} \tag{3.2.1}v1​=k(v0​+af​t0​)+ac​t0​=kv0​+(af​k+ac​)t0​(3.2.1)

现在下一刻的 Motion 已经被表示成一个关于v0v_{0}v0​的一次代数式,可以发现这与前面公式推导时 DA(先阻力后加速)型实体的相似。所以,我们将式afk+aca_{f}k + a_{c}af​k+ac​作为 a,k 作为 k 带入 DA 型式的 Motion 公式,也就是式 (3.1.13) 中,有

vn=knv0+t0(afk+ac)(1−kn)1−k(3.2.2)v_{n} = k^{n}v_{0} + \frac{t_{0}\left( a_{f}k + a_{c} \right)\left( 1 - k^{n} \right)}{1 - k} \tag{3.2.2}vn​=knv0​+1−kt0​(af​k+ac​)(1−kn)​(3.2.2)

易知这里

Δdn=vnt0(3.2.3)\Delta d_{n} = v_{n}t_{0} \tag{3.2.3}Δdn​=vn​t0​(3.2.3)

这与 DAM 和 ADM 型实体相同。因为上面的推导过程中我们假定v1v_{1}v1​是由v0v_{0}v0​先通过阻力作用,再经过加速得到的(也就是先乘以 k,再加上at0at_0at0​),所以这里我们选择 DAM 型实体,此后余下的公式也可以类似地代入使用。

有时候,多个加速度或阻力都是连在一起的(中间有移动过程时也认为它们是连在一起的),这时我们甚至可以不用求v1v_{1}v1​的表达式,直接用加法合并加速度,用乘法合并阻力的kkk值就可以了。例如,某个实体每 gt 运算顺序是MA1A2A3D1D2D3MA_1A_2A_3D_1D_2D_3MA1​A2​A3​D1​D2​D3​,这时可以将A1A2A3A_1A_2A_3A1​A2​A3​过程中的加速度相加,将D1D2D3D_1D_2D_3D1​D2​D3​中速度乘数(k 值)相乘分别得到aaa和kkk。可以发现这个实体的运动过程在化简后实际上就是 MAD,将求得aaa和kkk带入对应公式中即可。

实体的移动过程可能在多个加速或阻力作用过程中间,可能不能直接带入任何与位移相关的现有公式,这时就需要对现有公式进行变形或直接推出一套新公式才能代入使用。再举一例,某实体的运动运算过程为A1D1MA2DA3A_1D_1MA_2DA_3A1​D1​MA2​DA3​,我们想要从某个初速度求得任意时刻的位移,也就是要推导出 (3.1.18) 式的对应版本。利用前面的方法我们可以很轻松的得到这种实体的加速度和阻力,以及

Δdn=vn−1t0k1+a1t02k1(3.2.4)\begin{matrix} \Delta d_{n} = v_{n - 1}t_{0}k_1 + a_{1}t_{0}^{2}k_1 \tag{3.2.4} \end{matrix}Δdn​=vn−1​t0​k1​+a1​t02​k1​​(3.2.4)

此时完全可以推导出对应公式。

有些时候阻力和加速度作用的周期并不一定是 1gt,如计算玩家向正前方跑跳时的平均水平速度时周期是玩家从跳起到再次落地的时间,此时可以对 n 的取值除以周期并向上取整代入导出的公式以求得周期末的数据,借此求得具体时刻的数据。不过此时计算位移的意义已经不大,通常还是实验更有效。但如果是希望求解某个受到相对于时间有周期性的加速度和阻力系数影响的实体的最终速度(平均的或是稳定后周期内的具体变化情况),可以假设一个初始 Motion 为v0v_{0}v0​,并求出一个周期后的 Motion 关于v0v_{0}v0​的表达式f(v0)f\left( v_{0} \right)f(v0​),令f(v0)=v0f\left( v_{0} \right) = v_{0}f(v0​)=v0​,解得v0v_{0}v0​即为运动稳定后的某个周期的初始 Motion,进而可以求得运动稳定后的任意周期内的实体速度变化情况。

还是开头那个例子,先假设一个周期从玩家即将跳起时开始,到玩家第二次即将跳起时结束,长度为n0n_{0}n0​。除n0n_{0}n0​和初始水平 Motion v0v_{0}v0​外,还有下列几个量影响周期末水平 Motion:

  1. 玩家在空中的加速度aaa_{a}aa​,玩家疾跑时为 0.026m/gt2m/{gt}^{2}m/gt2与前向加速的系数(一般为 0.98)的乘积
  2. 玩家在地面的加速度aga_{g}ag​,玩家疾跑时数值为玩家的 generic_movement_speed 属性值与前向加速度系数的乘积加 0.2 m/gt2\ m/{gt}^{2} m/gt2
  3. 玩家在空中的速度乘数kak_{a}ka​,固定为 0.91
  4. 玩家在地面的速度乘数kgk_{g}kg​,等于判定所得滑度与 0.91 的乘积

易知周期内玩家在空中的运动时长为(n0−1) gt{(n}_{0} - 1)\ gt(n0​−1) gt,地面上移动时长为 1gt,结合玩家的运动运算顺序可以导出周期末水平 Motion:

vnext=(v0+agt0)kgkan0−1+aat0(ka−k0n0)1−ka+agt0(3.2.5)v_{next} = (v_{0}+{a_{g}t_{0})k_{g}k}_{a}^{n_{0} - 1} + \frac{a_{a}t_{0}\left( k_{a} - k_{0}^{n_{0}} \right)}{1 - k_{a}} + a_{g}t_{0} \tag{3.2.5}vnext​=(v0​+ag​t0​)kg​kan0​−1​+1−ka​aa​t0​(ka​−k0n0​​)​+ag​t0​(3.2.5)

令vnext=v0v_{next} = v_{0}vnext​=v0​,解得

v0=aat0(ka−kan0)(1−ka)(1−kgkan0−1)+agt0kgkan0−11−kgk0n0−1(3.2.6)v_{0} = \frac{a_{a}t_{0}\left( k_{a} - k_{a}^{n_{0}} \right)}{\left( 1 - k_{a} \right)(1 - k_{g}k_{a}^{n_{0} - 1})} + \frac{a_{g}t_{0}k_{g}k_{a}^{n_{0} - 1}}{1 - k_{g}k_{0}^{n_{0} - 1}} \tag{3.2.6}v0​=(1−ka​)(1−kg​kan0​−1​)aa​t0​(ka​−kan0​​)​+1−kg​k0n0​−1​ag​t0​kg​kan0​−1​​(3.2.6)

接下来,可以得出玩家在周期内的水平 Motion 变化情况。

借助上述公式还可以得出关于运动机制和速度乘数、加速度等因素不变时实体运动的一系列一般定性结论:

  1. 一定意义上,初态偏离末态造成的运动状态与稳态的差异以指数衰减形式减小(变量趋近定值也可视为变量与定值的差值指数衰减式减小),例如,实体运动的速度与稳态速度的差值(v−at01−k)kn\left(v-\frac{at_0}{1-k}\right)k^n(v−1−kat0​​)kn以指数衰减的形式趋近于 0,而位移相对于一直以稳态速度运动的假象实体的差距逐渐趋近一定值。
  2. 一定意义上,某时刻对实体施加一个瞬时的作用,则该作用的影响亦随时间指数衰减式减弱。
  3. 从同一时刻开始计量,各个因素对速度的影响衰减的程度是相同的。

另外,也可以发现,knk^{n}kn似乎是一个有特殊意义的值。实际上,在一些实体运动的过程中,knk^{n}kn等于原来的一半的意义还是比较丰富的(不止这些):

(1) 在加速度和阻力恒定的从无初速开始的加速运动中,这时 Motion 约是最大 Motion 的一半,合加速度约是最大合加速度的一半,由实际位移与相同时间以最大速度运动的位移之差是这个差值的最大值的一半。

(2) 在没有加速度但有初速且阻力固定的运动中,这时阻力加速度约是最大阻力加速度的一半,移动的位移约是最大位移的一半,Motion 约是初始 Motion 的一半。

不敢说这个的实际用途有多大,但这确实有助于我们理解这些公式。

Footnotes

  1. 见参考文献第 4 条。 ↩

上一篇
实体移动过程及碰撞机制
下一篇
外界因素对运动的影响
实体运动
路径: EntityMove/03-自由运动公式.zh.md
BFladderbeanawa
字数: 5,854
预计阅读时间: 21 分钟
最后编辑: 2026-07-08
贡献者:
  • BBFladderbeanawa
创建时间:
2026-07-07
最后编辑:
2026-07-08
链接:
https://www.techmc.wiki/zh/articles/entity-motion-intro/entity-motion-formulas
复用
CC BY-NC-SA 4.0

03 实体自由运动相关公式推导

1 符号定义及公式推导

首先,再次强调一下那个很让人迷惑的事实,Motion 不是速度,至少不完全是。

同一维度中,对于任意有效实体,定义如下:

该实体的第n gt(下文未特殊说明时 n 为正整数)自该实体第n次更新开始时开始,第n+1 次更新即将开始而未开始时(如果期间实体被移除,则为该实体被移除前开始的最后一次运算结束时)结束。

在该实体的第 1 gt 即将开始而未开始时,实体在 x、y、z 轴上的坐标分别为x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​,在 x、y、z 轴的上 Motion 分别为vx0v_{x0}vx0​、vy0v_{y0}vy0​、vz0v_{z0}vz0​。一游戏刻长度

t0=1gt(3.1.1)t_{0} = 1gt \tag{3.1.1}t0​=1gt(3.1.1)

在该实体的第 n gt 结束时,实体在 x、y、z 轴上的坐标与x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​的差分别为xnx_{n}xn​、yny_{n}yn​、znz_{n}zn​,在 x、y、z 轴的上 Motion 分别为vxnv_{xn}vxn​、vynv_{yn}vyn​、vznv_{zn}vzn​。

在该实体的的第n gt 内,实体在 x、y、z 轴上的位移分别为

Δxn=xn−xn−1(3.1.2)\Delta x_{n} = x_{n} - x_{n - 1} \tag{3.1.2}Δxn​=xn​−xn−1​(3.1.2) Δyn=yn−yn−1(3.1.3)\Delta y_{n} = y_{n} - y_{n - 1} \tag{3.1.3}Δyn​=yn​−yn−1​(3.1.3) Δzn=zn−zn−1(3.1.4)\Delta z_{n} = z_{n} - z_{n - 1} \tag{3.1.4}Δzn​=zn​−zn−1​(3.1.4)

其值与t0t_{0}t0​的比值分别为该实体在其第 n gt 中在 x、y、z 轴上的平均速度。

该实体每 gt 会受到加速度及阻力作用,当各轴上加速度及阻力作用都视为每 gt 仅进行一次且加速度和阻力系数均不变时,实体在 x、y、z 轴上的 Motion 在加速度作用后的值与作用前的值的差值与t0t_{0}t0​的比值(加速度)分别为axa_{x}ax​、aya_{y}ay​、aza_{z}az​,实体在 x、y、z 轴上的的 Motion 在阻力作用后的值与作用前的值的比值(速度乘数)分别为kxk_{x}kx​、kyk_{y}ky​、kzk_{z}kz​。

以上定义中各量在无需或无法指定具体坐标轴时用于指定坐标轴的角标可省略,位移符号中不是角标但用于指定坐标轴的字符的以 d 替换。即x0x_{0}x0​、y0y_{0}y0​、z0z_{0}z0​统一记作d0d_{0}d0​,vx0v_{x0}vx0​、vy0v_{y0}vy0​、vz0v_{z0}vz0​统一记作v0v_{0}v0​,xnx_{n}xn​、yny_{n}yn​、znz_{n}zn​统一记作dnd_{n}dn​,Δxn\Delta x_{n}Δxn​、Δyn\Delta y_{n}Δyn​、Δzn\Delta z_{n}Δzn​统一记作Δdn\Delta d_{n}Δdn​,axa_{x}ax​、aya_{y}ay​、aza_{z}az​统一记作aaa,kxk_{x}kx​、kyk_{y}ky​、kzk_{z}kz​统一记作kkk。

为实现速度乘数与wiki中阻力系数的转换,有

k=1−ft0(3.1.5)k = 1 - ft_{0} \tag{3.1.5}k=1−ft0​(3.1.5)

无论何时。

以 MDA 型实体为例:

对任意自然数n0n_{0}n0​,有

vn0+1=kvn0+at0(3.1.6)v_{n_{0} + 1} = kv_{n_{0}} + at_{0} \tag{3.1.6}vn0​+1​=kvn0​​+at0​(3.1.6)

令n0=0n_0=0n0​=0,则可以得出

v1=kv0−gt0(3.1.7)v_{1} = kv_{0} - gt_{0} \tag{3.1.7}v1​=kv0​−gt0​(3.1.7) v2=k2v0−gt0k−gt0(3.1.8)v_{2} = k^{2}v_{0} - gt_{0}k - gt_{0} \tag{3.1.8}v2​=k2v0​−gt0​k−gt0​(3.1.8) v3=k3v0−gt0k2−gt0k−gt0(3.1.9)v_{3} = k^{3}v_{0} - gt_{0}k^{2} - gt_{0}k - gt_{0} \tag{3.1.9}v3​=k3v0​−gt0​k2−gt0​k−gt0​(3.1.9) ⋮\vdots⋮ vn=knv0−gt0∑i=0n−1ki(3.1.10)v_{n} = k^{n}v_{0} - gt_{0}\sum_{i = 0}^{n - 1}k^{i} \tag{3.1.10}vn​=knv0​−gt0​i=0∑n−1​ki(3.1.10)

因为

(1−k)∑i=qrki=kq+kq+1+⋯+kr−1+kr−kq+1−kq+2−⋯−kr−kr+1=kq−kr+1(3.1.11)\begin{aligned} &(1 - k)\sum_{i = q}^{r}k^{i} \\ &= k^{q} + k^{q + 1} + \cdots + k^{r - 1} + k^{r} - k^{q + 1} - k^{q + 2} - \cdots - k^{r} - k^{r + 1} \\ &= k^{q} - k^{r + 1} \end{aligned} \tag{3.1.11}​(1−k)i=q∑r​ki=kq+kq+1+⋯+kr−1+kr−kq+1−kq+2−⋯−kr−kr+1=kq−kr+1​(3.1.11)

所以

∑i=qrki=kq−kr+11−k(3.1.12)\sum_{i = q}^{r}k^{i} = \frac{k^{q} - k^{r + 1}}{1 - k} \tag{3.1.12}i=q∑r​ki=1−kkq−kr+1​(3.1.12)

令式 (3.1.12) 中q=0q=0q=0,r=n−1r=n-1r=n−1,代入式 (3.1.10) 中,得

vn=knv0+at0(1−kn)1−k(3.1.13)v_{n} = k^{n}v_{0} + \frac{at_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.13}vn​=knv0​+1−kat0​(1−kn)​(3.1.13)

由运算过程可知

Δdn=vn−1t0(3.1.14)\Delta d_{n} = v_{n - 1}t_{0} \tag{3.1.14}Δdn​=vn−1​t0​(3.1.14)

将式 (3.1.13) 代入其中,有

Δdn=kn−1v0t0+at02(1−kn−1)1−k(3.1.15)\Delta d_{n} = k^{n - 1}v_{0}t_{0} + \frac{a{t_{0}}^{2}\left( 1 - k^{n - 1} \right)}{1 - k} \tag{3.1.15}Δdn​=kn−1v0​t0​+1−kat0​2(1−kn−1)​(3.1.15)

易知

dn=∑i=1nΔdi(3.1.16)d_{n} = \sum_{i = 1}^{n}{\Delta d_{i}} \tag{3.1.16}dn​=i=1∑n​Δdi​(3.1.16)

将式 (3.1.15) 带入其中,有

dn=v0t0∑i=1nki−1+at02n1−k+at021−k∑i=1nki−1(3.1.17)d_{n} = v_{0}t_{0}\sum_{i = 1}^{n}k^{i - 1} + \frac{a{t_{0}}^{2}n}{1 - k} + \frac{a{t_{0}}^{2}}{1 - k}\sum_{i = 1}^{n}k^{i - 1} \tag{3.1.17}dn​=v0​t0​i=1∑n​ki−1+1−kat0​2n​+1−kat0​2​i=1∑n​ki−1(3.1.17)

令式 (3.1.12) 中q=0q=0q=0,r=n−1r=n-1r=n−1,并将其代入式 (3.1.17) 中,有

dn=v0t0(1−kn)1−k+at02[kn+n(1−k)−1](1−k)2(3.1.18)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{3.1.18}dn​=1−kv0​t0​(1−kn)​+(1−k)2at0​2[kn+n(1−k)−1]​(3.1.18)

解得

v0=dnt0−1(1−k)−at0n1−kn+at01−k(3.1.19)v_{0} = \frac{d_{n}{t_{0}}^{- 1}(1 - k) - at_{0}n}{1 - k^{n}} + \frac{at_{0}}{1 - k} \tag{3.1.19}v0​=1−kndn​t0​−1(1−k)−at0​n​+1−kat0​​(3.1.19)

令式 (3.1.15) 中Δdn=0\Delta d_{n} = 0Δdn​=0,解得

n=1−log⁡k[1−v0(1−k)at0](3.1.20)n = 1 - \log_{k}\left\lbrack 1 - \frac{v_{0}(1 - k)}{at_{0}} \right\rbrack \tag{3.1.20}n=1−logk​[1−at0​v0​(1−k)​](3.1.20)

可以证明,将求得nnn下取整1(取不大于nnn​的最大整数),代入式 (3.1.18) 中,可求得运动折返点(若有)。若直接将上式结果代入 (3.1.18) 当中,也可以给出运动折返点的一个近似值,误差通常不会太大:

dmax=v0t01−k−at021−klog⁡k[1−v0(1−k)at0](3.1.20.1)d_{max}=\frac{v_0t_0}{1-k}-\frac{at_0^2}{1-k}\log_k\left[1-\frac{v_0(1-k)}{at_0}\right] \tag{3.1.20.1}dmax​=1−kv0​t0​​−1−kat02​​logk​[1−at0​v0​(1−k)​](3.1.20.1)

令n→+∞n \rightarrow + \inftyn→+∞,则有kn→0k^{n} \rightarrow 0kn→0(0<k<1)

则可得恒定加速度与阻力共同作用下Δdn\Delta d_{n}Δdn​的最终稳定在

Δdmax⁡=at021−k(3.1.21)\Delta d_{\max} = \frac{a{t_{0}}^{2}}{1 - k} \tag{3.1.21}Δdmax​=1−kat0​2​(3.1.21)

若此时a=0a=0a=0,位移dnd_{n}dn​最终趋向于

dmax⁡=v0t01−k(3.1.22)d_{\max} = \frac{v_{0}t_{0}}{1 - k} \tag{3.1.22}dmax​=1−kv0​t0​​(3.1.22)

此时dnd_{n}dn​的绝对值亦取得最大值。

若

ax=az=0,ay=−g(3.1.23)a_{x} = a_{z} = 0,a_{y} = - g \tag{3.1.23}ax​=az​=0,ay​=−g(3.1.23)

而且

k=kx=ky=kz(3.1.24)k = k_{x} = k_{y} = k_{z} \tag{3.1.24}k=kx​=ky​=kz​(3.1.24)

则有

Δxn=kn−1vx0t0(3.1.25)\Delta x_{n} = k^{n - 1}v_{x0}t_{0} \tag{3.1.25}Δxn​=kn−1vx0​t0​(3.1.25) Δyn=kn−1vy0t0−gt02(1−kn−1)1−k(3.1.26)\Delta y_{n} = k^{n - 1}v_{y0}t_{0} - \frac{g{t_{0}}^{2}\left( 1 - k^{n - 1} \right)}{1 - k} \tag{3.1.26}Δyn​=kn−1vy0​t0​−1−kgt0​2(1−kn−1)​(3.1.26) Δzn=kn−1vz0t0(3.1.27)\Delta z_{n} = k^{n - 1}v_{z0}t_{0} \tag{3.1.27}Δzn​=kn−1vz0​t0​(3.1.27) xn=vx0t0(1−kn)1−k(3.1.28)x_{n} = \frac{v_{x0}t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.28}xn​=1−kvx0​t0​(1−kn)​(3.1.28) yn=vy0t0(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.29)y_{n} = \frac{v_{y0}t_{0}\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.29}yn​=1−kvy0​t0​(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.29) zn=vz0t0(1−kn)1−k(3.1.30)z_{n} = \frac{v_{z0}t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.30}zn​=1−kvz0​t0​(1−kn)​(3.1.30)

易知实体第nnngt 中位移俯仰角正切值

tan⁡αn=−ΔynΔxn2+Δzn2(3.1.31){\tan\alpha}_{n} = - \frac{\Delta y_{n}}{\sqrt{\Delta{x_{n}}^{2} + \Delta{z_{n}}^{2}}} \tag{3.1.31}tanαn​=−Δxn​2+Δzn​2​Δyn​​(3.1.31)

将式 (3.1.25)、(3.1.26)、(3.1.27) 代入式 (3.1.31),得

tan⁡αn=gt0(kn−1−1)kn−1(1−k)vx02+vz02−vy0vx02+vz02(3.1.32){\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{3.1.32}tanαn​=kn−1(1−k)vx0​2+vz0​2​gt0​(kn−1−1)​−vx0​2+vz0​2​vy0​​(3.1.32)

由式 (3.1.28) 得

vx0t0(1−kn)1−k=xn(3.1.33)\frac{v_{x0}t_{0}\left( 1 - k^{n} \right)}{1 - k} = x_{n} \tag{3.1.33}1−kvx0​t0​(1−kn)​=xn​(3.1.33)

将式 (3.1.33) 与式 (3.1.30) 相乘,得

zvx0=xvz0(3.1.34)zv_{x0} = xv_{z0} \tag{3.1.34}zvx0​=xvz0​(3.1.34)

即运动轨迹始终在同一垂直xOzxOzxOz平面的一平面θ\thetaθ上;

由式 (3.1.28)、(3.1.30) 分别解得

n=log⁡k[1−x(1−k)vx0t0](3.1.35)n = \log_{k}\left\lbrack 1 - \frac{x(1 - k)}{v_{x0}t_{0}} \right\rbrack \tag{3.1.35}n=logk​[1−vx0​t0​x(1−k)​](3.1.35) n=log⁡k[1−z(1−k)vz0t0](3.1.36)n = \log_{k}\left\lbrack 1 - \frac{z(1 - k)}{v_{z0}t_{0}} \right\rbrack \tag{3.1.36}n=logk​[1−vz0​t0​z(1−k)​](3.1.36)

分别代入式 (3.1.29) 中得

y=vy0(1−k)+gt0vx0(1−k)x−gt021−klog⁡k[1−x(1−k)vx0t0](3.1.37)y = \frac{v_{y0}(1 - k) + gt_{0}}{v_{x0}(1 - k)}x - \frac{g{t_{0}}^{2}}{1 - k}\log_{k}\left\lbrack 1 - \frac{x(1 - k)}{v_{x0}t_{0}} \right\rbrack \tag{3.1.37}y=vx0​(1−k)vy0​(1−k)+gt0​​x−1−kgt0​2​logk​[1−vx0​t0​x(1−k)​](3.1.37) y=vy0(1−k)+gt0vz0(1−k)z−gt021−klog⁡k[1−z(1−k)vz0t0](3.1.38)y = \frac{v_{y0}(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 \tag{3.1.38}y=vz0​(1−k)vy0​(1−k)+gt0​​z−1−kgt0​2​logk​[1−vz0​t0​z(1−k)​](3.1.38)

可以证明,式 (3.1.37) 对应曲面与平面 θ 的交线 = 式 (3.1.38) 对应曲面与平面 θ 的交线 = 式 (3.1.37) 对应曲面与式 (3.1.38) 对应曲面的交线,且运动轨迹点全部在该曲线上

设初速度仰俯仰角为α\alphaα,偏航角为β\betaβ,大小为v0v_0v0​,则各轴分量

vx0=−v0cos⁡αsin⁡β(3.1.39)v_{x0} = - v_{0}\cos\alpha\sin\beta \tag{3.1.39}vx0​=−v0​cosαsinβ(3.1.39) vy0=−v0sin⁡α(3.1.40)v_{y0} = - v_{0}\sin\alpha \tag{3.1.40}vy0​=−v0​sinα(3.1.40) vz0=v0cos⁡αcos⁡β(3.1.41)v_{z0} = v_0\cos\alpha\cos\beta \tag{3.1.41}vz0​=v0​cosαcosβ(3.1.41)

分别代入式 (3.1.28)、(3.1.29)、(3.1.30) 中,有

xn=−v0cos⁡αsin⁡βt0(1−kn)1−k(3.1.42)x_{n} = - \frac{v_{0}\cos\alpha\sin\beta t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.42}xn​=−1−kv0​cosαsinβt0​(1−kn)​(3.1.42) yn=−v0sin⁡αt0(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.43)y_{n} = - \frac{v_{0}\sin\alpha t_{0}\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.43}yn​=−1−kv0​sinαt0​(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.43) zn=v0cos⁡αcos⁡βt0(1−kn)1−k(3.1.44)z_{n} = \frac{v_{0}\cos\alpha\cos\beta t_{0}\left( 1 - k^{n} \right)}{1 - k} \tag{3.1.44}zn​=1−kv0​cosαcosβt0​(1−kn)​(3.1.44)

下面认为

vy0=−a0t0sin⁡α+vy0′(3.1.45)v_{y0} = - a_{0}t_{0}\sin\alpha + v_{y0}^{'} \tag{3.1.45}vy0​=−a0​t0​sinα+vy0′​(3.1.45)

其中a0a_{0}a0​是合初始加速度(如爆炸推进加速度),vy0′v_{y0}^{'}vy0′​是加速前的 y 轴 Motion,由此可得

yn=−t0(−a0t0sin⁡α+vy0′)(1−kn)1−k−gt02[kn+n(1−k)−1](1−k)2(3.1.46)y_{n} = - \frac{t_{0}\left( - a_{0}t_{0}\sin\alpha + v_{y0}^{'} \right)\left( 1 - k^{n} \right)}{1 - k} - \frac{g{t_{0}}^{2}\left\lbrack k^{n} + n(1 - k) - 1 \right\rbrack}{(1 - k)^{2}} \tag{3.1.46}yn​=−1−kt0​(−a0​t0​sinα+vy0′​)(1−kn)​−(1−k)2gt0​2[kn+n(1−k)−1]​(3.1.46)

可以证明

a0t0=(1−k)xn2+zn2cos⁡αt0(1−kn)(3.1.47)a_{0}t_{0} = \frac{(1 - k)\sqrt{{x_{n}}^{2} + {z_{n}}^{2}}}{\cos\alpha t_{0}\left( 1 - k^{n} \right)} \tag{3.1.47}a0​t0​=cosαt0​(1−kn)(1−k)xn​2+zn​2​​(3.1.47)

(3.1.42)、(3.1.44) 两边平方并相加得

xn2+zn2=v0t0cos⁡α(1−kn)1−k(sin⁡2β+cos⁡2β)=v0t0cos⁡α(1−kn)1−k\sqrt{x_n^2+z_n^2}=\frac{v_0t_0\cos\alpha(1-k^n)}{1-k}(\sin^2\beta+\cos^2\beta)=\frac{v_0t_0\cos\alpha(1-k^n)}{1-k}xn2​+zn2​​=1−kv0​t0​cosα(1−kn)​(sin2β+cos2β)=1−kv0​t0​cosα(1−kn)​

因为加速前认为

vx0′=vy0′=0v_{x0}'=v_{y0}'=0vx0′​=vy0′​=0

加速过程后

vx0=vx0′+Δvx=a0cos⁡α(−sin⁡β)v_{x_0}=v_{x_0}'+\Delta{v_x}=a_0\cos\alpha(-\sin\beta)vx0​​=vx0​′​+Δvx​=a0​cosα(−sinβ) vz0=vz0′+Δvz=a0cos⁡α(cos⁡β)v_{z0}=v_{z_0}'+\Delta{v_z}=a_0\cos\alpha(\cos\beta)vz0​=vz0​′​+Δvz​=a0​cosα(cosβ)

由此可得

vx02+vz02=v02cos⁡2α=a02cos⁡αv_{x_0}^2+v_{z0}^2=v_0^2\cos^2\alpha=a_0^2\cos\alphavx0​2​+vz02​=v02​cos2α=a02​cosα

即

v0cos⁡α=a0cos⁡αv_0\cos\alpha=a_0\cos\alphav0​cosα=a0​cosα

代入开始处的方程有

xn2+zn2=a0t0cos⁡α(1−kn)1−k\sqrt{x_n^2+z_n^2}=\frac{a_0t_0\cos\alpha(1-k^n)}{1-k}xn2​+zn2​​=1−ka0​t0​cosα(1−kn)​

整理可得 (3.1.47)

代入式 (3.1.46) 并解得

tan⁡αxn2+zn2=gt02(1−kn)(1−k)2−gt02n−vy0′t0(1−kn)1−k−yn(3.1.48)\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{3.1.48}tanαxn​2+zn​2​=(1−k)2gt0​2(1−kn)​−1−kgt0​2n−vy0′​t0​(1−kn)​−yn​(3.1.48)

对所有有效实体,式 (3.1.12)、(3.1.16)、(3.1.31) 通用;若式 (3.1.23) 和 (3.1.24) 成立 (3.1.34) 、(3.1.39) 、(3.1.40) 、(3.1.41)、(3.1.45) 式也通用。

对于 DA 型实体,式 (3.1.13) 通用

对于 DF 型实体,有

vn=knv0+at0(k−kn+1)1−k(3.1.49)v_{n} = k^{n}v_{0} + \frac{at_{0}\left( k - k^{n + 1} \right)}{1 - k} \tag{3.1.49}vn​=knv0​+1−kat0​(k−kn+1)​(3.1.49)

对于 M(速度不变,仅移动),N(无法移动)型实体,有

vn=v0(3.1.50)v_{n} = v_{0} \tag{3.1.50}vn​=v0​(3.1.50)

所有其它运动形式对应的公式可由式 (3.1.13),(3.1.49) 或 (3.1.50) 与下表中各式结合推导出。

表 2.1 运动形式对应 tick 末位移与 tick 末 Motion 关系式

类别公式类别公式
MDAΔdn=vn−1t0\Delta d_{n} = v_{n - 1}t_{0}Δdn​=vn−1​t0​AMDΔdn=k−1vnt0\Delta d_{n} = k^{- 1}v_{n}t_{0}Δdn​=k−1vn​t0​
DMAΔdn=kvn−1t0\Delta d_{n} = kv_{n - 1}t_{0}Δdn​=kvn−1​t0​ADMΔdn=vnt0\Delta d_{n} = v_{n}t_{0}Δdn​=vn​t0​
DAMΔdn=vnt0\Delta d_{n} = v_{n}t_{0}Δdn​=vn​t0​MΔdn=v0t0\Delta d_{n} = v_{0}t_{0}Δdn​=v0​t0​
MADΔdn=vn−1t0\Delta d_{n} = v_{n - 1}t_{0}Δdn​=vn−1​t0​NΔdn=0\Delta d_{n} = 0Δdn​=0

个人认为,此处式 (3.1.13)、式 (3.1.16) 的推导大概就是一个数列求和题,或者说就是初中的证明规律的那种题,后面的推导可以说很无脑,硬解就好了,有时候代入消元还是挺管用的。

当然也可以通过构造等比数列{vn−at01−k}\{v_n - \frac{at_0}{1-k}\}{vn​−1−kat0​​}推导 (3.1.16) 式,过程更清晰且严谨。

最后需要说明,完全准确的实体运动公式可不是这样就能推出来的,因为存在不可避免的浮点误差,但是这套公式已经足够在几乎所有情况下使用了。

2 公式的直接及拓展应用

在上一节给出关于 MDA 实体的 31 个等式中,只有 9 套是最常用的:

(3.1.13) 在某一刻末 Motion 和加速度已知的情况下,求任意刻实体运算结束时的 Motion。这在一些 TNT 炮设计中选择 TNT 数量的过程中是比较有用的,因为这个 Motion 直接参与了射出的初速的决定。

(3.1.15) 在某一刻末 Motion 和加速度已知的情况下,求任意刻内的平均速度,比较重要。

(3.1.18) 在某一刻末 Motion 和加速度已知的情况下,求任意刻末的位移,重要性可想而知。

(3.1.19) 在某一刻末位移、加速度和运动时间已知的情况下求出初速度,重要性可想而知。

(3.1.20) 在某一刻末 Motion 和加速度已知的情况下,求实体的折返时间,进而求出折返点(如最高点,向流体上游抛出的物品的折返点等)。

(3.1.20.1) 给出实体运动的折返点的近似值,以及折返点位置与速度的大致关系。

(3.1.21) 在时间不受限的情况下求出实体的理论最大速度,可以用于稳定的或周期性的加速过程中(如重力,行走,划船等)实体最终速度的估计,非常重要。

(3.1.22) 在时间不受限的情况下求出实体的理论最大位移。

(3.1.32) 求出实体的合速度俯仰角,但实际应用不多,有时可用于碰撞判定相关计算

(3.1.34)、(3.1.37)、(3.1.38) 给出了实体在空中平滑化的运动路径的解析式,可用于快速模拟实体运动轨迹,但实际应用不多,推这个主要就是想知道实体运动轨迹的解析式究竟是什么。图 3.2.1 中可以看出,运动轨迹在开始时接近为倾斜直线,而后发生较大转折,最后无限趋近于水平初速决定的一个竖直线。

// IMG_LOAD
图3.2.1 5m/gt初速37度斜向正东发射的TNT运动轨迹(平滑化)

图 3.2.1 5m/gt 初速 37 度斜向正东发射的 TNT 运动轨迹(平滑化)

(3.1.48) 一个 "万能方程",可以快捷地求出某种瞬时加速装置(如 TNT 炮)的最远落地位移等数据。

直接应用别的估计都好说,这里就只谈一下n的确定。n说简单了就是从自己选定的一个时间点(多数为实体创建或开始自由运动时)以来经过的刻数,或者说就是实体开始的运算周期数。但是,因为实体的运算过程问题,在计算位移时有时n会有 1 的偏差。例如,TNT 实体的爆炸是在位置更新(移动)后才进行的,TNT 的初始引信时间为 80gt,在引信时间为 0 时尝试爆炸会成功,从图中很容易想出它从创建到爆炸计算了 80 周期的运动,所以要想求出 TNT 的爆炸点可以选取n为 80;但是,如果是想知道一个末影珍珠在某一时刻触发了哪个拌线钩则需要将经过的刻数减 1 作为n,因为它检查方块网格碰撞(触发绊线)是在位置更新前就进行了,此时它移动的次数会比它开始的运算周期数少 1。这一类问题较复杂,对每种实体详细的说明在这里就显得太多余了,不过第七章中的介绍应该会解决多数常见的此类问题。

另外,如果可以保证实体的运动状态没有改变且实体一直存在,3.1 节公式中 n 的值可以取任意整数,而不局限于正整数。非整数值的 n 一般是没有意义的。

// IMG_LOAD
图3.2.2 TNT和末影珍珠的运算流程简图

图 3.2.2 TNT 和末影珍珠的运算流程简图

前面说的 MDA、AMD 等由三个步骤组成的运动只是理想情况,一般只适用于每 gt 只考虑至多一次加速、至多一次阻力作用和至多一次移动的情况(尽管已经满足大部分需求了),很多时候,特别是在计算玩家运算的时候经常会有实体在同一 gt 多次受到加速度、阻力甚至可能有多次移动的情况。一个典型的例子就是逆水行舟,根据源码,可以得到其在水中时水平方向上运动运算流程如下:

(1) 受到水流推动

(2) 受到大小为0.1gt−10.1gt^{-1}0.1gt−1的流体阻力,即 k 值为 0.9

(3) 受到沿视线的水平投影方向 0.04 或 0.005m/gt2gt^{2}gt2的动力

(4) 移动

也就是说,在它的运算过程中出现了两次加速,不能直接套用公式。

若要解决这个问题,我们不妨暂时忽略移动这一步骤,先将其下一刻的水平某轴上 Motion 用一个式子表示出来,其中afa_{f}af​为流体加速度在该轴上的分量,aca_{c}ac​为动力加速度在该轴上的分量,k 为步骤三后与步骤三前该轴上 Motion 的比值,v0v_{0}v0​、v1v_{1}v1​分别为原 Motion 与下一刻该轴上的 Motion:

v1=k(v0+aft0)+act0=kv0+(afk+ac)t0(3.2.1)v_{1} = k\left( v_{0} + a_{f}t_{0} \right) + a_{c}t_{0} = kv_{0} + \left( a_{f}k + a_{c} \right)t_{0} \tag{3.2.1}v1​=k(v0​+af​t0​)+ac​t0​=kv0​+(af​k+ac​)t0​(3.2.1)

现在下一刻的 Motion 已经被表示成一个关于v0v_{0}v0​的一次代数式,可以发现这与前面公式推导时 DA(先阻力后加速)型实体的相似。所以,我们将式afk+aca_{f}k + a_{c}af​k+ac​作为 a,k 作为 k 带入 DA 型式的 Motion 公式,也就是式 (3.1.13) 中,有

vn=knv0+t0(afk+ac)(1−kn)1−k(3.2.2)v_{n} = k^{n}v_{0} + \frac{t_{0}\left( a_{f}k + a_{c} \right)\left( 1 - k^{n} \right)}{1 - k} \tag{3.2.2}vn​=knv0​+1−kt0​(af​k+ac​)(1−kn)​(3.2.2)

易知这里

Δdn=vnt0(3.2.3)\Delta d_{n} = v_{n}t_{0} \tag{3.2.3}Δdn​=vn​t0​(3.2.3)

这与 DAM 和 ADM 型实体相同。因为上面的推导过程中我们假定v1v_{1}v1​是由v0v_{0}v0​先通过阻力作用,再经过加速得到的(也就是先乘以 k,再加上at0at_0at0​),所以这里我们选择 DAM 型实体,此后余下的公式也可以类似地代入使用。

有时候,多个加速度或阻力都是连在一起的(中间有移动过程时也认为它们是连在一起的),这时我们甚至可以不用求v1v_{1}v1​的表达式,直接用加法合并加速度,用乘法合并阻力的kkk值就可以了。例如,某个实体每 gt 运算顺序是MA1A2A3D1D2D3MA_1A_2A_3D_1D_2D_3MA1​A2​A3​D1​D2​D3​,这时可以将A1A2A3A_1A_2A_3A1​A2​A3​过程中的加速度相加,将D1D2D3D_1D_2D_3D1​D2​D3​中速度乘数(k 值)相乘分别得到aaa和kkk。可以发现这个实体的运动过程在化简后实际上就是 MAD,将求得aaa和kkk带入对应公式中即可。

实体的移动过程可能在多个加速或阻力作用过程中间,可能不能直接带入任何与位移相关的现有公式,这时就需要对现有公式进行变形或直接推出一套新公式才能代入使用。再举一例,某实体的运动运算过程为A1D1MA2DA3A_1D_1MA_2DA_3A1​D1​MA2​DA3​,我们想要从某个初速度求得任意时刻的位移,也就是要推导出 (3.1.18) 式的对应版本。利用前面的方法我们可以很轻松的得到这种实体的加速度和阻力,以及

Δdn=vn−1t0k1+a1t02k1(3.2.4)\begin{matrix} \Delta d_{n} = v_{n - 1}t_{0}k_1 + a_{1}t_{0}^{2}k_1 \tag{3.2.4} \end{matrix}Δdn​=vn−1​t0​k1​+a1​t02​k1​​(3.2.4)

此时完全可以推导出对应公式。

有些时候阻力和加速度作用的周期并不一定是 1gt,如计算玩家向正前方跑跳时的平均水平速度时周期是玩家从跳起到再次落地的时间,此时可以对 n 的取值除以周期并向上取整代入导出的公式以求得周期末的数据,借此求得具体时刻的数据。不过此时计算位移的意义已经不大,通常还是实验更有效。但如果是希望求解某个受到相对于时间有周期性的加速度和阻力系数影响的实体的最终速度(平均的或是稳定后周期内的具体变化情况),可以假设一个初始 Motion 为v0v_{0}v0​,并求出一个周期后的 Motion 关于v0v_{0}v0​的表达式f(v0)f\left( v_{0} \right)f(v0​),令f(v0)=v0f\left( v_{0} \right) = v_{0}f(v0​)=v0​,解得v0v_{0}v0​即为运动稳定后的某个周期的初始 Motion,进而可以求得运动稳定后的任意周期内的实体速度变化情况。

还是开头那个例子,先假设一个周期从玩家即将跳起时开始,到玩家第二次即将跳起时结束,长度为n0n_{0}n0​。除n0n_{0}n0​和初始水平 Motion v0v_{0}v0​外,还有下列几个量影响周期末水平 Motion:

  1. 玩家在空中的加速度aaa_{a}aa​,玩家疾跑时为 0.026m/gt2m/{gt}^{2}m/gt2与前向加速的系数(一般为 0.98)的乘积
  2. 玩家在地面的加速度aga_{g}ag​,玩家疾跑时数值为玩家的 generic_movement_speed 属性值与前向加速度系数的乘积加 0.2 m/gt2\ m/{gt}^{2} m/gt2
  3. 玩家在空中的速度乘数kak_{a}ka​,固定为 0.91
  4. 玩家在地面的速度乘数kgk_{g}kg​,等于判定所得滑度与 0.91 的乘积

易知周期内玩家在空中的运动时长为(n0−1) gt{(n}_{0} - 1)\ gt(n0​−1) gt,地面上移动时长为 1gt,结合玩家的运动运算顺序可以导出周期末水平 Motion:

vnext=(v0+agt0)kgkan0−1+aat0(ka−k0n0)1−ka+agt0(3.2.5)v_{next} = (v_{0}+{a_{g}t_{0})k_{g}k}_{a}^{n_{0} - 1} + \frac{a_{a}t_{0}\left( k_{a} - k_{0}^{n_{0}} \right)}{1 - k_{a}} + a_{g}t_{0} \tag{3.2.5}vnext​=(v0​+ag​t0​)kg​kan0​−1​+1−ka​aa​t0​(ka​−k0n0​​)​+ag​t0​(3.2.5)

令vnext=v0v_{next} = v_{0}vnext​=v0​,解得

v0=aat0(ka−kan0)(1−ka)(1−kgkan0−1)+agt0kgkan0−11−kgk0n0−1(3.2.6)v_{0} = \frac{a_{a}t_{0}\left( k_{a} - k_{a}^{n_{0}} \right)}{\left( 1 - k_{a} \right)(1 - k_{g}k_{a}^{n_{0} - 1})} + \frac{a_{g}t_{0}k_{g}k_{a}^{n_{0} - 1}}{1 - k_{g}k_{0}^{n_{0} - 1}} \tag{3.2.6}v0​=(1−ka​)(1−kg​kan0​−1​)aa​t0​(ka​−kan0​​)​+1−kg​k0n0​−1​ag​t0​kg​kan0​−1​​(3.2.6)

接下来,可以得出玩家在周期内的水平 Motion 变化情况。

借助上述公式还可以得出关于运动机制和速度乘数、加速度等因素不变时实体运动的一系列一般定性结论:

  1. 一定意义上,初态偏离末态造成的运动状态与稳态的差异以指数衰减形式减小(变量趋近定值也可视为变量与定值的差值指数衰减式减小),例如,实体运动的速度与稳态速度的差值(v−at01−k)kn\left(v-\frac{at_0}{1-k}\right)k^n(v−1−kat0​​)kn以指数衰减的形式趋近于 0,而位移相对于一直以稳态速度运动的假象实体的差距逐渐趋近一定值。
  2. 一定意义上,某时刻对实体施加一个瞬时的作用,则该作用的影响亦随时间指数衰减式减弱。
  3. 从同一时刻开始计量,各个因素对速度的影响衰减的程度是相同的。

另外,也可以发现,knk^{n}kn似乎是一个有特殊意义的值。实际上,在一些实体运动的过程中,knk^{n}kn等于原来的一半的意义还是比较丰富的(不止这些):

(1) 在加速度和阻力恒定的从无初速开始的加速运动中,这时 Motion 约是最大 Motion 的一半,合加速度约是最大合加速度的一半,由实际位移与相同时间以最大速度运动的位移之差是这个差值的最大值的一半。

(2) 在没有加速度但有初速且阻力固定的运动中,这时阻力加速度约是最大阻力加速度的一半,移动的位移约是最大位移的一半,Motion 约是初始 Motion 的一半。

不敢说这个的实际用途有多大,但这确实有助于我们理解这些公式。

Footnotes

  1. 见参考文献第 4 条。 ↩

上一篇
实体移动过程及碰撞机制
下一篇
外界因素对运动的影响