暗黑破坏神吧 关注:677,840贴子:20,420,598

【野性狂暴】动作帧数解析-Feral Rage FPA Specific

只看楼主收藏回复



IP属地:湖北1楼2011-04-15 14:09回复
    IP属地:湖北2楼2011-04-15 14:10
    回复

          
          
          
          
      【野性狂暴】动作帧数解析-Feral Rage FPA Specific
          
          
           
          
           
        
        
      


      IP属地:湖北3楼2011-04-15 14:10
      回复
          
        野性狂暴是暗黑2中一个特殊的技能,也是一个动作帧数计数原理独一无二的技能。很荣幸,这次我来为其做一个动作帧数的解析,并推导野性狂暴技能的攻速公式。希望能以此来更好地理解暗黑中攻速公式的原理。
        野性狂暴的攻速一直是大家争论的焦点,查询游戏软代码可以看到野性狂暴使用A1攻击方式,FPD=13,利用攻速计算公式可以得到野性狂暴速度和普通攻击一样的结论,但很多玩家都在实际游戏中发现野性狂暴速度比普通攻击快的现象。其中TheDragoon发明了一种近似公式,将FPD取11.5,并将这个近似公式运用于了他的英文版计算器Wereform Central上。我们可以看到当WIAS较低时,这个公式的近似程度非常的差。而且我们知道暗黑中最小的时间单位是帧,因此FPD只能是一个整数,而不会使用一个非整数参与计算。
        到底野性狂暴的运行原理是怎样的呢,这不是一个容易解释的问题。
        我们知道,一般来说,一个动作的动画长度(帧数)是可以预先计算确定的。只要人物的状态保持不变,那么这一动作将会按照预先计算的帧数来运行。但野性狂暴在1.10版之后,其原理变得十分难以理解,成为了一个在动作中途改变计数原理的技能。
        


        IP属地:湖北4楼2011-04-15 14:11
        回复
          暗黑一般攻速计算公式:
          首先我们先看看,如何计算野性狂暴动作动画长度FPA的预先计算值:
          它符合所有非顺序动作的通用总体公式:
          FramesPerAttack={HitShift*FramePerDirection / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]}-1
          那么这个公式是怎么来的呢?
          <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
          按照惯例,我们先介绍接下来将使用的数据单位:
          Frame帧(简称F):暗黑2中播放动作动画和计算伤害持续时间的最小单位,1秒=25帧
          Counter计数值:暗黑2中即时计算动作动画的长度单位。在计数时,1帧=256计数值
          然后我们来看速度总体公式中出现的几个数据名称:
          HitShift:=256,用于帧和计数值之间的换算
          FramePerDirection:该动作动画长度的基础值,单位为帧
          AnimationSpeed:该动作动画播放的基础速率,单位为计数值每次计数(Counters/Tick)
          BaseRate:基础速度修正值,也可以理解为基础加速度。一般为100,即100%的速度,无增减。一些顺序动作技能有速度惩罚,因此BaseRate小于100,这意味着它们的基础动画速度比一般的攻击动作慢,反之则对速度有奖励。
          SpeedIncrease:速度增量,也就是增加的加速度。
          BaseRate+ SpeedIncrease合起来就是对动画播放速度的修正值,也就是“加速度【Acceleration】”了。大于100时加速,小于100时减速。上限为175,下限为BaseRate*15%。
          下面来说明暗黑2中即时计算动画长度的方式:
          游戏中是以计数的方式来决定当前动画是播放还是结束的。
          首先游戏会计算出这个动作的【计数终止值】:
          Counter-end value= Hitshift*FramesPerDirection
          当计数达到或超过这个值时则动画终止。
          每一次计数,计数值的增量为:
          Counter-rise value= [AnimationSpeed *Acceleration/100]
          因为计数值Counter是计数量的最小单位,所以修正过的动画播放速率要向下取整。
          (注:加速度Acceleration=BaseRate+ SpeedIncrease)
          需要注意的是,一般来说,暗黑2中下一个动作的第一帧是从上一个动作的最后一帧开始播放的,也就是说每个完整动作的最后一帧动画是不播放的。除了顺序动作例外,顺序动作的每一帧都播放。
          因此暗黑中的每击动作动画时间长度FPA=Counter-end value/ Counter-rise value – 1
          如果是顺序动作则不-1
          又因为帧Frame是播放动画的最小单位,所以计数次数需要向上取整,得到的整数才是这个动作的真正长度。
          因此公式修正为:
          FPA= {Counter-end value/ Counter-rise value} – 1
          


          IP属地:湖北5楼2011-04-15 14:11
          回复
            变形后人物攻速系统:
            当我们使用变形技能后,上面的总体攻速公式依然适用,但不同的是,变形后的基础动画速率AnimationSpeed并不是固定的,而是随着武器速度改变的。(注:仅狼人变化和熊人变化适用,塔格奥套装上的变身吸血鬼和迪勒瑞姆上的变身冥河娃娃还是使用基本公式,AnimationSpeed固定不变)
            当我们使用变形技能后,基础动画速率被武器速度修正为:
            Delay = [ Hitshift*人形的FramePerDirection /[(100 + WIAS - WSM)*人形的AnimationSpeed /100]]
            变形后的AnimationSpeed= [ Hitshift*NeutralFrames/Delay]
            注:NeutralFrames等于该变形形态的NU动作的FramesPerDirection动画长度。
            这个特殊的系统使得我们在变形后如果拿慢速武器会导致AnimationSpeed比原本的更慢,而拿快速武器则可以使得AnimationSpeed加快。这也使得变型后的攻击速度没有了硬上限(但因为装备属性的局限性,攻击速度依然存在极限)。
            那么,野性狂暴的动画长度(攻击速度)的预先计算值将按照这样来计算:
            首先,从Monstats.txt中的Code一栏得到狼人的形态代码是40,然后从Weapons.txt的wclass和2handedwclass两栏中得到当前角色使用的武器类型代码,再从skills.txt的anim一栏中得到野性狂暴使用的动画类型是A1。
            根据以上数据,进入animdata.d2中查询相应的COF文件,得到NU动作的FramesPerDirection,A1动作的FramesPerDirection、AnimationSpeed以及FrameDataActionFlag数据。
            将以上数据带入公式中计算。
            我们可以发现,预先计算得到的野性狂暴的动作动画长度(攻击速度)和变形后的普通攻击一样。
            


            IP属地:湖北9楼2011-04-15 14:20
            回复
              变形攻速计算公式实例:
              以野蛮人戴6级狼人变化的狼嚎为例,手持不镶嵌任何东西的盗墓者。全身加速度Acceleration到达175上限。
              因此:WSM=10,WIAS=60
              从Weapons.txt查得盗墓者的底材【神秘之斧】的武器武器类型代码是STF。从animdata.d2查40NUHTH.COF得NeutralFrames=9;查40A1HTH.COF得野性狂暴的FramesPerDirection=13,FrameDataActionFlag =7;查BAA1STF得到野蛮人拿长柄武器的FramesPerDirection=19。
              计算:
              Delay = [256*人形的FramePerDirection /[(100 + WIAS - WSM)*人形的AnimationSpeed /100]] =12
              变形后的AnimationSpeed = [256*NeutralFrames/Delay] =192
              FPA={HitShift*(变形后的FramePerDirection) / [变形后的AnimationSpeed*(BaseRate+SpeedIncrease)/100]}-1 =9
              因此,这时野性狂暴的预先计算速度FPA=9F
              当野性狂暴攻击未命中时,则攻击动画按照预先计算值运行。
              


              IP属地:湖北11楼2011-04-15 14:21
              回复
                野性狂暴命中时帧数计数详解:
                现在我们来看看野性狂暴攻击命中时的情况:
                我们用帧数计数的细节解析来看看其运行的实际过程:
                Counter-rise value= [animation speed * Acceleration/100]=326
                Counter-end value= Hitshift*FramesPerDirection = 3328
                Counter-action value = Hitshift FramesDataActionFlag = 1792
                计数1(Tick1)
                计数值Counters增加336到达336
                计数值Counters=336<1792,攻击动画速率不变
                计数值Counters=336<3328,播放第1帧动画,计数继续
                计数2(Tick2)
                计数值Counters增加336到达672
                计数值Counters=672<1792,攻击动画速率不变
                计数值Counters=672<3328,播放第2帧动画,计数继续
                计数3(Tick3)
                计数值Counters增加336到达1008
                计数值Counters=1008<1792,攻击动画速率不变
                计数值Counters=1008<3328,播放第3帧动画,计数继续
                计数4(Tick4)
                计数值Counters增加336到达1344
                计数值Counters=1344<1792,攻击动画速率不变
                计数值Counters=1344<3328,播放第4帧动画,计数继续
                计数5(Tick5)
                计数值Counters增加336到达1680
                计数值Counters=1680<1792,攻击动画速率不变
                计数值Counters=1680<3328,播放第5帧动画,计数继续
                计数6(Tick6)
                计数值Counters增加336到达2016
                计数值Counters=2016>1792,此时攻击命中目标,攻击动画速率翻倍,即:计数值的增量加倍Counter-rise value=336*2=672
                计数值Counters=1956<3328,播放第6帧动画,计数继续
                ====================================================================================
                计数7(Tick7)
                计数值Counters增加672到达2688
                计数值Counters=2688<3328,播放第7帧动画,计数继续
                计数8(Tick8)
                计数值Counters增加672到达3360
                计数值Counters=3360>3328,攻击动画停止,计数结束
                因此,野性狂暴命中时,其攻击速度FPA=7F
                


                IP属地:湖北12楼2011-04-15 14:21
                回复
                  摸掉寒叔~


                  13楼2011-04-15 14:21
                  回复
                    野性狂暴计算公式推导:
                    现在,我们先来梳理一下前面的内容,总结一下野性狂暴的攻速运行原理。
                    结论:野性狂暴调用A1攻击动画,因此预先计算可得其攻速和变狼时的普通攻击一样。当实际使用野性狂暴时,动画首先按照预先计算的方式播放。当此次攻击命中时,野性狂暴的攻击动画的播放速度加倍,也就是说命中后剩余的时间缩短一半,最终实际攻击动画长度比普通攻击短;当此次攻击未命中时(包括因目标超过武器距离而未命中,因攻防判定而未命中,因被格挡而未命中等等),动作动画将继续按照预先计算运行,最终实际攻击动画长度和普通攻击一样。
                    公式推导:由此我们可以看到,在攻击判定帧ActionFrame之前,攻击动画的长度是固定的。而ActionFrame之后,动画长度会根据命中与否而产生变化。
                    所以我们先计算不变的部分:
                    FPA_1=ActionFrame={(Hitshift*变形后的FramesDataActionFlag)/[(变形后的AnimationSpeed*Acceleration/100)]}
                    这时候:   
                    剩余下的计数值Counter-rest value =Counter-end value-当前计数值= Hitshift*变形后的FramesPerDirection - [变形后的AnimationSpeed*Acceleration/100]*FPA_1
                    命中后计数值增量加倍,也就是AnimationSpeed加倍:
                    FPA_2 = { Counter-rest value /(2*[变形后的AnimationSpeed*Acceleration/100])} – 1
                    最终:
                    FPA=FPA_1+FPA_2
                    现在把之前计算 变形后的AnimationSpeed 和 加速度Acceleration 的公式带入总公式中:
                    Delay =[256*人形的FramePerDirection /[(100 +主手WIAS –主手WSM)*人形的AnimationSpeed /100]]=12
                    变形后的AnimationSpeed =[256*NeutralFrames/Delay]=192
                    加速度Acceleration=BaseRate+ SpeedIncrease
                    = BaseRate+主手有效WIAS-总体WSM+SIAS-冰冻效果-减速效果
                    =BaseRate+ [(120*主手WIAS)/(120+主手WIAS)] - 总体WSM+SIAS-冰冻效果-减速效果,175封顶
                    带入后得:
                    FPA_1={(256*7)/[([9*256/ [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果)/100)]}
                    FPA_2={(256*13 - [ [9*256/ [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果/100]*{(256*7)/[(AnimationSpeed*Acceleration/100)]} ={(256*7)/[([ 9*256/      [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+[(120*主手WIAS)/(120+主手WIAS)]-总体WSM+SIAS-冰冻效果-减速效果)/100)]})/(2*[ [9*256/      [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果/100])} – 1
                    FPA=FPA_1+FPA_2
                    ={(256*7)/[([9*256/ [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果)/100)]}   +   {(256*13 - [ [9*256/ [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果/100]*{(256*7)/[(AnimationSpeed*Acceleration/100)]} ={(256*7)/[([ 9*256/      [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果)/100)]})/(2*[ [9*256/      [256*人形FramePerDirection/[(100+主手WIAS-主手WSM)*256/100]]] *(100+ [(120*主手WIAS)/(120+主手WIAS)] -总体WSM+SIAS-冰冻效果-减速效果/100])} – 1
                                               公式推导完毕
                    


                    IP属地:湖北14楼2011-04-15 14:21
                    回复
                      蓦然轻插


                      IP属地:上海15楼2011-04-15 14:21
                      回复
                        野蛮狼攻速计算实例:
                        野蛮狼拿【格瑞斯华尔德的救赎】IN 4夏,这时使用野性狂暴攻速是3F还是4F?
                        答案是:都不对。此时使用野性狂暴攻击命中时攻速为3F,未命中时攻速为4F。此人物BUILD在实际游戏中,3F和4F总是间隔出现。
                        WIAS=120,WSM=-10,人形FPD=16
                        Acceleration= 175
                        计算得:
                        Delay = [256*人形的FramePerDirection /[(100 + WIAS - WSM)*人形的AnimationSpeed /100]] =6
                        变形后的AnimationSpeed = [256*NeutralFrames/Delay] =384
                        带入计算得:
                        挥空:
                        FPA={(256*变形后的FramePerDirection)/[(变形后的AnimationSpeed*Acceleration/100)]} -1=4F
                        命中:
                        FPA_1=ActionFrame={(256*变形后的FramesDataActionFlag)/[(变形后的AnimationSpeed*Acceleration/100)]}=3F
                        FPA_2={(256*13-[AnimationSpeed*Acceleration/100]*FPA_1)/(2*[AnimationSpeed*Acceleration/100])} – 1=0F
                        最终得到:
                        攻击未命中时:FPA=4F
                        攻击命中时:FPA= FPA_1+FPA_2= 3F+0F =3F
                        进一步地,我们可以计算出详细的IAS档位:119WIAS时,野性狂暴命中时可恰好达到3F
                        再向更普遍的情况扩展一下:
                        此时若双持另外一件武器,野性狂暴的攻速又会如何?
                        答案是:不变
                        计算过程这里不再赘述,请自行参看上面的公式推导
                        


                        IP属地:湖北16楼2011-04-15 14:22
                        回复

                          【野性狂暴】动作帧数解析-Feral Rage FPA Specific 全文完
                          感谢大家
                          轻寒 2011.4.15


                          IP属地:湖北17楼2011-04-15 14:22
                          回复
                            蓦然沙发~


                            IP属地:上海18楼2011-04-15 14:23
                            回复
                              回复:18楼
                              奈奈娇蛮了~


                              IP属地:湖北19楼2011-04-15 14:24
                              回复