欢迎光临散文网 会员登陆 & 注册

【Aegisub】Bezier_Move之N次贝塞尔粒子曲线

2019-11-07 10:41 作者:多华宫与火火里  | 我要投稿

Bezier_Move函数的定义:

function Bezier_Move(s_time,e_time,aftimg_dur,x_blur,y_blur,accel,max_space,...) 

           a = {...} 

        if j == 1 then 

          t1 = s_time 

          t2 = e_time 

          dur = t2-t1 

           n = #a/2 

        for i = 1,n*2-1,2 do 

          x[(i+1)/2] = a[i] 

        end 

       for i = 2, n*2,2 do 

           y[i/2] = a[i] 

            end 

          c_t = 0 

          maxloop(2) 

          f_t = 1/(dur/frame_dur) 

        end 

          afterimage_dur = aftimg_dur 

       if (afterimage_dur < 0 ) then 

             afterimage_dur = 0 

         end 

            pos_x, pos_y = Bezier(n,x,y,c_t) 

            n_t = c_t + f_t 

            n_x, n_y = Bezier(n,x,y,n_t) 

           dist = math.sqrt(math.abs(n_x-pos_x)^2+math.abs(n_y-pos_y)^2) 

            a_t =f_t*(max_space/dist) 

       if (a_t > f_t) then 

            a_t = f_t 

         end 

           n_t = c_t + a_t 

       if (n_t < 1) then 

             maxj = j + 1 

         end 

     retime("presyl",t1+dur*(c_t^accel),t1+dur*(n_t^accel)+afterimage_dur) 

           t = c_t 

           c_t = n_t 

         return string.format("\\move(%f,%f,%f,%f,%f,%f)",pos_x,pos_y,pos_x+x_blur,pos_y+y_blur,0,dur-dur*t+afterimage_dur) 

 end; 

            x = {} y = {}

Bezier_Move函数的参数说明:

Bezier_Move(s_time,e_time,aftimg_dur,x_blur,y_blur,accel,max_space,...) 


max_space生成的两个相邻粒子间的最大距离 距离越大则粒子越少,即max_space越大粒子的浓度就越稀


...表示可以自定义有几个控制点,也就是理论上来说,你能画出n次的贝塞尔曲线,不仅仅是三次的


s_time决定第一个粒子的开始时间、结束时间(其它粒子也会相应地变化)


e_time决定最后一个粒子的开始时间、结束时间(其它粒子也会相应地变化)


s_time与e_time都不限正负,但是,必须保证e_time-s_time>0

使用该函数必须的辅助函数:

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code,function set_temp(ref,val) temp[ref] = val; return val; end temp = {}

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code,function factk(n) k = 1 if (n > 1) then for i = 2, n, 1 do k = k * i end end return k end

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code,function bernstein(i,n,t) return (factk(n) / (factk(i)*factk(n-i))) * (t^i) * ((1-t)^(n-i)) end

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code,function Bezier(n,x,y,t) p_x = 0 p_y = 0 for i = 1, n, 1 do p_y = p_y + y[i] * set_temp("bern",bernstein(i-1,n-1,t)) p_x = p_x + x[i] * temp.bern  end return p_x, p_y end

这些直接复制行

更详细的说明参考视频AV74818506




【Aegisub】Bezier_Move之N次贝塞尔粒子曲线的评论 (共 条)

分享到微博请遵守国家法律