「CBL|乾坤&pca」思路指导:由GPS到精确定位

大家好,这里是乾坤。今天带来的是“由GPS到精确定位”的思路指导,本贴将会采用我和pca对话的方式来为大家一步步呈现如何在MC中实现精确定位。
原型机作者乙烯的帖子:http://www.mcbbs.net/thread-460055-1-1.html
不过要注意一点,因为本贴是以对话形式阐述的,所以可能一个问题有多种算法,至于如何使用,任君定夺。
楼主 乾坤轩辕1  发布于 2015-07-13 22:55:00 +0800 CST  
二楼自占
楼主 乾坤轩辕1  发布于 2015-07-13 22:55:00 +0800 CST  
三楼存档
楼主 乾坤轩辕1  发布于 2015-07-13 22:55:00 +0800 CST  
那天,我和pca正在讨论乙烯的原型机,于是一场头脑风暴就这样开始了(后来的事长的很,最重要的事情,就是这种讨(gao)论(ji)出了精确定位)(那位能找出这句话的原型?)
以下就是一些概括出的重要片段:
乾坤(以下简称Q):pca,我记得乙烯的算法是要有一个固定范围的吧,超出这个范围就探测不到了。就是他探测一个范围,然后把范围除以二,逐步缩小包围圈
PCA(以下简称P):恩,但是我想到一个不限距离的方法(奸笑道)谢谢你啊乾坤
Q:我也想到一种办法23333

好,我们先来分析一下上面的含义,乙烯的原型机的原理是这样的,限定一个范围,然后将“实体tp到未加载的区块里时至少还会加载一游戏刻。而坐标本身的2分法就是诸葛亮猜数字的典故。”二分法其实就是猜数字的方法,相信大家猜数字没少玩吧,看了个图先:


