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

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越大就有粒子看起来越密集