LoginSignup
2
0

More than 5 years have passed since last update.

FireAlpaca用ブラシスクリプトNgon概説

Last updated at Posted at 2019-04-21

FireAlpacaとは

fireAlpaca.comで配布されているフリーのペイントツールです。
レイヤーや手振れ補正、PSD形式対応、3Dパースも可能なスナップ等の多彩な機能備えています。
しかも Windows/Mac両対応 です。

ブラシスクリプトはLua

  • プリセットで鉛筆やエアブラシなどが用意されていますが、Lua言語によるAPI操作で様々な描画ができるブラシスクリプトに対応しています。
  • 拡張子は.bsです。

スクリプト標準関数

  • main関数
    マウスポインタが移動するごとに、座標およびペンの情報を引数に呼び出されます。

  • param関数(1-10)
    param1~param10を宣言することでブラシコントロールでパラメタを10個まで指定できます。

  • use_base関数
    基点を使うための宣言です。Ngonでは図形の中心に使います。

自作スクリプトNgon

ブラシスクリプト作成講座は敷居が高いので、絶賛放置中のブログで公開しているNgonというスクリプトを解説したいと思います。
FireAlpacaは多機能なのですが、意外にも多角形を描画する機能が備わっていなかったので作成しました。
Ngon.jpg

動作概要

  • 基点(デフォルトでは画面の中心)と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

参考

ブラシスクリプト仕様書

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0