打个比方,现在有两个人,一个叫明明,一个叫静静,明明给静静猜数字(1~100以内的整数),假如明明心想一个数,13(不错的数字啊),然后静静开始猜了,为了防止自己太倒霉,静静想了一个办法,先猜50,这样一下子就把100个数给腰斩了(臣妾做不到啊)于是有三种情况:
1.结果>50
2.结果=50
3.结果<50
结果=50就最好了,天上掉下坨狗屎直接一次成功,这类同学可以去买彩票了。但是毕竟人生不会一帆狗顺的,极大多数情况都是情况1或情况3,其实这两种情况是一样的,明明会告诉静静50大了(或小了)那么可取的数就只剩1~50(或50~100)了,然后再把50除以2(一劈为二)得到25,那么刚才结果小于50的就变成50-25=25,结果大于50的就变成50+25=75了,然后以此类推,这种方法就叫做“二分法”(你可以理解为诸葛亮
楼主 乾坤轩辕1  发布于 2015-07-13 22:57:00 +0800 CST  
Q:交法不杀!
P:QWQ QAQ TAT OWO
其~~实~~呢~~我~~的~~方~~法~~很~~简~~单~~(Q:您老要驾鹤而去了么。啊朋友再见~啊朋友再见~啊朋友再见~)
咳咳,是这样的,其实我的方法和二分法差不多,就是每次在X/Z轴上(注:X或Z轴在本贴算法中等价)tp2000多格,应该是2048格吧,然后如果超过了就用二分法再倒回去tp,这样就可以找到位置了。
Q:那你是如何判定是否超过玩家/目标的?
P:dx和dz啊

好,我们来看看pca的算法,先 上 图:


Emm,中间的那个AS(ArmorStand的简称,下同)就是pca说要tp的东西,你可以把这货理解为一个扫描仪,如果扫描到某一个区域正好与玩家/目标的坐标一致时就大工告(gao)成了,即目标坐标已被导入至SCB(ScoreBoard的简称,下同),就可以像下面这样读取坐标了


但是问题就在于如何使他与目标重合呢?有同学可能会说直接把AStp过去不就完了,但是直接tp是无法知道AS走了多少格的,于是我们就采取一种半预设的方式:tp一段距离,然后把这段距离导入SCB,举个栗子,现在我往前走2048格,这格数是我预设好的,那么我就把AS在SCB里的分数+2048(对应的分数)。那到底该如何判断是否再tp一次2048格就会超过目标呢,请看本楼第一张图,采用的方法是用dx,dz选择器来控制距离,dx,dz是用来探测实体空间位置的选择器,通常探测空间坐标常与dy连用,但这里仅是探测平面的坐标,就不需要dy选择器了,那么探测下来仅能得到两种结果:在下次tp范围内,那么再用刚刚tp的格数tp一次就会超过目标,如目标离AS还有1025格,那么目标就在选择器框定的紫框里面,如果再tp一次2048格就会超过目标,那么就要选更小精度的选择器来判定了(这有点像托盘天平,砝码精度不够就换上游码),还有一种情况是不在下次tp范围内,那么就意味着可以再用刚刚tp的格数tp一次,假定目标离AS还有2333格,那么选择器这次就不会选中他,可以再tp一次2048格,直到选择器选中为止,以此类推。
楼主 乾坤轩辕1  发布于 2015-07-13 22:59:00 +0800 CST  
P:乾坤这回轮到我了2333,交法不杀!
Q:QWQ QAQ TAT OWO
P:噗,乾(ji)坤(lao)你不能死啊
Q:XDDD,其实我的方法是用到了stats和fill,先以玩家为中心,分别在玩家的0 255 ~,~ 255 ~ 和~255 0 这三个地方summon 3个AS,分别记为X,Y,Z,然后再以玩家为中心,分别以~ 255 ~ ,~~ ~ 以及 ~ 255 ~ (对,和第一个坐标一样)为中心,向X,Y,Z强行fill方块,保证每个block都会被“处理”到,然后再把这三个值接通stats使其与SCB联系起来,这样我们就得到了玩家到原点的绝对值,然后我再想想如何判定玩家到底在哪边。


好我们来用图分析一下:


嗯,图中那个在海晶灯上的AS就是玩家(目标)了,站在钻石块上的,金块上的和铁块上的AS分别是X,Y和Z。所以理所当然的,蓝色玻璃对应的就是玩家(目标)到X轴的距离,白色玻璃对应的是玩家到Z轴的绝对值,而黄色玻璃比较特殊,他代表的是玩家255减去到0的绝对值,当然,这些都是要把AS脚下的方块算进去的,而我为了醒目就没有标出来,因为只有AS脚下的方块才是相对应的坐标值,那么看图我们就可以知道,玩家(目标)到X轴的距离是4-0=4,到Z轴的距离是6-0=0,到y=255高度的距离是5,即玩家(目标)的y就是255-5=250,但因为玩家坐标不可能<0,所以y值是唯一确定的,即250,而X,Z值都是距离,也就是绝对值,那么玩家坐标就有4种情况,分别是
1.x=4,y=250,z=6
2.x=-4,y=250,z=6
3.x=-4,y=250,z=-6
4.x=4,y=250,z=-6
楼主 乾坤轩辕1  发布于 2015-07-13 23:00:00 +0800 CST  
P:但是你这样就有两个问题,你如何实现两个实体间的fill?以及如果距离超过32767即fill的极限该怎么办?

这里来解释一下pca的两个问题,首先我们知道,fill目前是仅能以一个实体为中心放置方块的,那么也就是说只能以一个AS的坐标为中心,那就会导致不能准确的得知两个实体间的距离了,因为以一个实体为中心顶多做一条射线(射线仅有一个端点),而线段需要两个端点。即不能确定距离,第二个问题是说的fill的极限方块数,也就是说,如果选定填充的方块总数超过了32767格方块,那么就不能执行,这也是一个难点。

Q:额,我先来解答一下第二个问题吧,第二个问题我是用分段fill的方式解决的,就是像章鱼一样,四个方向分别离X,Y,Z 32767格的地方再summon一个AS,然后探测玩家是否在指定范围内(用刚才的方法),如果在就可以fill了,如果不在就只能再次天女散花式的以刚才的每个AS为中心再分别summon一圈AS,不过因为坐标的关系,玩家到AS的距离必然与坐标轴垂直(距离的定义)例如玩家离X的距离必然与X轴垂直,玩家离Z轴的距离必然与Z轴垂直一样。所以只要朝着同一个方向summon,直到fill到玩家32767格周围即可。
依旧补图说明


图中红色的部分是第一次fill的形式,这幅图中由于玩家离X超过了32767格,所以第一次fill并没有成功找到玩家,所以进行了第二次fill,同样黄色
楼主 乾坤轩辕1  发布于 2015-07-13 23:01:00 +0800 CST  
P:那么还剩下两个问题,分别是如何在一条平行于X/Z轴的直线上的两个实体间fill方块,其二就是如何判断目标处于第几“象限”,即判断玩家(目标)的X/Z值相对于“坐标原点”(即x=0,z=0)的正负情况,我似乎都想到了解决方案2333。
Q:dafuq?!交(xi)法(wen)不(le)杀(jian)!
P:(满脸黑线的)额,好吧我先说第一种,就是如何在一条平行于X/Z轴的直线上的两个实体间fill方块吧。。。
Q:小pca啊,地里黄啊,二三岁啊。。。。
P:噗噗噗,好吧我来说一下思路,主要就是妙用了叠加法,就是先以第一个目标A为中心向B的方向相向fill 32767格,然后以B为中心同样相向往A这边fill,中间的重叠的部分就自然是A与B之间的部分了。

这边来解释一下,首先举一个不太恰当的例子,这是一张颜色的叠加图


大家可以看到,A,B两个圆中间是有一部分重叠的(记红色的圆为A,黄色的圆为B)那么这里一条直线上的fill就可以理解为两个圆心a,b之间的fill了,如图,尽管B不知道A的圆心在哪里,A也不知道B的圆心在何处,那么A就开始向外扩展,同时B也在向外扩展,在图中形象的表示就是扩展出了一个圆,那么重叠部分就是圆心a到b之间这块了(这种方法也可以用来判断距离,但是太过复杂,便不做介绍)
那么pca其实也是用了类似的方法,让我们把这张图退化成直线形:


楼主 乾坤轩辕1  发布于 2015-07-13 23:02:00 +0800 CST  
Q:那么你如何解决判定相对位置的问题呢
P:问的好,如果目标是在平行于X/Z轴,那么我们就可以利用距离的远近,也就是c选择器来判断,当然如果对象不平行于X/Z轴,也只需判断两次就可以知道两个玩家(目标)的相对“象限”(坐标正负)了

还是上图补充(我上啊上啊上图图)


楼主 乾坤轩辕1  发布于 2015-07-13 23:03:00 +0800 CST  
P:等等,我似乎想到了一种更为简便的探测坐标的方法,结合r选择器可以更加简便.
Q:交——
P:法——
Q:不——
P:屮——
P:好吧是这样的,我结合了之前乙烯作品的一个特性:tpAS(实体)的瞬间不会被刷没,所以我先在平行于X轴与平行于Z轴的相对位置(见之前的stats与fill绝对值算法部分)summon了两个AS(这两个AS分别等效于玩家的X值和Y值),再用刚刚的办法检测了AS到原点的相对位置(见c选择器判定相对位置部分),由于两个AS都是和过原点的(0,0)两条坐标轴相平行,而不是斜线,所以就可以用r选择器探测AS到原点的距离,如果rm超过100格,那么就把AS向原点tp100格(方向之前已探测过),直到AS距离原点100格以内,这时再用fill stats就解决了。
楼主 乾坤轩辕1  发布于 2015-07-13 23:04:00 +0800 CST  
Q:我似乎想到了什么可啪的东西
P:神TM可啪(pia)
Q:交——
P:你妹啊——
Q:好了我先说说这个系统最终的功能吧,他能让你气血旺盛,欲望汹涌,300年坚挺——
P:TM杨伟哥么
Q:咳咳…好了我不卖关子了,这个系统的真正功能是可以探测两个玩家(任意实体)的直线距离以及各自的坐标,并用SCB的方式存储起来,最可贵的是,可以探测目标间的相对角度,是不是很牛?
P:牛牛牛,牛到伟哥家里去了(ran)(bing)(luan)
Q:好了我是不是该讲方法了?算了,还是留给我们一直在幕后做讲解的杨…不,乾坤2号大大来给我们讲解吧,来pca我们喝口猹
Q2:好吧轮到我给大家讲解了,依旧先上图(tm老子上了一辈子图了,完没完啊!):


好了,这张图里的两个目标就是O和O’,现在我们要做的就是计算O与O’之间的直线距离和角x的度数,首先我们可以运用判断相对位置的方法判断出O相对于O’的象限(即左下)那么知道了位置关系以后两个坐标系就要分别向外做垂线,那么会在坐标轴上产生两个焦点:C和D,那如何确定C和D点呢,我的方法是这样的:首先两边在原AS上方一格fillreplace方块,那么在交点处就会被fill到两次,一次是fill,一次是fill replace ,因为我是在上方一格fill的,那就会形成这样的情况:


图中金块代表的是O点延伸出去的坐标轴,而铁块是O’点延伸出去的坐标轴,绿色粘土就是其交点D
其中绿色粘土就是重叠fill的产物(详见重叠方块部分),然后我在O点再次summon一个AS,并改变它的Motion(因为之前判定过相对位置,所以会有不同情况),那么他会笔直往前冲直到撞到障碍物,而之前在AS的上方fill的用意就是在于挡住AS,这样当AS停下来的时候(可用SCB检测NBT检测是否停下),其前方的方块即是两坐标轴的交点.
楼主 乾坤轩辕1  发布于 2015-07-13 23:07:00 +0800 CST  
写在后面的话:这篇思路指导总算是完了,这篇教程是我和另一位大触pca刷了几十页(上百了吧)聊天记录的产物,pca他提供了很多灵感和好的算法,还有这次范例原型机就是他做的XD,再次感谢他的支持,没有他,就没有这篇6000字的教程,另外,如果最后大家觉得开放有点困难的话,可以学习一下woody大触的牛顿开方器,链接:http://www.mcbbs.net/thread-465798-1-1.html或者自己百度,至于原型机会在明天放出,谢谢大家的支持。
楼主 乾坤轩辕1  发布于 2015-07-13 23:07:00 +0800 CST  
单独一楼at pca再次感谢@pca006132
楼主 乾坤轩辕1  发布于 2015-07-13 23:09:00 +0800 CST  
@楼
楼主 乾坤轩辕1  发布于 2015-07-13 23:14:00 +0800 CST  
让大家久等了,原型机链接:http://pan.baidu.com/s/1mgjAvxe
可以下载下来玩玩哦,作者是我的好友pca@pca006132
楼主 乾坤轩辕1  发布于 2015-07-15 23:50:00 +0800 CST  
申精~理由:本贴是根据国外某大神的GPS 坐标探测为原型,在加之国内乙烯的改进为基础而写成的。主要内容为1.8+原版精确定位以及位置探测的算法,自创了一些算法,可进行自行的调配与组合,经测试,100000格左右的定位大概需要5s左右,而命令数量相对于国外也大大减少,提高了精度,而且本贴采用了自创的对话+说明方式试图能将调理讲解的更清晰,而且还附有存档可供爱好者测试和研究,更重要的一点是,本贴中每个小系统也都可以相对独立,可以为其他算法的构建提供思路与想法。
PS:本贴由于是命令技术相关帖,贴吧精品作者实在太少,希望能走特殊审核渠道,劳烦精品审核组了。
附本贴链接:http://tieba.baidu.com/p/3892106581
以及原型机链接(由pca制作):http://pan.baidu.com/s/1mgjAvxe
楼主 乾坤轩辕1  发布于 2015-07-16 00:04:00 +0800 CST  
at 各位有精品的红石触,可能是因为目前的精品管理问题,命令精品推荐人过于少见,不得已at各位红石推荐人。
申精~理由:本贴是根据国外某大神的GPS 坐标探测为原型,在加之国内乙烯的改进为基础而写成的。主要内容为1.8+原版精确定位以及位置探测的算法,自创了一些算法,可进行自行的调配与组合,经测试,100000格左右的定位大概需要5s左右,而命令数量相对于国外也大大减少,提高了精度,而且本贴采用了自创的对话+说明方式试图能将调理讲解的更清晰,而且还附有存档可供爱好者测试和研究,更重要的一点是,本贴中每个小系统也都可以相对独立,可以为其他算法的构建提供思路与想法。
PS:本贴由于是命令技术相关帖,贴吧精品作者实在太少,希望能走特殊审核渠道,劳烦精品审核组了。
附本贴链接:http://tieba.baidu.com/p/3892106581
以及原型机链接(由pca制作):http://pan.baidu.com/s/1mgjAvxe
楼主 乾坤轩辕1  发布于 2015-07-16 14:56:00 +0800 CST  
@婴垣帝凤@祭雪夏炎天坑已通过申精,不过他没空,劳烦各位吧主加精
楼主 乾坤轩辕1  发布于 2015-07-16 19:50:00 +0800 CST  
@婴垣帝凤
楼主 乾坤轩辕1  发布于 2015-07-16 21:05:00 +0800 CST  
@婴垣帝凤
楼主 乾坤轩辕1  发布于 2015-07-16 21:21:00 +0800 CST  

楼主:乾坤轩辕1

字数:7369

发表时间:2015-07-14 06:55:00 +0800 CST

更新时间:2016-03-15 11:40:42 +0800 CST

评论数:255条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看