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

【Aegisub】bezier_move之三次粒子曲线移动

2019-11-02 15:59 作者:多华宫与火火里  | 我要投稿

bezier_move函数的定义:


function bezier_move(x1,y1,x2,y2,x3,y3,x4,y4,t1,t2,accel,afterimage_blur,afterimage_dur,density) 

if density == 0 or density == nil then 

           density = 1 

      end 

if afterimage_blur == 0 or afterimage_blur == nil then 

          x_blur = 0 y_blur = 0 

      else

          x_blur = math.random(-afterimage_blur,afterimage_blur)/3 

          y_blur = math.random(afterimage_blur) 

       end 

if afterimage_dur == nil or afterimage_dur < frame_dur then 

         afterimage_dur = frame_dur 

        end  

if accel == nil then 

        accel = 1 

         end 

x_pos = {} y_pos = {} 

dur = t2 - t1 

frames = math.floor(dur/(frame_dur/density)) 

x_pos[j] =  (1-(j/frames)^accel)^3 * x1 + 3*(1-(j/frames)^accel)^2 * ((j/frames)^accel) * x2 + 3*(1-(j/frames)^accel) * ((j/frames)^accel)^2 * x3 + ((j/frames)^accel)^3 * x4  y_pos[j] = (1-(j/frames)^accel)^3 * y1 + 3*(1-(j/frames)^accel)^2 * ((j/frames)^accel) * y2 + 3*(1-(j/frames)^accel) * ((j/frames)^accel)^2 * y3 + ((j/frames)^accel)^3 * y4  

if j == 1 then 

         maxloop(frames) 

      end 

  retime("presyl",t1+(j-1)*(frame_dur/density),t1+j*(frame_dur/density)+afterimage_dur) 

        return    string.format("\\move(%d,%d,%d,%d)",x_pos[j],y_pos[j],x_pos[j] + x_blur ,y_pos[j] + y_blur) 

end

函数的参数相关说明

bezier_move(x1,y1,x2,y2,x3,y3,x4,y4,t1,t2,accel,afterimage_blur,afterimage_dur,density)


一共有四个控制点,所以形状是三次bezier曲线


t1提前第一个粒子的开始、结束时间(其它粒子也会提前),必须要填负数或0


t2延后最后一个粒子的开始、结束时间(其它粒子也会延后),必须要填正数或0


t1和t2共同决定了整个“曲线”的持续时间(因为是一个个粒子构成的曲线,而粒子的持续时间和曲线的持续时间并不是同一个概念,所以不要当成一回事)


accel为加速度


afterimage_blur为这一个粒子的位移参数


afterimage_dur决定单个粒子的持续时间(即这一个粒子它自己持续的时间)


density为总的粒子密度、浓度


在frames = math.floor(dur/(frame_dur/density))中,density作为自己设定的变量,它就决定了frames的值,而由maxloop(frames)可知循环次数为frames次,所以density越大就有frames越大就有粒子看起来越密集


【Aegisub】bezier_move之三次粒子曲线移动的评论 (共 条)

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