Minecraft(我的世界)中文论坛

标题: [CBL|K_bai]解决你的一切射线追踪烦恼!超精准的射线追踪碰撞检测器[1.14.4-1.16]

作者: kongbaiyo    时间: 2019-10-8 20:06
标题: [CBL|K_bai]解决你的一切射线追踪烦恼!超精准的射线追踪碰撞检测器[1.14.4-1.16]
本帖最后由 kongbaiyo 于 2020-6-6 09:07 编辑


Minecraft Ray Collision Detector

超精准射线碰撞检测器


这个数据包从根本上、低消耗地解决了原版非完整方块碰撞判定的问题。


特点

如何使用

给任意一个药水云的三个计分板(mrcd_x0、mrcd_y0和mrcd_z0)分别在三个方向上要前进的距离(单位是毫块,也就是坐标乘1000),再执行mrcd:generic/start这个函数即可。该药水云会传送至碰撞终点。若发生碰撞,则会产生mrcd_touch_edge和mrcd_touch_DIRECTION这些tag。其中后一个tag表示该药水云碰撞的面。(包括x_plus、x_minus、y_plus、y_minus、z_plus和z_minus)

如果希望药水云可以穿透一些玩家可穿透的方块,给该药水云加上mrcd_bullet这个tag即可。

如果希望药水可以和实体碰撞的话,给该药水云加上mrcd_entity这个tag即可。若碰撞到实体,则会产生mrcd_touch_entity这个tag,同时被碰撞的实体会被打上mrcd_tagget_entity这个tag。默认情况下不识别玩家,如果想要更改的话就在mrcd:target这个实体标签下添加player即可。可以与mrcd_bullet标签同时使用。

具体实现可以查看mrcd:raycast,mrcd:bullet和mrcd:entity这三个函数,分别表示了视线追踪的应用、发射子弹和识别实体的应用。


限制

由于游戏内花花和竹子的碰撞箱是根据方块坐标计算变化的,因此暂时没有将其实现,视为完整方块。

没有任何限制啦!在最新版v1.3中MRCD已能够计算竹子和花花的坐标偏移。没有任何方块能逃脱MRCD的眼睛!


图片欣赏




更新日志


版本对应


特别鸣谢




原理

将药水云的三个计分板视为位移向量,将MC中的方块每个面视为平面,计算线面交点,若交点坐标在某一范围内,则发生碰撞。具体实现如下:

