FireAlpaca用ブラシスクリプト「ハニカムブラシ」を改良しました

目標通りハニカムブラシ HcS_a08.bsとHcS_a09.bs を統合してHcS-b06.bs として完成しました。統合に加え、機能も強化しています。

※ ブラシ幅が大きいほど描画は遅くなります。

ブラシのDownloadは記事下部のリンク先より行ってください。

f:id:Inari777:20150410155218p:plain

 新機能

粒子垂直回転

  • HcS_a08.bsで描けたようなハニカム構造から、HcS_a09.bsで描けたようなハニカム行動の描画を切り替えるためのパラメータ。
  • 格子の並びの縦と横を切り替えている。

粒子回転角

  • 今ある粒子描画中心座標を起点に粒子を回転させるためのパラメータ。

x方向シフト,y方向シフト

  • 格子の起点となる原点を仮想的にシフトさせるためのパラメータ。

スクリプト

function default_size()
 return 150 , 1
end

function param1()
 return "筆圧透明度", 0, 1, 1
end

function param2()
 return "大きさ", 10, 100, 95
end

function param3()
 return "粒子垂直回転" , 0 , 1 , 0
end

function param4()
 return "粒子回転角" , 0 , 60 , 0
end

function param5()
 return "x方向シフト" , 0 , 100 , 0
end

function 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
end

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

 

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
end

bs_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は以下のリンク先から行ってください。

HcS_b06.bs