minecraft吧 关注:2,010,955贴子:29,685,521

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

只看楼主收藏回复

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


回复
1楼2015-07-13 22:55
    二楼自占


    收起回复
    来自Android客户端2楼2015-07-13 22:55
      三楼存档


      收起回复
      来自Android客户端3楼2015-07-13 22:55
        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
                    火前留名


                    回复
                    来自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
                            @楼


                            收起回复
                            来自Android客户端18楼2015-07-13 23:14
                              来水一吧啊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客户端28楼2015-07-13 23:34


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


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


                                                  回复
                                                  来自手机贴吧31楼2015-07-13 23:37
                                                    乾坤大触


                                                    回复
                                                    32楼2015-07-13 23:43
                                                      回复
                                                      来自Android客户端33楼2015-07-14 00:02
                                                        太触不看


                                                        收起回复
                                                        来自Android客户端34楼2015-07-14 00:07
                                                          额,赶紧跑回来作地图。


                                                          回复
                                                          来自手机贴吧35楼2015-07-14 00:25