Minecraft(我的世界)中文论坛

标题: 【CBL|00ll00】[1.14+,附数据包] 更精准的方块视线追踪方法

作者: 00ll00    时间: 2019-10-3 20:14
标题: 【CBL|00ll00】[1.14+,附数据包] 更精准的方块视线追踪方法
本帖最后由 00ll00 于 2020-4-5 23:04 编辑

精准的方块视线追踪
与更更精准的方块视线追踪

-1.这个方法已过时

这个方法虽然比较精确,但是大量使用实体,实用性能不强。空白白直接采用数学计算,可以精确到方块内部碰撞箱,而且很快:


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


0.目前方法的缺陷


臆测目前大部分的CBer在遇到追踪玩家所指向的远处的方块时都会用如下方法:



但这个方法有很多缺陷:

在视线从方块边缘穿过方块时有极大的几率漏过:


而通常的解决方法是减小步长,这样不仅增大了游戏的负担,而且仍然难以解决这种刁钻的问题:


虽然一般来说这种情况的误差可以忽略,但若放在目前本人正在制作的绘图包中,就很容易因为穿透而出现漏墨的现象。因此需要一种更加精准的判定方法。


1.更精准的方法


这是我目前使用的方法,仍发现了一些漏洞,但是已经够用了(应该)。详见2.更更精准的方法



这一系列步骤中,最关键的一步就是第六步,判断视线所指向方块为哪个方向的方块了,接下来重点讲解。


首先我们简化一下问题,只考虑xz平面上的情况。
(以X+方向为0°,逆时针方向为正)

假设在当前基准点及水平视角如图



很容易看出视线指向了X+方向的方块,那么如何计算出这个结果呢

我们可以通过找出X+方向的临界值的方式来判断


只要视线角度在临界角度之间,我们就可以认为指向的是X+方向的方块。其他方向同理。
于是再简化一下,如图,因为视线角度在0°~90°内,我们只需要判断是指向了X+还是Z+,因为在这个范围内是不可能指向其他方向的,于是就只需要获取到一个临界值并进行比较。其他情况同理。


那么如何找出临界角?
我们可以分别在基准点位置和顶点处召唤两个Marker[O,T],然后用execute facing的方式使O看向T,这时O的视角即临界角。

通过测试,比较角度时只需要精确到十分位便可以在xz方向上拥有能与mc自带黑框相媲美的精确度。

接下来我们继续考虑y方向的问题,即视线是否是从Y+或Y-方向的方块穿出。这个判断要稍微麻烦一些,要用到一些初中数学知识。

还是沿用以上判断临界值的方法,并且我们已经能知道视线水平上指向了哪个方向,于是先考虑以下情况:


用以上的思维,由于仰角小于0°(mc内是这样的,抬头为负,低头为正),所以只需要判断是指向了X+还是Y+,于是需要在这个地方刷一个Marker来确定临界值



怎么刷呢
我们先忽视仰角,在视线前方一定距离处刷一个Marker[U],获取到U和O的坐标信息,然后分别计算出x1,x2,z1,由三角形相似可得z2=z1*x2/x1


于是,我们可以算出临界点的z坐标,又因为临界点是在方块的棱上,所以x,y都是整数化的,通过基于视线角的一些调整便能得到具体的值。
再通过相似的方法获取到仰角临界值并与视线的仰角进行比较,便可判断视线是从Y+还是侧面穿出。

通过测试,将角度放大10倍,坐标放大为128倍后进行运算能得到比较满意的结果。


2.更更精准的方法(只是补充)


在测试的过程中发现了一个非常刁钻的情况



图中视线方向为左下到右上,可以看出,视线本应指到红色混凝土,但前一个点处进行判断时四周都为空气,而下一个点时所指向的方向又并不是非空气方块,所以判定结果就是视线直接穿过了。

这种情况可以通过反向的穿透判定来解决,于是更更精准的方法为:


3.感谢


感谢空白白,SPG素学姐,如花等大佬的指点

这个教程过于简陋,也暂时没空做单独的数据包,后来做了看下面,感谢各位看了之后没把我打死

4.数据包

使用更更精准的方法,追踪距离为200m,应该能在所有1.14+版本使用(最近的几个快照渲染炸炸的,看起来可能有些奇怪)

AGT.zip (6.19 KB, 下载次数: 30)


作者: 底层咸鱼    时间: 2019-10-3 20:18
本帖最后由 我是萌新( 于 2019-10-3 21:11 编辑
感谢各位看了之后没把我打死

因为我打不到你
还有一件事,你说的 绘图包 是啥(
是画线段、多边形、圆、多面体之类的吗?

建筑者是什么,不应该是建造者吗(跑
   我终于可以安心地弃坑啦
作者: 00ll00    时间: 2019-10-3 20:30
我是萌新( 发表于 2019-10-3 20:18
因为我打不到你
还有一件事,你说的 绘图包 是啥(
是画线段、多边形、圆、多面体之类的吗? ...

目前做的工具有:铅笔,刷子,橡皮,滴管,填充,变暗,减淡,杂色,模糊,喷枪;三维笔刷,三维橡皮,三维喷枪,三维填充,剥离,长方体,球体
计划中还有一些矢量作图工具

:]
作者: (=°ω°)丿    时间: 2019-10-3 21:00
本帖最后由 隐退 于 2019-10-4 12:47 编辑
00ll00 发表于 2019-10-3 20:30
目前做的工具有:铅笔,刷子,橡皮,滴管,填充,变暗,减淡,杂色,模糊,喷枪;三维笔刷,三维橡皮,三 ...

听到你这个消息,我感到十分喜悦(


作者: kongbaiyo    时间: 2019-10-3 23:19
本帖最后由 kongbaiyo 于 2019-10-9 13:49 编辑

感觉我想到一个简化方案...不需要把xyz分开处理,也不用比较角度

就是先得到视线的指向方向 比如是+x+y+z方向
然后在当前位置朝方块的那个顶点处1格的距离处放个marker
然后在视线方向1格开外执行:如果marker在当前位置下方,则必会先碰到xz平面,其他类推
红线都是1格的长度,相当于标准化 图里这种情况就可以判断 marker如果在绿点位置-x方向,则一定先碰到z轴



我以上说的全是错的

作者: BlackCB.    时间: 2019-10-3 23:25
说的好,我选择第一种方法
想问一下每做一个基准点就探测周围6个方块的做法不会增加游戏负担吗,一般用途都应该会忽略这种情况的吧……
作者: 00ll00    时间: 2019-10-4 00:17
BlackCB. 发表于 2019-10-3 23:25
说的好,我选择第一种方法
想问一下每做一个基准点就探测周围6个方块的做法不会增加游戏负担吗,一 ...

会的,但是我也没办法了(