Minecraft(我的世界)中文论坛
标题: 【视线追踪】请求帮助误差分析
作者: 末地探险者 时间: 2020-4-3 21:02
标题: 【视线追踪】请求帮助误差分析
本帖最后由 末地探险者 于 2020-4-3 21:42 编辑
- summon armor_stand 0.0 0.0 0.0 {Tags:["track_work"],Rotation:[0.0f,0.0f],NoGravity:true,Invisible:true,Marker:true}
- execute as @p anchored eyes at @p run summon arrow ^ ^ ^ {Motion:[0.0,0.0,0.0],NoGravity:true,pickup:false,Silent:true,damage:-1.0,Tags:["track_sel"]}
- execute as @e[tag=track_work] at @s rotated as @p anchored feet run tp ^ ^ ^10
- execute as @e[tag=track_sel] store result entity @s Motion[0] double 1 run data get entity @e[tag=track_work,limit=1] Pos[0]
- execute as @e[tag=track_sel] store result entity @s Motion[1] double 1 run data get entity @e[tag=track_work,limit=1] Pos[1]
- execute as @e[tag=track_sel] store result entity @s Motion[2] double 1 run data get entity @e[tag=track_work,limit=1] Pos[2]
- tellraw @a {"entity":"@e[tag=track_sel]","nbt":"Motion[0]"}
- kill @e[tag=track_work]
复制代码
照理来说本function生成的箭即是十字准星指向的位置
但是总有误差,不知道怎么分析误差来源(经测试,那个盔甲架y小于0照样工作!?,反正就是朝向地面也可以)
(已经看过https://www.mcbbs.net/thread-919112-1-1.html和https://www.mcbbs.net/thread-917613-1-1.html)
只是想要更简单的解决方案
作者: (=°ω°)丿 时间: 2020-4-3 21:02
试试?- summon armor_stand 0.0 0.0 0.0 {Tags:["track_work"],Rotation:[0.0f,0.0f],NoGravity:true,Invisible:true,Marker:true}
- execute as @p at @s anchored eyes run summon arrow ^ ^ ^ {Motion:[0.0,0.0,0.0],NoGravity:true,pickup:false,Silent:true,damage:-1.0,Tags:["track_sel"]}
- execute as @e[tag=track_work] at @s rotated as @p anchored feet run tp ^ ^ ^10
- execute as @e[tag=track_sel] run data modify entity @s Motion set from entity @e[tag=track_work,limit=1] Pos
- tellraw @a {"entity":"@e[tag=track_sel]","nbt":"Motion[0]"}
- kill @e[tag=track_work]
复制代码
作者: (=°ω°)丿 时间: 2020-4-3 21:07
本帖最后由 (=°ω°)丿 于 2020-4-3 21:13 编辑
- execute as @e[tag=track_sel] store result entity @s Motion[0] double 0.01 run data get entity @e[tag=track_work,limit=1] Pos[0]
复制代码 我觉得可能是 0.01 的问题,execute store 的命令返回值是整数。
【CBL|SPG】[1.14.4] 命令返回值列表
https://www.mcbbs.net/thread-808124-1-1.html
还有一件事,@人要在后面加空格。
作者: 末地探险者 时间: 2020-4-3 21:11
本帖最后由 末地探险者 于 2020-4-3 21:17 编辑
改了改了
我0.01只是为了放慢速度截图看一下
原来就是1你可以看一下图
如果是整数的话emmm我看看
@(=°ω°)丿
emmm这个返回值指的是execute成功与否
store是照样工作的
(参见小豆的数学库)
作者: 末地探险者 时间: 2020-4-3 21:20
这是小豆的数学库的三角函数,里面用的就不是整数
作者: 末地探险者 时间: 2020-4-3 21:26
本帖最后由 末地探险者 于 2020-4-3 21:28 编辑
怎么说呢
非常妙!!准确度非常高
简直媲美K_bai的视线追踪
我参悟您的教程居然没有想到直接复制整个数组
话说难道用execute 比使用 data 会降精确度吗
作者: (=°ω°)丿 时间: 2020-4-5 08:54
- execute store result entity @s Motion[0] double 0.01 run data get entity @s Pos[0]
复制代码 举个例子,假设 Pos[0] 的值为 123.45d,命令的具体执行过程是这样的:
1. 运行命令 data get entity @s Pos[0],获得 Pos[0] 的值 123.45d,
2. 将结果向下取整,得到 123
3. 转换为 double 并乘以 0.01,得到 1.23d
4. 将 1.23d 存到 Motion[0]
execute store 的好处是可以转换数据类型(例如将手持物品的数量(byte)存为血量(double)),介入记分板的运算,但缺点是有时会损失精度(由于记分板只能存储 int(整数且有从 2^31-1 到 -2^31 的范围限制))。
data modify 是直接复制。
作者: 末地探险者 时间: 2020-4-5 08:59
但是换成double 1依然会出现精度缺失的问题
可以说完全比不上直接复制
作者: (=°ω°)丿 时间: 2020-4-5 09:05
本帖最后由 (=°ω°)丿 于 2020-4-5 09:07 编辑
- execute store result entity @s Motion[0] double 0.000001 run data get entity @s Pos[0] 1000000
复制代码
如果一定要用的话我建议先乘 1000000,向下取整后再乘以 0.000001 来保证精度。(一般来说数字越大,精度损失越小,小心溢出)
作者: 末地探险者 时间: 2020-4-5 09:06
我去还有这种说法
实在是谢谢您了