【Aegisub】bezier_move之三次粒子曲線移動(dòng)

bezier_move函數(shù)的定義:
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
函數(shù)的參數(shù)相關(guān)說明
bezier_move(x1,y1,x2,y2,x3,y3,x4,y4,t1,t2,accel,afterimage_blur,afterimage_dur,density)
一共有四個(gè)控制點(diǎn),所以形狀是三次bezier曲線
t1提前第一個(gè)粒子的開始、結(jié)束時(shí)間(其它粒子也會(huì)提前),必須要填負(fù)數(shù)或0
t2延后最后一個(gè)粒子的開始、結(jié)束時(shí)間(其它粒子也會(huì)延后),必須要填正數(shù)或0
t1和t2共同決定了整個(gè)“曲線”的持續(xù)時(shí)間(因?yàn)槭且粋€(gè)個(gè)粒子構(gòu)成的曲線,而粒子的持續(xù)時(shí)間和曲線的持續(xù)時(shí)間并不是同一個(gè)概念,所以不要當(dāng)成一回事)
accel為加速度
afterimage_blur為這一個(gè)粒子的位移參數(shù)
afterimage_dur決定單個(gè)粒子的持續(xù)時(shí)間(即這一個(gè)粒子它自己持續(xù)的時(shí)間)
density為總的粒子密度、濃度
在frames = math.floor(dur/(frame_dur/density))中,density作為自己設(shè)定的變量,它就決定了frames的值,而由maxloop(frames)可知循環(huán)次數(shù)為frames次,所以density越大就有frames越大就有粒子看起來越密集