Skip to content

相关计算 ​

规范的判定线事件列表应该满足以下条件:

  • 按照事件的 startTime 从小到大排序。

  • 对于速度事件列表,第一个事件的 startTime 为0。

  • 对于其它事件列表,第一个事件的 startTime 为一个足够小的数,如-999999。

  • 紧接着,每个事件的 startTime 应该与上一个事件的 endTime 相等。

  • 最后一个事件的 endTime 为一个足够大的数,如1000000000。

满足条件后,我们才能正确进行下面的计算。

速度事件的 floorPosition ​

速度事件的 floorPosition 表示事件开始时刻的垂直位置,单位 Y。

  • 设第 k 个事件的 startTime 为 tk,value 为 vk,floorPosition 为 pk,则有:

    p1=t11.875BPM=0, pk=pk−1+vk−1(tk−tk−1)1.875BPM, k≥2

判定线的实时参数 ​

判定线的实时速度和垂直位置可以通过以下方法计算:

  • 设第 k 个事件的 startTime 为 tk,value 为 vk,floorPosition 为 pk,则有:

    VJ(t)=vk, PJ(t)=pk+vk(t−tk)1.875BPM, tk≤t<tk+1

    VJ(t) 表示判定线在时刻 t 的速度,单位 Y/s。

    PJ(t) 表示判定线在时刻 t 的垂直位置,单位 Y。

判定线的其它参数(不透明度、X/Y 坐标、旋转角度)计算较为简单,仅需进行线性插值:

  • 设第 k 个事件的 startTime 为 tk,start 为 sk,end 为 ek,则有:

    SJ(t)=sk+(t−tk)ek−sktk+1−tk, tk≤t<tk+1

    SJ(t) 表示判定线在时刻 t 的参数,单位与 sk 和 ek 相同。

音符的实时参数 ​

音符的实时参数可以通过以下方法计算:

  • 设音符的 floorPosition 为 pN,判定线在时刻 t 的垂直位置为 PJ(t),则有:

    PN(t)=pN−PJ(t)

    PN(t) 表示音符在时刻 t 的currentFloorPosition,单位 Y。

  • 设音符的 time 为 tN,令 t=tN,则有:

    PN(tN)=pN−PJ(tN)

    音符在判定时刻应该与判定线重合,即

    PN(tN)=0⟺pN=PJ(tN)

    由此可知,音符的 floorPosition 应该与其所在判定线在时刻 tN 的垂直位置相等,确保在判定时刻恰好与判定线重合。

  • 设音符的 holdTime 为 tH,speed 为 η,然后有:

    TIP

    对音符垂直距离的计算,视乎音符类型而有所不同。

    非 Hold 音符:

    Y(t)=η⋅PN(t)=η(pN−PJ(t))

    Hold 音符头部,t≤tN:

    Y(t)=PN(t)=pN−PJ(t)

    Hold 音符尾部,t≤tN:

    YT(t)=Y(t)+η⋅tH1.875BPM=pN−PJ(t)+η⋅tH1.875BPM=PJ(tN)−PJ(t)+η⋅tH1.875BPM⟺pN=PJ(tN)

    Hold 音符尾部,tN<t≤tN+tH:

    YT(t)=tN+tH−ttHYT(tN)=η⋅(tN+tH−t)1.875BPM⟺pN=PJ(tN)

    Y(t) 表示音符在时刻 t 的垂直距离,单位 Y。

    联立上述二式取极限,解得:

    η=limt→tNPJ(tN)−PJ(t)(tN−t)1.875BPM=VJ(tN)

    由此可知,Hold 音符的 speed 应该与其所在判定线在时刻 tN 的速度相等,确保打击时 Hold 尾速度与打击前相同。

CC-BY-NC-4.0 Licensed