药水云的位移向量是:(#total_x, #total_y, #total_z)

首先获取当前位置的坐标,并把它转换成方块坐标,保存到(#block_x, #block_y, #block_z)里。(也就是以所在方块xyz值最小那个点为原点的坐标)
  1. scoreboard players set #const_1000 mrcd_system 1000
  2. execute store result score #block_x mrcd_system run data get entity @s Pos[0] 1000
  3. execute store result score #block_y mrcd_system run data get entity @s Pos[1] 1000
  4. execute store result score #block_z mrcd_system run data get entity @s Pos[2] 1000
  5. scoreboard players operation #block_x mrcd_system %= #const_1000 mrcd_system
  6. scoreboard players operation #block_y mrcd_system %= #const_1000 mrcd_system
  7. scoreboard players operation #block_z mrcd_system %= #const_1000 mrcd_system
复制代码

位移向量转化为空间直线方程,用点向式:(x-#block_x)/#total_x=(y-#block_y)/#total_y=(z-#block_z)/#total_z。
这里以x=0平面为例,平面方程为x=0,带入可解得:
y=(-#block_x)#total_y/#total_x+#block_y
z=(-#block_x)#total_z/#total_x+#block_z
用命令表示就是这样:
  1. # y
  2. scoreboard players set #target_y mrcd_system 0
  3. scoreboard players operation #target_y mrcd_system -= #block_x mrcd_system
  4. scoreboard players operation #target_y mrcd_system *= @s mrcd_y0
  5. scoreboard players operation #target_y mrcd_system /= @s mrcd_x0
  6. scoreboard players operation #target_y mrcd_system += #block_y mrcd_system
  7. # z
  8. scoreboard players set #target_z mrcd_system 0
  9. scoreboard players operation #target_z mrcd_system -= #block_x mrcd_system
  10. scoreboard players operation #target_z mrcd_system *= @s mrcd_z0
  11. scoreboard players operation #target_z mrcd_system /= @s mrcd_x0
  12. scoreboard players operation #target_z mrcd_system += #block_z mrcd_system
复制代码

之后进行判定,若yz坐标值均在0-1000范围内,则说明发生碰撞。
  1. execute if score #target_y mrcd_system matches 0..1000 if score #target_z mrcd_system matches 0..1000 run tag @s add mrcd_touch_edge
复制代码

具体数据包内对以上过程进行了简化和整合,此处特别感谢SPGoding提出的简化想法!让我不至于建模到头凸。


翻阅Minecraft源码,得到坐标偏移计算代码如下(经过简化):
  1. public Vec3d getOffsetPos(BlockState state, BlockView view, BlockPos blockPos) {
  2.     long long6 = MathHelper.hashCode(blockPos.getX(), 0, blockPos.getZ());
  3.     return new Vec3d(((long6 & 0xFL) / 15.0f - 0.5) * 0.5, 0.0, ((long6 >> 8 & 0xFL) / 15.0f - 0.5) * 0.5);
  4. }

  5. public static long hashCode(int x, int y, int z) {
  6.     long long4 = (long)(x * 3129871) ^ z * 116129781L ^ (long)y;
  7.     long4 = long4 * long4 * 42317861L + long4 * 11L;
  8.     return long4 >> 16;
  9. }
复制代码

其中hashcode计算涉及到long类型的乘、加和异或运算。但注意到,getOffsetPos函数调用hashcode时,仅使用到了hashcode的低16位。而在hashcode函数最后,又将hash运算结果右移了16位。因此,实际只需运算结果的低32位。又因为乘、加和异或运算数据高位对低位没有影响,因此不用另写大数计算的方法,直接调用计分板运算即可。
这里最关键问题是两个int类型的异或,这是消耗命令数最多的地方,我消耗了300+条命令,不知道有没有简便方法[groupid=546]Command Block Logic[/groupid]
作者: 丢人素学姐    时间: 2019-10-8 20:12
这个原版模组缩写是啥来着?
WR...什么来着
作者: 捌柒    时间: 2019-10-8 20:18
论取名的艺术
作者: BlackCB.    时间: 2019-10-17 23:28
**那么多?
嘛,有这种东东还是很好的至少显示记分板列表时会和谐不少
作者: 底层咸鱼    时间: 2019-10-19 18:56
那么问题来了,非完整实体碰撞判定的问题呢
作者: Ruainbow_    时间: 2019-11-14 01:31
marker的移动速度好像有点慢。
可控吗?
作者: kongbaiyo    时间: 2019-11-14 09:53
Ruainbow_ 发表于 2019-11-14 01:31
marker的移动速度好像有点慢。
可控吗?

完全可控的!修改marker的速度计分板就可以了
你可以看例子函数bullet.mcfunction
作者: EL月663    时间: 2020-3-23 14:38
好强啊,这我得记好久
作者: (=°ω°)丿    时间: 2020-3-23 14:52
上一个挂直播的傅里叶本轮法已经沦为水帖重灾区了,不知道……
作者: 好吧就这样    时间: 2020-3-23 15:34
厉害了完全想不到
作者: hua1054137042    时间: 2020-3-23 23:34
可以啊这玩意
作者: 🥶❄️☠️    时间: 2020-3-24 15:11
真香,这是等离子射线吗?
不过现在置顶的帖子怎么又换了
作者: 🥶❄️☠️    时间: 2020-3-24 15:13
kongbaiyo 发表于 2019-11-14 04:53
完全可控的!修改marker的速度计分板就可以了
你可以看例子函数bullet.mcfunction ...

bullet意思是子弹啊好像,而且最慢的蜂鸟手枪子弹也有一百多米每秒,这个。。。是不是慢了一些啊?不对,是慢了几倍速度啊?
作者: CR_019    时间: 2020-3-24 15:20
本帖最后由 CR_019 于 2020-3-24 15:26 编辑
建模方便,可增加新的自定义碰撞箱

敢问一下这个建模是怎么实现的吗?原理里面没看出来是怎么建模的(其实就是我菜)

作者: kongbaiyo    时间: 2020-3-24 15:26
CR_019 发表于 2020-3-24 15:20
敢问一下这个建模是怎么实现的吗?原理里面没看出来是怎么建模的

游戏里碰撞箱都是长方体,定义长方体两个角的坐标就可以了,然后长方体的对应的六个面都根据原理里那么判断
如果碰撞箱不是长方体,那就拿多个长方体去拼
作者: zybyyb    时间: 2020-3-27 00:32
这又够玩好久了吧
作者: xia_long    时间: 2020-3-27 15:47
所以这可以用在什么地方....简称艺术好看就完事了
作者: Kris_X    时间: 2020-3-28 00:14
看的我一脸懵,这玩意儿能用来干啥?能举个例子吗?(新手)
作者: 🥶❄️☠️    时间: 2020-3-28 18:20
看来楼上那些来水的意味着不久以后这或许真的是水灾的兆头了
不过这个要是可以作为子弹攻击造成伤害的话就有意思了
作者: 腿短啊    时间: 2020-3-28 18:39
没抢到沙发emmmm
作者: ⭐✔️    时间: 2020-3-28 23:31
我就纳闷了,去年的帖子楼上还在抢沙发
作者: cmdpchappy    时间: 2020-3-29 10:48
什么。我的天,我的实际,
作者: cmdpchappy    时间: 2020-3-29 10:48
为什吗难免
作者: cmdpchappy    时间: 2020-3-29 10:48
好像没人额额
作者: cmdpchappy    时间: 2020-3-29 10:49
喂喂喂额我翁无
作者: cmdpchappy    时间: 2020-3-29 10:49
真的我我我我
作者: 小轩轩2264    时间: 2020-3-29 11:22
好深奥的样子
作者: 禁/锢    时间: 2020-3-29 19:45
长知识了,长知识了
作者: 1826156147    时间: 2020-3-30 07:39
长知识了,长知识了
作者: 1826156147    时间: 2020-3-30 07:42
学到了学到了
作者: zwb_dwz    时间: 2020-3-30 09:55
长知识了,长知识了,
学到了学到了
作者: 24k纯帅23356    时间: 2020-3-30 10:32
有意思,学到了(做任务)
作者: 2268417684    时间: 2020-3-30 11:48
emmmmmmmmmmm
作者: Kkkknight    时间: 2020-3-30 13:36
有意思,学到了(做任务

作者: 我叫云栖    时间: 2020-3-30 15:45
有意思,学到了(做任务)+1


作者: Crazy,    时间: 2020-3-30 15:58
有意思,学到了(做任务)+2
作者: 无所谓好吧    时间: 2020-3-30 20:34
6666666henhao

作者: 🥶❄️☠️    时间: 2020-3-30 21:41
这个楼啊,估计还是难逃像上一个挂直播的傅里叶本轮法一样成为水楼的命运了看来
请各位务必看一下这个,不要灌水了mcbbs.net/thread-13354-1-1.html

不过楼主还是没回答我的问题,咳
作者: 百白术    时间: 2020-3-30 23:10
我来学习啦
作者: 百白术    时间: 2020-3-30 23:11
想下载各位大佬的地图可我却连评论的资格都没有。。。

作者: 百白术    时间: 2020-3-30 23:12
我太难了。。。
作者: papaxia    时间: 2020-3-31 05:41
eemmmmmmmmm
作者: Mr.stark    时间: 2020-3-31 08:15
这个移速看起来有点慢啊,是作者为了做帖子特意调的么
作者: tianziyue    时间: 2020-3-31 11:55
666666666666
作者: 百白术    时间: 2020-3-31 13:06
好厉害的样子。。
作者: WINGY110    时间: 2020-3-31 16:40
谢谢!!!!!

作者: 老崔爱mc    时间: 2020-3-31 17:06
好厉害!!!!

作者: loli816    时间: 2020-3-31 18:34
谢谢分享
作者: duoduoduoduoduo    时间: 2020-3-31 20:42
试了一下,过来膜拜下大佬
作者: ROdin    时间: 2020-4-1 00:03
可以很厉害
作者: 愿灬许    时间: 2020-4-1 00:10
我脑壳有点晕
作者: 老崔爱mc    时间: 2020-4-1 07:53
真厉害

作者: Vlickly_    时间: 2020-4-1 08:31
这都是大佬才能干出的事情
作者: 梦粼、    时间: 2020-4-1 10:48
都是大佬
6666666
作者: 2449970282    时间: 2020-4-1 13:40
谢谢大佬们
作者: yonghouh    时间: 2020-4-1 15:40
厉害厉害 膜拜膜拜
作者: xiao.LD    时间: 2020-4-1 16:50
6666666大佬
作者: MxuanziC    时间: 2020-4-1 19:40
我试了试 膜拜大佬
作者: 爷的名字叫偌大_    时间: 2020-4-2 09:08
66666666666666666666666666666666666666666666666666666666666大佬啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
作者: shiqianjiang    时间: 2020-4-2 15:02
在创造里试了一下,大佬还是大佬

作者: qq1178280863    时间: 2020-4-2 15:36
泰坦世界怎么设置死亡不掉落
作者: shuai_youxin    时间: 2020-4-2 16:32
厉害了
作者: kongbaiyo    时间: 2020-4-2 19:49
沙漠之鹰xzy 发表于 2020-3-30 21:41
这个楼啊,估计还是难逃像上一个挂直播的傅里叶本轮法一样成为水楼的命运了看来
请各位务必看一下这个,不 ...

?垃圾信息太多
如果你的问题是作为子弹的话
确实可以 自己简单的改一下就行
作者: 1156901018    时间: 2020-4-2 21:46
谢谢楼主分享
作者: Mine_vivic    时间: 2020-4-3 06:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: yxb2002    时间: 2020-4-3 07:15
66666666666
作者: MC_MOBIN    时间: 2020-4-3 10:47
谢谢楼主分享
作者: a20063    时间: 2020-4-3 13:36
感谢感谢,很有用
作者: abu88    时间: 2020-4-3 15:07
超级有用这个我喜欢
作者: 灬忘却灬    时间: 2020-4-3 15:16
Sssssssssssssssssss
作者: 我が敌を喰らえ    时间: 2020-4-3 20:39
感谢楼主,很有用
作者: lazzysks    时间: 2020-4-4 12:42
qwqwqwqqqqqqqqqqqqqqqqq
作者: 3355826081    时间: 2020-4-4 13:49
......................................
作者: 成涵妹    时间: 2020-4-4 14:17
嗯整的挺高兴警惕angyesgi
作者: 2872654526    时间: 2020-4-4 15:54
我觉得这个技巧非常好学到了学到了!

作者: 2872654526    时间: 2020-4-4 19:24
这个技巧对我非常的使用
作者: 2872654526    时间: 2020-4-4 19:30
6666666666
作者: 幽蓝木樨    时间: 2020-4-5 00:03
大佬啊啊啊
作者: 3324490638wz    时间: 2020-4-5 14:29
是的,66666
作者: abu88    时间: 2020-4-5 14:38
真的吗厉害呀
作者: 一线之间    时间: 2020-4-5 16:39
谢谢大佬,,,,,,
作者: faatherquan    时间: 2020-4-5 17:55
谢谢楼主分享

作者: 我很帅吧    时间: 2020-4-5 18:10
感谢分享
!!!!!!
作者: ao_yf    时间: 2020-4-5 18:26
谢谢楼主分享

作者: ao_yf    时间: 2020-4-5 18:27
很有帮助,超级有用

作者: 末地探险者    时间: 2020-4-5 19:38
本帖最后由 末地探险者 于 2020-4-5 19:40 编辑

【思路】所指即所射!超精准的视线追踪新思路![1.15-1.16]

视线追踪我实在是看不懂于是我想了一个办法。。
希望您能来看一下
虽然检测碰撞箱可能没办法。。(主要是箭射的问题,一些非固体方块会穿过去)

作者: 卿宝来了    时间: 2020-4-5 20:54
( ⊙ o ⊙ )啊!
作者: 情灬浅    时间: 2020-4-6 10:01
谢谢,很有帮助
作者: 情灬浅    时间: 2020-4-6 10:05
emmmmmmmmm
作者: HoolTher    时间: 2020-4-6 10:41
谢谢,非常好

作者: 1632486147    时间: 2020-4-6 11:30
谢谢,非常好
作者: 无聊..    时间: 2020-4-6 13:54
厉害了
一般人完全想不到

作者: 崔掰掰    时间: 2020-4-6 15:31
谢谢,非常好
作者: 冲呵呵    时间: 2020-4-6 17:25
太好了,解救了我的燃眉之急
作者: 花无语    时间: 2020-4-6 19:46
这个爱了爱了
作者: Ashantutu    时间: 2020-4-6 22:35
完成任务完成任务
作者: Ashantutu    时间: 2020-4-6 22:35
提示: 该帖被管理员或版主屏蔽
作者: LirtualMod    时间: 2020-4-7 08:18
谢谢 非常好
作者: 微风梦    时间: 2020-4-7 13:53
我来完成任务任务
作者: whiteZzz    时间: 2020-4-7 14:29
真就这么牛吗??  我 i 了