【Aegisub】Bezier_Move之N次贝塞尔粒子曲线
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
