FireAlpaca用ブラシスクリプト「ハニカムブラシ」を改良しました
目標通りハニカムブラシ HcS_a08.bsとHcS_a09.bs を統合してHcS-b06.bs として完成しました。統合に加え、機能も強化しています。
※ ブラシ幅が大きいほど描画は遅くなります。
ブラシのDownloadは記事下部のリンク先より行ってください。
新機能
粒子垂直回転
粒子回転角
- 今ある粒子描画中心座標を起点に粒子を回転させるためのパラメータ。
x方向シフト,y方向シフト
- 格子の起点となる原点を仮想的にシフトさせるためのパラメータ。
スクリプト
function default_size()
return 150 , 1
endfunction param1()
return "筆圧透明度", 0, 1, 1
endfunction param2()
return "大きさ", 10, 100, 95
endfunction param3()
return "粒子垂直回転" , 0 , 1 , 0
endfunction param4()
return "粒子回転角" , 0 , 60 , 0
endfunction param5()
return "x方向シフト" , 0 , 100 , 0
endfunction param6()
return "y方向シフト" , 0 , 100 , 12
end
function po( x0 , y0 , d , rs )
P = math.pi
return x0 + math.cos( d * P /180 ) * rs , y0 + math.sin( d * P /180 ) * rs
endfunction rotate( x0 , y0 , ax , ay )
AD = ( ax - x0 )
BD = ( ay - y0 )
r3 = math.sqrt(3)
return AD * 0.5 - BD * 0.5 * r3 + x0 , AD * 0.5 * r3 + BD * 0.5 + y0
end
function main( x, y, p )
local w = bs_width_max()
local wh = w * 0.5 * math.sqrt(3)
local k = 0
local d = 0
local x0 , y0 = -1001 , -1001
if bs_param3() == 0 then
d = 30
y0 = ( ( math.floor( y / ( 0.75 * w ) ) + 0.5 ) * 0.75 + bs_param6() * 0.01 ) * w
if math.floor( y / ( 0.75 * w ) ) % 2 == 0 then
k = 0.5
end
x0 = ( ( math.floor( x / wh ) + k ) + bs_param5() * 0.01 )* wh
else
d = 0
x0 = ( ( math.floor( x / ( 0.75 * w ) ) + 0.5 ) * 0.75 + bs_param5() * 0.01 ) * w
if math.floor( x / ( 0.75 * w ) ) % 2 == 0 then
k = 0.5
end
y0 = ( ( math.floor( y / wh ) + k ) + bs_param6() * 0.01 ) * wh
end
local rs = w * bs_param2() * 0.01 * 0.5
local r , g , b = bs_fore()
local a = 255 * bs_opaque()
if bs_param1() == 1 then
a = p * a
end
local ax , ay = po( x0 , y0 , d + bs_param4() , rs )
bs_polygon( ax , ay )
for i = 1 , 5 do
ax , ay = rotate( x0 , y0 , ax , ay )
bs_polygon( ax , ay )
end
bs_fill( r , g , b , a )
return 1
endbs_setmode( 1 )
スクリプト解説
頂点計算の書き換え
function po()のような複雑な関数を何度も使っていては計算に時間が掛かってしようがない。今回、幸いにも粒子描画の中心座標と、この座標を始点として1度目に求めた頂点と次に知りたいと隣の頂点を終点とする2つのベクトルのなす角が60であるとわかっているので、粒子描画の中心座標( x0 , y0 )を回転の中心として先に求めた頂点( ax , ay )を60°移して得られる頂点の座標を戻り値とする下のような関数を用いて2~6個目までの頂点を求めるという作業をforループの中で行っている。
function rotate( x0 , y0 , ax , ay )
AD = ( ax - x0 )
BD = ( ay - y0 )
r3 = math.sqrt(3)
return AD * 0.5 - BD * 0.5 * r3 + x0 , AD * 0.5 * r3 + BD * 0.5 + y0
end
Download
Downloadは以下のリンク先から行ってください。