minecraft吧 关注:1,451,550贴子:28,656,423

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

只看楼主收藏回复

大家好,这里是乾坤。今天带来的是“由GPS到精确定位”的思路指导,本贴将会采用我和pca对话的方式来为大家一步步呈现如何在MC中实现精确定位。
原型机作者乙烯的帖子:http://www.mcbbs.net/thread-460055-1-1.html
不过要注意一点,因为本贴是以对话形式阐述的,所以可能一个问题有多种算法,至于如何使用,任君定夺。


亚马逊海外购mine craft,足不出户,选购全球户外好物!

买mine craft,户外聚惠,看得见的海淘品质,快来「亚马逊海外购」选购吧!亚马逊海外购,全球大牌好物,正品价优,放心来GOU!

广告
二楼自占


三楼存档


那天,我和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了,然后以此类推,这种方法就叫做“二分法”(你可以理解为诸葛亮猜(cao)数字)


收起回复
举报|4楼2015-07-13 22:57
    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格,直到选择器选中为止,以此类推。
    当然,如果玩家距离太远,这个方法就行不通了,因为dx,dy,dz也是有探测范围的


    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
    而这就类似于四个象限的形式,至于如何判断玩家(目标)究竟在哪一象限,请看下文。


    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,同样黄色的线也是32767格,但是这次fill到了玩家,即成功。


    回复
    举报|7楼2015-07-13 23:01
      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其实也是用了类似的方法,让我们把这张图退化成直线形:


      图中A和B在一条直线上,首先将B沿A的方向fill(在知道A与B的位置关系以后)也就得到了一条以B为端点的射线,这条射线必经过A(因为A与是在一条直线上,但我仍并不知A的具体位置),然后相似的,也以A为端点,做一条向B的射线,端点也为A,那么中间重叠的部分(可用fill replace)即为A,B之间的距离。


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

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


        这里有两个玩家(目标)X和Y,现在我要判断X是位于Y的哪个方向(一共有四个方向:左上,左下,右上,右下),那么我先判断Y相对于X的X轴的正负,于是我在X的左边一格和右边一格分别summon一个AS,然后用c选择器让y去判定,如果Y更接近于X+1处的AS,就说明Y相对于X在+X的方向。而又因为X和Y都在一条平行于Z轴的直线上,那么X的Z值就等于Y的Z值,那么我们就得到了结果(Y在X的+X方向,Z与X相同)就可以进行下一步的操作了。但是当X和Y不在任何一条平行于X或平行于Z的直线上时,我们又该判定他们的位置关系呢?(即X的X坐标和Z坐标相对于Y的正负)。那么我们就需要换一个角度去思考:刚刚能直接判断X的相对正负就是因为Y和X平行于X轴,那么,我们就要想办法让Y的X值以及Z值和X的X,Z值在两条分别平行于X,Z两轴的直线上即可,举个例子,现在X(-3,2),Z(5,-7),我们要做的第一步就是先统一他们的X值,我这里选取X=0这条直线(别的直线也可,但为了方便起见,尽量选择X,Z=0的直线),那么就得到了两个点,他们的Z值是继承原来的两点的,但X值均为0,即X’(0,2),Y’(0,-7),那么用上图的方法就可得出他们Z值的相对关系了,同理,X值也可类似得出。


        收起回复
        举报|9楼2015-07-13 23:03
          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就解决了。
          注:此系统已用于原形机的系统中,故不再做过多解释。


          收起回复
          举报|10楼2015-07-13 23:04
            大皇帝页游新区入口,策略游戏选大皇帝,点击领取礼包,新服送首冲高返利! 酷玩吧为您推荐!!!
            广告
            有点爽


            回复
            举报|来自Android客户端11楼2015-07-13 23:05
              完全看不懂,嗯orz


              回复
              举报|来自Android客户端12楼2015-07-13 23:06
                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检测是否停下),其前方的方块即是两坐标轴的交点.
                确定了交点,就可以用fill法求出距离,即OD和O’D(仅在本范例中),那么根据勾股定理就可以求出O’O的距离,然后根据三角函数(tan)即可求出角x了。


                回复
                举报|13楼2015-07-13 23:07
                  火前留名


                  回复
                  举报|来自iPhone客户端14楼2015-07-13 23:07
                    写在后面的话:这篇思路指导总算是完了,这篇教程是我和另一位大触pca刷了几十页(上百了吧)聊天记录的产物,pca他提供了很多灵感和好的算法,还有这次范例原型机就是他做的XD,再次感谢他的支持,没有他,就没有这篇6000字的教程,另外,如果最后大家觉得开放有点困难的话,可以学习一下woody大触的牛顿开方器,链接:http://www.mcbbs.net/thread-465798-1-1.html或者自己百度,至于原型机会在明天放出,谢谢大家的支持。
                    乾坤 2015.7.13 于上海


                    收起回复
                    举报|15楼2015-07-13 23:07
                      单独一楼at pca再次感谢@pca006132


                      回复
                      举报|来自Android客户端16楼2015-07-13 23:09
                        辛苦了∑(っ °Д °;)っ


                        回复
                        举报|来自Android客户端17楼2015-07-13 23:12
                          来水一吧啊2333
                          其实这个系统理论上是可以支援无限距离的,然而由于一些原因(比如计分板的分数限制),所以其范围不能无限。
                          第二,这个系统虽然支援很大的距离,然而可能会比较慢233


                          回复
                          举报|19楼2015-07-13 23:14
                            帮顶orz


                            回复
                            举报|来自手机贴吧20楼2015-07-13 23:14


                              回复
                              举报|21楼2015-07-13 23:15
                                图标是我的


                                回复
                                举报|来自Android客户端22楼2015-07-13 23:16
                                  乙烯不是C2H4吗


                                  回复
                                  举报|来自Android客户端23楼2015-07-13 23:16
                                    图标


                                    回复
                                    举报|来自Android客户端24楼2015-07-13 23:17
                                      帮顶


                                      回复
                                      举报|25楼2015-07-13 23:20
                                        太长不看


                                        回复
                                        举报|来自Android客户端26楼2015-07-13 23:32
                                          ……有什么实际用途么?报给玩家他自己的坐标?




                                          回复
                                          举报|29楼2015-07-13 23:36
                                            不懂orz…什么意思…


                                            回复
                                            举报|来自Android客户端30楼2015-07-13 23:36
                                              很厉害啊,bop前来围观。触手可及


                                              回复
                                              举报|来自手机贴吧31楼2015-07-13 23:37