minecraft吧 关注:2,560,224贴子:31,978,968

「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
    收起回复
      2025-08-21 14:33:15
      广告
      不感兴趣
      开通SVIP免广告
      三楼存档


      来自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
              收起回复
                有点爽


                IP属地:山西来自Android客户端11楼2015-07-13 23:05
                回复
                  2025-08-21 14:27:15
                  广告
                  不感兴趣
                  开通SVIP免广告
                  火前留名


                  IP属地:美国来自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
                      回复
                        辛苦了∑(っ °Д °;)っ


                        IP属地:四川来自Android客户端17楼2015-07-13 23:12
                        回复
                          @楼


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


                            19楼2015-07-13 23:14
                            回复
                              2025-08-21 14:21:15
                              广告
                              不感兴趣
                              开通SVIP免广告
                              帮顶orz


                              IP属地:山东来自手机贴吧20楼2015-07-13 23:14
                              回复