Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 409|回复: 6

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

[复制链接]
00ll00 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1316
钻石
性别
保密
注册时间
2015-5-9
查看详细资料
 楼主| 发表于 2019-10-3 20:14:12 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 00ll00 于 2019-10-5 10:29 编辑

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


0.目前方法的缺陷


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

  • 以玩家的视线方向步进基准点
  • 判断基准点处是否为空气
  • 若是,则返回第一步
  • 若不是,则当前方块即所求方块


但这个方法有很多缺陷:

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


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


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


1.更精准的方法


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

  • 以玩家的视线方向步进基准点
  • 判断基准点处是否为空气
  • 若不是,则当前方块即所求方块
  • 若是,则继续判断基准点周围六个方块是否都为空气
  • 若是,则返回第一步
  • 若不是,则继续判断视线所指向方块为哪个方向的方块(X+,X-,Y+,Y-,Z+,Z-)
  • 继续判断该方向的方块是否为空气
  • 若是,则返回第一步
  • 若不是,则指向的方块为所求方块


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


首先我们简化一下问题,只考虑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.更更精准的方法(只是补充)


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



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

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

  • 以玩家的视线方向步进基准点
  • 判断基准点处是否为空气
  • 若不是,则当前方块即所求方块
  • 若是,则继续判断基准点周围六个方块是否都为空气
  • 若是,则返回第一步
  • 若不是,则继续判断视线所指向方块为哪个方向的方块(X+,X-,Y+,Y-,Z+,Z-)
  • 继续判断该方向的方块是否为空气
  • 若不是,则指向的方块为所求方块
  • 若是,反转视线方向进行6~8步
  • 若反向判定结果仍为空气,则返回第一步
  • 若反向判定结果不为空气,则反向判定指向的方块为所求方块

3.感谢


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

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

4.数据包

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

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

评分

参与人数 7人气 +15 金粒 +150 收起 理由
Li_Chen_455 + 1 MCBBS有你更精彩~
1919褐雨燕 + 3 神乎其技,不服不行!
隐退 + 2 好复杂(
kongbaiyo + 2 + 50 tql 拿走用了
SPGoding + 3 + 50 ??我指点什么了我
夜之暗夜 + 2 + 50 MCBBS有你更精彩~
ETW_Derp + 2 MCBBS有你更精彩~

查看全部评分

我是萌新( 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1568
钻石
性别
保密
注册时间
2014-9-6
查看详细资料
发表于 2019-10-3 20:18:07 | 显示全部楼层
本帖最后由 我是萌新( 于 2019-10-3 21:11 编辑
感谢各位看了之后没把我打死

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

建筑者是什么,不应该是建造者吗(跑
   我终于可以安心地弃坑啦

评分

参与人数 1人气 +1 收起 理由
Jokey_钥匙 + 1 你建筑者没了(小声)

查看全部评分

回复

使用道具 举报

00ll00 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1316
钻石
性别
保密
注册时间
2015-5-9
查看详细资料
 楼主| 发表于 2019-10-3 20:30:39 | 显示全部楼层
我是萌新( 发表于 2019-10-3 20:18
因为我打不到你
还有一件事,你说的 绘图包 是啥(
是画线段、多边形、圆、多面体之类的吗? ...

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

:]

评分

参与人数 1人气 +2 金粒 +30 收起 理由
我是萌新( + 2 + 30 太棒啦(

查看全部评分

回复

使用道具 举报

隐退 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2555
钻石
性别
保密
注册时间
2017-8-25
查看详细资料
发表于 2019-10-3 21:00:22 | 显示全部楼层
本帖最后由 隐退 于 2019-10-4 12:47 编辑
00ll00 发表于 2019-10-3 20:30
目前做的工具有:铅笔,刷子,橡皮,滴管,填充,变暗,减淡,杂色,模糊,喷枪;三维笔刷,三维橡皮,三 ...

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

评分

参与人数 1人气 +2 金粒 +30 收起 理由
00ll00 + 2 + 30 教材费(太棒了!

查看全部评分

回复

使用道具 举报

kongbaiyo 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
5227
钻石
性别
保密
注册时间
2014-3-14
查看详细资料
发表于 2019-10-3 23:19:34 | 显示全部楼层
本帖最后由 kongbaiyo 于 2019-10-9 13:49 编辑

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

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



我以上说的全是错的

评分

参与人数 1人气 +2 金粒 +30 收起 理由
00ll00 + 2 + 30 震惊,我想一想

查看全部评分

回复

使用道具 举报

BlackCB. 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
8389
钻石
性别
保密
注册时间
2015-6-20
查看详细资料
发表于 2019-10-3 23:25:02 | 显示全部楼层
说的好,我选择第一种方法
想问一下每做一个基准点就探测周围6个方块的做法不会增加游戏负担吗,一般用途都应该会忽略这种情况的吧……
回复

使用道具 举报

00ll00 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1316
钻石
性别
保密
注册时间
2015-5-9
查看详细资料
 楼主| 发表于 2019-10-4 00:17:33 | 显示全部楼层
BlackCB. 发表于 2019-10-3 23:25
说的好,我选择第一种方法
想问一下每做一个基准点就探测周围6个方块的做法不会增加游戏负担吗,一 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-12-8 13:42 , Processed in 0.042409 second(s), Total 16, Slave 15 queries, Release: Build.2019.12.06.1150, Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表