⭐✔️
本帖最后由 SHEEP_REALMS 于 2021-10-16 10:03 编辑

Github
本项目开源,用于展示相关命令:
https://github.com/tremblestarman/datapacks/tree/master/MotionIt
版权相关
用到了Bio-Hazard的公式
原帖链接:https://www.bilibili.com/read/cv1342860
(有点回忆起了四年前我制作的渣Motion计算器,并非基于两点坐标和时间运算,反而关注的是速率和夹角,现在看来实用性太低了)


效果3张1~2M的gif

利用两点坐标计算Motion
  • 矿车
  • 掉落沙
  • 掉落沙

(对于其他实体因为最大速度以及其他限制, 理论与实际有所偏差)


使用方法

  • 命令操作
    1. #   set target position (0.500, 8.000, 6.500)
    2. #       the value is rounded to three decimal places.
    3. scoreboard players set @x tx 500
    4. scoreboard players set @x ty 8000
    5. scoreboard players set @x tz 6500
    6. #   set time (ticks)
    7. scoreboard players set @x t 40
    复制代码
    设定tx、ty、tz为终点坐标(保留三位小数),设定t为运动时间(刻数)。
    1. execute as @x run function motionit:calculate
    复制代码
    接下来执行运算函数。
    1. execute as @x run function motionit:go
    复制代码
    再执行赋值函数运行。
  • UI操作

    1. function motionit:ui/reset
    复制代码
    获取"EntitySelector",右键选择实体,然后聊天栏点击操作。


原理

其实主要原理就在下面三张图中:



py脚本如下:
原理上来讲很容易实现,所以本数据包主要内容体现在如何让计算保持一定精度,尤其是仅运用储存上限为2147483647的计分板运算




  • 变量储存规则
    介绍变量规则,以免一会儿大家看混淆
    主要分为两类,常量变量
    常量如物理常量'g'和'f',以及常数-1、0、1、10……储存在计分板"con"中;
    变量主要是过程量'a'、'b'、'c'等等就不列举了。
    三维变量中ox、oy、oz和tx、ty、tz还有m0、m1、m2因为与实体NBT存储有关,另开了计分板。
  • 第一步:获取物理常量 (motionit:getparam)
    原理是穷举,用到了实体标签:
    例如tags/entity_types/mincart.json
    穷举的命令则是:
    这里的'g'和'f'我们用一位整数替代两位小数。
  • 第二步:获取1-(1-f)^t (motionit:pow/x)
    原来想法是递归运算pow(),因为舍的位数太多,结果是运行不超过十次必得到0,因此舍弃了(仍保留在数据包中,函数为oppow.mcfunction和oppowc.mcfunction,毕竟方法是正确的)。
    后来果断穷举了,因为f的值是恒定的常数,所以分为0、1、2、5四种情况穷举,脚本如下:

  • 第三步:计算坐标差 (motionit:relativeswitch、motionit:relativeconfirm)
    motionit:relativeswitch:
    先计算整数位的差值,根据差值的大小动态保留差值的位数,将差值限定到5位数(y=0是个特例)
    motionit:relativeconfirm:
    上标签,表示保留多少位,以便于后续的赋值处理。
  • 水平方向 (motionit:opx、motionit:opz)
    以opx为例:
    可以说就是把图中公式用四则运算表示了一遍。
  • 竖直方向(motionit:opy)
    除了表示公式外,还要协调位数,所以竖直方向处理更特殊,这边我就不解释怎么协调得了,看看就行。
  • 总流程 (motionit:calculate)
    把上面一套流程按顺序走了一遍,计算所得的Motion用(m0,m1,m2)表示。
  • 赋值 (motionit:go)
    还原位数,然后赋值给Motion。
    这里涉及到失重,原因是为了修复一个莫名其妙的动量亏损。也就是说重力状态下,通过命令修改的Motion值会在第二刻突然减弱,而初始化生成实体时设定的Motion不受影响。
  • UI
    UI的具体细节就不讲了,射线等老技术自己翻翻源码也就明白了。

18168559302
666666666666666

jiningning
生存党看完表示一脸懵逼

2677513295
正好做地图需要

一只swift
py怎么和minecraft联系在一起呢?

破碎の琉璃
666666666666666666666666666

破碎の琉璃
真不错啊这个

qq207655127
非常有创造性啊,支持作者!

咕噜and呼噜
嗯....@x是什么...没见过

第一页 上一页 下一页 最后一页