redstone_machine...吧 关注:3,460贴子:60,268

两种矢量炮高度衰减问题的解决思路

只看楼主收藏回复

既然高度衰减的本质已经被发现了,那么它被解决也就是迟早的事了
本帖仅提供两种各有优缺点的解决思路,具体的细节还需完善


q43巨佬的帖子→https://tieba.baidu.com/p/5819939000


回复
1楼2018-08-05 10:55
    既然高度衰减的本质是爆炸中心和被动中心存在高度差导致的y轴方向多余的向下初速度,
    那么能不能用正交法把这部分初速度抵消掉呢?
    相信在座的各位在看q43的帖子时应该能很自然地想到这种办法
    那么为什么没有人提出这种解决方案呢


    (直接去q43的帖子把公式抱来23333
    从公式中可以看出,在距离不变的情况下,发射tnt获得的速度和推进tnt数量成正比。也就是说N每增加1,V0都随之增加一个定值,因为造成高衰的压爆现象实际上是v0在y轴方向的分矢量,所以N每增加1,压爆现象带来的y轴初速度也会随之增加一个定值,不妨把这个定值叫做“压爆增量”。
    同理,把下方推进TNT数量增加1,带来的y轴初速度增加量叫做“压爆抵消增量”

    因为1/16的高度差实在是太小了,通常情况下“压爆增量”应该是远小于“压爆抵消增量”。这样即使能抵消压爆的影响,精度仍然不高。相信在座的各位大佬也是因为这个原因才放弃这个设想的。


    回复
    2楼2018-08-05 10:57
      但是别忘了压爆抵消增量大小还和下方推进tnt所处的位置有关呢,或许能找到一个位置使高衰y轴初速度大于下方推进tnt数量加1带来的初速度。
      压爆抵消增量当然是越小越精确了
      Tnt爆炸的影响范围为8,那么发射tnt正下方8格位置就是压爆抵消增量最小的位置,这个位置就最适合用来抵消压爆影响。

      找到了合适的位置,那么比较一下这个位置的“压爆增量”和“压爆抵消增量”的大小关系就知道这个思路的可行性了。

      就拿这种经典的正交三维矢量炮的炮口举例吧,如图


      回复
      3楼2018-08-05 10:58
        改进后如图


        可以看到,x,z方向的集束到发射tnt的距离相同,那么可以把它们当成同一个集束。
        炮口就被抽象成了这样


        回复
        4楼2018-08-05 11:01
          那么现在就能计算出集束爆炸中心到发射tnt被动中心的距离了,如图


          计算出来的值为(5√41)/16
          把这个值带进公式


          如图,最后计算出来的压爆增量值为0.02342225238
          同理计算出来下方8格压爆抵消增量为1/128,即0.0078125
          然后我又计算了一下发射tnt下方第6格位置的压爆抵消增量,大概是33/128,即0.2578125是8格位置的33倍(等会儿就知道为什么要计算这个值了)


          辣么事情就突然变得有趣起来了
          可以看出,下方第8格的压爆抵消增量不仅小于压爆增量
          而且还有非常微妙的关系
          压爆增量除以压爆抵消增量约等于2.998048304
          这个数字非常接近3
          也就是说以后造3维矢量炮时只要在炮口下方8格处装填xz方向推进tnt数量3倍的tnt就能防止高度衰减现象了
          然而事实真的是这样吗
          接下来我们来做一个精确度非常高的实验来测量一下实际的压爆增量和压爆抵消增量


          回复
          6楼2018-08-05 11:05
            压爆现象之所以一直没人发现,很大一部分原因的因为重力的干扰。
            那么弄一块cp屏蔽掉重力就行了
            如图,这条指令能生成一个不受重力影响的tnt作为发射tnt


            搭好的实验装置长这样↓↓后面一整排拉杆是用来控制装填tnt数量的


            后面那只基佬紫cb里的指令长这样


            这条指令是用来干嘛的呢?
            大家都知道,用entitydata修改实体标签时会输出一大串实体信息,其中就包括motion标签,这个标签中记录了实体x,y,z轴的当前速度。
            @e[dx=1,dy=0,dz=1000]的意思是查找从cb所在坐标到cb所在坐标的x,y,z值分别加上dx,dy,dz后的坐标范围内的实体,这个范围就在图中红线再靠前一格的位置。
            这条指令其实是一直修改顺着红线飞行的tnt的invulnerable标签,然后打印出tnt在每一gt的实体数据。
            用延时摄影把实验过程录下来,然后找到发射tnt被赋予初速度瞬间的初速度值,就能非常精确地得到压爆增量和压爆抵消增量的值了(`・ω・´)


            收起回复
            7楼2018-08-05 11:14


              比值倒是没有多大的变化。
              也许是实验误差的锅。


              于是我做了下面几个实验来检验实验的精确度


              回复
              9楼2018-08-05 11:24
                把水平方向的推进tnt数增加到2
                那么理应得到0.022495311105209543*2=0.044990622210419086的y轴速度
                测得的数据:


                。。。。
                那就增加到20个吧


                只有0.00000000000000002的误差Orz


                回复
                11楼2018-08-05 11:37
                  来点更刺激的qwq
                  水平推进tnt装填5个
                  垂直推进tnt装填3*5=15个
                  那么产生的压爆初速度:0.022495311105209543*5=0.112476555526047715
                  抵消压爆的初速度:0.0075031510447241960*15=0.11254726567086294
                  那么发射tnt理应得到的y轴初速度为
                  0.11254726567086294 - 0.112476555526047715 = 0.000070710144815225
                  最后测得


                  这精确度真是恐怖如斯


                  回复
                  12楼2018-08-05 11:38
                    同时可以看到tnt几乎是完全沿着平行于红线的路径前进
                    这说明压爆确实是可以抵消的,高衰是可以避免的╮( ̄▽ ̄)╭


                    回复
                    13楼2018-08-05 11:39
                      看到这里,你也许会有一个疑问,既然平衡压爆的用弹量是水平方向用弹量的3倍,那如果水平装填了30个tnt,下方岂不是要装填90个tnt呢。
                      别忘了之前计算过发射tnt下方第6格位置的压爆抵消增量正好是第8格位置的33倍
                      也就是说只要在第发射tnt下方6格处装填2个tnt,再在8格处装填24个tnt即可。
                      嘛,这毕竟是纯计算得出的结果,我不太放心,就又做了个实验
                      测得的6格位置压爆抵消增量为


                      0.2525031644858509/0.0075031510447241960≈33.652949671511313435274380284144
                      ????????????
                      我们根据得到的新数据来重新计算一下
                      30个水平推进tnt造成的压爆初速度:30*0.022495311105209543= 0.67485933315628629(这个数字相当的可怕
                      2个下方6格tnt带来的初速度:2*0.2525031644858509=0.5050063289717018
                      相减等于0.16985300418458449
                      0.16985300418458449/0.0075031510447241960=22.637556297632552668025390731828
                      四舍五入,最后的结果是在6格处装填2个tnt,在8格处装填23个
                      终极版的炮口长这样


                      。。。。。。
                      看来以后的睾♂精度矢量炮都要自带睾♂速fpu处理睾♂精度浮点运算Orz
                      那么高度衰减问题的第一种解决方案就到此完结了


                      收起回复
                      14楼2018-08-05 11:45
                        可行性暂且不说,思路很强


                        回复
                        16楼2018-08-05 12:18
                          虽然看不懂,但是感觉很厉害


                          回复
                          来自Android客户端17楼2018-08-05 12:59
                            虽然看不懂,但是感觉很厉害


                            收起回复
                            来自Android客户端18楼2018-08-05 13:04
                              封面皮


                              回复
                              来自Android客户端19楼2018-08-05 13:34


                                收起回复
                                来自Android客户端21楼2018-08-05 14:01
                                  发现bug
                                  dalao:强行解决并成功
                                  我:试图绕过并翻车


                                  回复
                                  来自Android客户端22楼2018-08-05 14:47
                                    可是还是不能完全克服啊


                                    收起回复
                                    来自iPhone客户端23楼2018-08-05 14:51
                                      我的想法是利用两组TNT在Y=H+d和Y=H-d-1/8来抵消Y轴推力但目前操作起来仍有问题


                                      回复
                                      来自iPhone客户端24楼2018-08-05 14:59
                                        思路很厉害,就是看不懂


                                        回复
                                        来自Android客户端25楼2018-08-05 21:08


                                          回复
                                          来自Android客户端26楼2018-08-05 21:12
                                            作为补充送个精品吧(


                                            收起回复
                                            来自Android客户端27楼2018-08-06 09:39
                                              虽然确实可以抵消掉大部分误差了_(:з」∠)_
                                              但是这要求的TNT数量。。。炮体延展不开的节奏
                                              总之还是给julao刷个666


                                              回复
                                              29楼2018-08-06 12:39
                                                第二种方法是基于潜影贝的这种方法有望完美解决压爆问题,目前还在实验,先让我拖一会坑


                                                收起回复
                                                来自Android客户端30楼2018-08-06 13:22


                                                  先丢个图放在这


                                                  回复(2)
                                                  31楼2018-08-06 15:23
                                                    神仙对抽,可望而不可及


                                                    回复
                                                    来自iPhone客户端32楼2018-08-06 22:40
                                                      接下来要介绍的是压爆问题的终极解决方案
                                                      相比之下前一种用正交法抵消压爆什么的,都是瓜皮


                                                      先来做个炮口吧


                                                      先捏成酱紫


                                                      记下栅栏门的坐标
                                                      然后输入一条指令
                                                      /summon Shulker x y z {Peek:16,Invulnerable:1,Attributes:[{Base:1.0,Name:"generic.knockbackResistance"}],AbsorptionAmount:10,NoAI:1}
                                                      xyz处填栅栏门的坐标
                                                      这条指令会生成一个炸不死不会动的潜影贝
                                                      然后就可以捏出一个炮口惹
                                                      注意潜影贝边上的方块不能是实体方块



                                                      这样就能避免高衰惹(・∀・)


                                                      收起回复
                                                      33楼2018-08-07 22:47
                                                        好了,看到这里在座的各位应该都明白这个炮口为什么能避免高衰了
                                                        就是利用潜影贝的碰撞箱,把发射tnt稍微顶起来一点点,消除掉爆炸中心和被动中心的高度差
                                                        其实我直到前天发这贴的时候还是想用地毯的,但很不幸的是爆炸推力并不能透过地毯,这样y轴方向的推进只能靠折射完成,所以我觉得这种垫高tnt的方法局限性有些大
                                                        直到我发现了潜影贝_(:3」∠)_
                                                        因为是实体,爆炸推力能通过潜影贝
                                                        同时潜影贝拥有与普通方块相同性质的碰撞箱
                                                        看↓↓tnt能被潜影贝顶起来


                                                        收起回复
                                                        34楼2018-08-07 22:49
                                                          更重要的是
                                                          潜影贝可以自定义碰撞箱高度!!!!!!!
                                                          潜影贝有一个Peek标签,范围0~100,只能填整数
                                                          对应的碰撞箱高度从1格高到两格高
                                                          按理来说1Peek的高度是0.01
                                                          然而事实并不是这样的,Peek标签是非线性的_(:3」∠)_估计是sbmojang为了做出平滑动画效果故意把它弄成非线性的
                                                          具体请看这位大佬的测量结果→http://www.mcbbs.net/thread-603606-1-1.html
                                                          那张图长这样


                                                          测了一下红框里的那部分


                                                          可以看到0.06125近似地对应peek等于16时潜影贝增加的高度,这时潜影贝增加的高度为0.06182634830475
                                                          那么如果用这种潜影贝去垫高发射tnt,爆炸中心和被动中心的高度差就会变成0.00057634830475
                                                          如果你还是觉得这个高度差不够小
                                                          那可以试试下面几种方案
                                                          需要在炮膛处也垫上潜影贝
                                                          穷举大法好qwq


                                                          Ps:图中的精度指的是爆炸中心和被动中心的高度差


                                                          回复
                                                          35楼2018-08-07 22:52
                                                            对了,tnt有时候会穿过潜影贝,但那只是看起来穿过了
                                                            测一下坐标就知道它并没有穿过
                                                            又是一个bug


                                                            回复
                                                            来自Android客户端36楼2018-08-07 23:06