FireAlpacaとは
fireAlpaca.comで配布されているフリーのペイントツールです。
レイヤーや手振れ補正、PSD形式対応、3Dパースも可能なスナップ等の多彩な機能備えています。
しかも Windows/Mac両対応 です。
ブラシスクリプトはLua
- プリセットで鉛筆やエアブラシなどが用意されていますが、Lua言語によるAPI操作で様々な描画ができるブラシスクリプトに対応しています。
- 拡張子は.bsです。
スクリプト標準関数
main関数
マウスポインタが移動するごとに、座標およびペンの情報を引数に呼び出されます。param関数(1-10)
param1~param10を宣言することでブラシコントロールでパラメタを10個まで指定できます。use_base関数
基点を使うための宣言です。Ngonでは図形の中心に使います。
自作スクリプトNgon
ブラシスクリプト作成講座は敷居が高いので、絶賛放置中のブログで公開しているNgonというスクリプトを解説したいと思います。
FireAlpacaは多機能なのですが、意外にも多角形を描画する機能が備わっていなかったので作成しました。
動作概要
- 基点(デフォルトでは画面の中心)とmain関数が呼び出された時のマウスポインタの位置で多角形の中心と各頂点までの距離を決定
- パラメタ(正n角形)を頂点の数とする
- ベジェ曲線の開始 (bs_bezier_begin)
- 頂点の数だけ以下ループ
- 三角関数を使って頂点の座標を算出
- 直線の辺を追加(bs_bezier_l)
- 辺を追加し終えたら描画(bs_fill)
ベジェ曲線の使い方(曲線の開始、辺の追加、描画)がポイントだと思います。
ブラシスクリプトにもベジェ曲線の代名詞、制御点付きの曲線が用意されています。
スクリプト概説
基点の使用と3つのパラメタを宣言
パラメタの3つ数字は下限、上限、初期値です。
下限、上限が0,1の場合チェックボックスになります。
function use_base()
return true
end
function param1()
return "正n角形", 3 , 8 , 3
end
function param2()
return "線の太さ", 1 , 20 , 3
end
function param3()
return "角度補正(×10度)", 0 , 12 , 0
end
main関数
if not firstDrawの部分は前回処理のマウスポインタと今回とが近すぎる場合の
不要な描画を抑止しています。
function main(x,y,p)
local size = bs_param2()
local r,g,b = bs_forebg(p)
if not firstDraw then
local distance = bs_distance( lastDrawX - x, lastDrawY - y )
if distance < size * 2 then
return 0
end
end
-- 基点が指定されていなければキャンバスの中心を基点にする
local bsx,bsy = bs_base()
if bsx == -1 then
bsx = bs_canvas_width() / 2
bsy = bs_canvas_height() / 2
end
とんがりを上向きにするか下向きにするかを決めています。
頂点が奇数の場合のみ意味があります。
-- ペンと基点の位置関係で頂点(開始点)を決定
local radOffset = 0
local dist = y - bsy
if dist < 0 then
dist = dist * -1
radOffset = 270
else
radOffset = 90
end
角度の補正もあったほうがいいかなと思ったのですがどうかな。
radOffset = radOffset + bs_param3() * 10
関数drawVertexを呼び出して辺を追加しbs_fillで描画します。
1回目(末尾false)がベジェの開始で、
2回目(末尾ture)がサブパスの追加です。ペンのサイズ分、頂点までの距離を縮めています。
こうすることで輪郭のみ(中抜き)の描画を実現しています。
今回のマウスポインタ座標を退避して終了。
drawVertex(bsx,bsy,dist,radOffset,false)
drawVertex(bsx,bsy,dist-size,radOffset,true)
bs_fill(r,g,b,255 * bs_opaque())
lastDrawX = x
lastDrawY = y
firstDraw = false
return 1
end
あぁ三角関数を学ばなかったゆえにここで苦労することになります。
cosでX座標、sinでY座標を算出しています。
i - 0って何だろう。
function drawVertex(bsx,bsy,dist,radOffset,isSub)
local px = 0
local py = 0
local vertex = bs_param1()
local rad = 360 / vertex
local nrad = 0
local px1,py1 = 0
for i = 1,vertex,1 do
nrad = (i - 0) * rad + radOffset
px = bsx + dist * math.cos(math.pi * nrad / 180)
py = bsy + dist * math.sin(math.pi * nrad / 180)
if i == 1 then
if isSub == false then
bs_bezier_begin(px,py)
else
bs_bezier_m(px,py)
end
px1 = px
py1 = py
else
bs_bezier_l(px,py)
end
end
bs_bezier_l(px1,py1)
return 1
end
lastDrawX = 0
lastDrawY = 0
firstDraw = true