【Aegisub】粒子描邊特效、Vector_Move函數(shù)的使用

Vector_Move函數(shù):
function Vector_Move(s_time,e_time,afterimage_dur,x_blur,y_blur,accel,base_pos_x,base_pos_y,max_space,scale_x,scale_y,s,x_add) ?
if (j == 1) then?
t = 0?
pos_x = {}?
pos_y = {}?
if (afterimage_dur < 0 ) then?
afterimage_dur = 0?
end?
c_point_x = {}?
c_point_y = {}?
point = {}?
i = 1?
s:gsub("(%S+)", function(w) point[i] = w i = i + 1 end)?
dur = e_time-s_time?
i = 1?
m = 0?
max_x = -10000?
min_x = 10000?
max_y = -10000?
min_y = 10000?
scale_x = scale_x / 100?
scale_y = scale_y / 100?
while i <= #point do?
c_point_x = {}?
c_point_y = {}?
if point[i] == "m" then?
s_point_x = point[i+1]?
s_point_y = point[i+2]?
i = i + 3?
elseif point[i] == "b" then?
c_point_x[1] = s_point_x*scale_x?
c_point_y[1] = s_point_y*scale_y?
for k = 2, 4, 1 do?
c_point_x[k] = point[i+1+(k-2)*2]*scale_x
c_point_y[k] = point[i+2+(k-2)*2]*scale_y
end
max_x = math.max(max_x,_G.unpack(c_point_x))?
max_y = math.max(max_y,_G.unpack(c_point_y))?
min_x = math.min(min_x,_G.unpack(c_point_x))?
min_y = math.min(min_y,_G.unpack(c_point_y))?
c_point_x[1] = s_point_x*scale_x+base_pos_x
c_point_y[1] = s_point_y*scale_y+base_pos_y
for k = 2, 4, 1 do?
c_point_x[k] = point[i+1+(k-2)*2]*scale_x+base_pos_x
c_point_y[k] = point[i+2+(k-2)*2]*scale_y+base_pos_y
end
s_point_x = point[i+5]?
s_point_y = point[i+6]?
i = i + 7?
elseif point[i] == "l" then?
c_point_x[1] = s_point_x*scale_x?
c_point_y[1] = s_point_y*scale_y?
c_point_x[2] = point[i+1]*scale_x?
c_point_y[2] = point[i+2]*scale_y?
max_x = math.max(max_x,_G.unpack(c_point_x))?
max_y = math.max(max_y,_G.unpack(c_point_y))?
min_x = math.min(min_x,_G.unpack(c_point_x))?
min_y = math.min(min_y,_G.unpack(c_point_y))?
c_point_x[1] = s_point_x*scale_x+base_pos_x?
c_point_y[1] = s_point_y*scale_y+base_pos_y?
c_point_x[2] = point[i+1]*scale_x+base_pos_x?
c_point_y[2] = point[i+2]*scale_y+base_pos_y?
s_point_x = point[i+1]
s_point_y = point[i+2]?
i = i + 3
else _G.aegisub.debug.out("Unknown drawing command. You can use only \"m\" , \"b\" , \"l\"^^;")?
i = #point+1?
end?
c_t = 0 n = #c_point_x?
if n ~= 0 then ?
while c_t <= 1 do?
m = m + 1 ?
pos_x[m], pos_y[m] = Bezier(n,c_point_x,c_point_y,c_t) ? n_x, n_y = Bezier(n,c_point_x,c_point_y,c_t+0.1)?
dist = math.sqrt(math.abs(n_x-pos_x[m])^2+math.abs(n_y-pos_y[m])^2)?
c_t = c_t + max_space/dist*0.1?
end?
end?
end?
maxloop(m)?
end?
retime("presyl",s_time+dur*(t^accel),s_time+dur*((t+1/m)^accel)+afterimage_dur)?
t = t + 1/m?
adjust_x = -(max_x - min_x) / 2 - min_x?
adjust_y = -(max_y - min_y) / 2 - min_y ?
return ?string.format("\\move(%0.1f,%0.1f,%0.1f,%0.1f,%0.1f,%0.1f)",pos_x[j]+x_add,pos_y[j],pos_x[j]+x_blur+x_add,pos_y[j]+y_blur,0,afterimage_dur)
end
矢量移動函數(shù)的參數(shù)說明:
Vector_Move(s_time,e_time,afterimage_dur,x_blur,y_blur,accel,base_pos_x,base_pos_y,max_space,scale_x,scale_y,s,x_add)
s_time決定第一個粒子的開始時間、結(jié)束時間(其它粒子也會相應(yīng)地變化)
e_time決定最后一個粒子的開始時間、結(jié)束時間(其它粒子也會相應(yīng)地變化)
s_time與e_time不限正負(fù),而且不用保證e_time-s_time>0
舉例1:比如s_time填500、e_time填0,那么第一個粒子的開始時間就延后500ms,而最后一個粒子開始時間不變,剩下的其它粒子平分這中間的時間。由于每個粒子的位置不一樣,所以此時的移動效果看起來就是“反向”的。?
?
舉例2:比如s_time填0、e_time填500,就有第一個粒子的開始時間不變,最后一個粒子開始時間延后500ms,剩下的其它粒子平分這中間的時間,這時粒子的移動效果看起來就是“正向”的,和第一個例子相反
舉例3:比如s_time填-500、e_time填-2000,就是第一個粒子的開始時間提前500ms,最后一個粒子開始時間提前2000ms,剩下的其它粒子平分這中間的時間,這時由于最后一個粒子的開始時間比第一個粒子開始時間早,所以移動效果看起來就是“反向”的
舉例4:若是s_time填0、e_time填0,就是第一個粒子的開始時間不變,最后一個粒子開始時間不變,即現(xiàn)在每一個粒子的開始時間都一樣,此時看起來的效果就是粒子不移動,即沒有矢量移動的效果,粒子只靜止構(gòu)成圖形而已(當(dāng)然如果x_blur或y_blur不為0,粒子就會有周邊擴散或整體平移效果,但這個不是“描邊”移動效果)
afterimage_dur為單個粒子它本身的持續(xù)時間
x_blur直接等于x方向位移大小 用于造成粒子隨機擴散效果
y_blur直接等于y方向位移大小 用于造成粒子隨機擴散效果
accel 加速度參數(shù)
關(guān)于base_pos_x和base_pos_y這兩個參數(shù):
這兩個參數(shù)將原始繪圖的(0,0)點定位在(base_pos_x+x_add,base_pos_y)
所以這兩個參數(shù)決定了粒子描邊移動的起點
max_space生成的兩個相鄰粒子間的最大距離 max_space越大就是粒子間距離越大即此時粒子越少
scale_x表示對原始矢量繪圖x軸的縮放處理
scale_y表示對原始矢量繪圖y軸的縮放處理
比如你想做一個心形的描邊特效,scale_x和scale_y都設(shè)為100,則粒子移動的軌跡就是原本心形的邊框。如果你scale_x和scale_y都設(shè)為200,那么就相當(dāng)于矢量繪圖放大了4倍,所以粒子移動的軌跡是4倍心形繪圖的邊框
s你想要描邊(粒子移動)的矢量繪圖(字符串)
s這一項說明:這里要填的是繪圖代碼。比如不能填m -3 0 b -3 4 3 4 3 0 b 3 -4 -3 -4 -3 0,而是要填"m -3 0 b -3 4 3 4 3 0 b 3 -4 -3 -4 -3 0"才行,當(dāng)然你也可以先在code行定義xxx="m -3 0 b -3 4 3 4 3 0 b 3 -4 -3 -4 -3 0"然后在這項參數(shù)這里直接填xxx這種也是可以的
x_add表示在base_pos_x設(shè)定的粒子x坐標(biāo)上,再在x坐標(biāo)上加x_add,即在base_pos_x基礎(chǔ)上,粒子在x方向上平移x_add
一般來說,x_add這一項填0,但是如果你想要描一個移動圖形的邊,就會用x_add了,因為它能做出一邊描邊一邊移動的效果,當(dāng)然這樣的話x_add也不能填一個定值,而是一個會變化的值,比如(j-1)/maxj*$lwidth等等
另外,返回的move標(biāo)簽中,%0.1f那一部分表示保留小數(shù)點后一位
使用該函數(shù)必須的輔助函數(shù):
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 ? ? ? ? ? ? ? ?這些直接復(fù)制行?
更詳細(xì)的說明參考視頻AV74819601