位置:gimppaintcore.c,gimp_paint_core_smooth_coords()
把目前游標位置跟過去的點平均,算出要把筆刷點上去的位置。
有Quality和Weight兩個參數,初次看到應該會不知道該調哪一個。
簡單用法:
Weight固定在500,只調Quality控制強度,要設多少就畫畫看感覺一下。
詳細:
Weight是常態分布的標準差,代入常態分布的公式決定各點的權重。
Quality代表取幾個過去的點做計算。
計算式大致是
(第1個點*權重1 + 第2個點*權重2 + …… + 第n個點*權重n) / 權重的總合
n=Quality
Weight小的話權重遞減得很快,幾乎由前面的點決定,Weight越大會越平均。
雖然MyPaint也有手抖修正,但是GIMP的MyPaint筆刷也會套用GIMP本身的手抖修正,所以我都直接調GIMP的,沒有用MyPaint的。
位置:gimpdynamicsoutput.c,gimp_dynamics_output_get_linear_value()
先求平均值再用乘法計算
上面1是工具選項,2,3是筆刷動態編輯器。
看圖2,Opacity(不透明度)有壓力、速度、漸變(Fade)三個因素影響,Fade是跟圖1裡的Fade Options有關。
然後再看圖3有壓力、速度、漸變的曲線,橫軸是影響因素的原值,縱軸是輸出,求出三個0~1的倍率,算三個倍率的平均。
圖1的不透明度基本值是70,把70乘以平均倍率就是實際的不透明度。
是把基本值乘上0~1之間的數,所以最終結果會在0~基本值之間。
位置:gimpairbrush.c,gimp_airbrush_paint()
筆刷間隔在gimpbrushcore.c,gimp_brush_core_interpolate()
有三個特有參數:Rate、Flow、Motion only,特徵是時間也會影響它的表現。如果點滑鼠或筆按下去之後不動游標,也會慢慢畫東西上去,間隔時間由Rate控制,其他筆刷要游標有移動才會畫出東西。
筆刷工具的基本是,筆刷形狀是一張記憶體裡的點陣圖,游標每移動一段距離就把點陣圖貼到畫布上,貼的時候套用混色模式。
噴槍有兩個條件會觸發這個動作
1.游標移動一段距離,跟其他筆刷相同。
2.經過一段時間沒有觸發1,因為完全沒移動或移動距離不夠。如果觸發了1會重新計時。
1的「一段距離」,筆刷參數的Spacing代表筆刷直徑的幾倍,單位%,即px數是Size*Spacing/100,設成100就會看到筆觸剛好一個挨著一個。
有動態的話變成「2*(1-Spacint動態) + Spacing*Spacint動態」,筆刷動態是0.0~1.0的數字,完全沒開動態就是1,算法見上面的筆刷動態。
簡單說就是
動態=0 → 200%
動態=1 → Spacing
中間的值內插算出
Spacing>200則完全固定在Spacing,不受動態影響。
2的timeout是「10秒/(Rate*Rate動態)」,即Rate=每10秒筆觸數,Rate=0則不觸發2。
Flow的話,如果把不透明度範圍定在0~1,噴槍不透明度算法是「(Flow/100)*Flow動態*(Opacity/100)*Opacity動態」,簡單講是Flow*Opacity,其他筆刷只有「(Opacity/100)*Opacity動態」。(不太懂為何要把不透明度分成兩個數值)
如果Motion only開啟則不觸發2的條件,Rate沒作用,變成追加Flow參數的普通筆刷。
附帶一提MyPaint是用「每秒筆觸數」做出噴槍工具,不同的是游標完全不動不會畫出東西,有微小的移動才有反應。
位置:gimpsmudge.c,gimp_smudge_motion(),以及gimp-gegl-loops.c,gimp_gegl_smudge_blend()
跟噴槍一樣有Rate參數但意義不一樣。
如下圖,每做一次「把筆刷點上去」就跑一輪詳細裡的步驟。
記憶體裡有accum buffer和paint buffer兩個點陣圖,accum buffer初始會從畫布上複製一塊區域,然後每跑一輪更新一次。
rate是個比例,會先經過筆刷動態計算再用在這裡,越大則塗抹效果越強。
位置:mypaint-brush.c,prepare_and_draw_dab(),此函式是主要的筆刷動態計算。
不是直接設定幾px,而是「e的x次方」,e是自然對數的底,2.71828……。
小於0也不會變成負數,而是0~1 (因此這個值可以設成負數)
如果設為0,半徑是e^0=1px
0.7 → 2px
1.0 → 2.71828……px
2.3 → 10px
3.0 → 20px
MyPaint有不少參數是用指數計算,像下面提到的塗抹半徑也是。
用過MyPaint筆刷以後發現用指數有它的好處,用小筆刷的時候調整半徑需要1px增減,但畫大區域的時候想要一次3~10px增減,指數有數字越大一次增減越多的特性。
GIMP原有的筆刷按快速鍵都是一次加1px,畫大區域的時候比較麻煩。找了一下發現GIMP也有increase-percent和decrease-percent的快速鍵,不過按一次就是變成兩倍,而且變化量還不能改,沒辦法用。
位置:mypaint-mapping.c,mypaint_mapping_calculate()
跟GIMP不同,用加法計算。
根據曲線圖求出變化量,可能是正或負,再把變化量跟基礎值相加。
如果壓力是0.35,如上圖變化量大約是-0.62,這一階段就是1.00-0.62=0.38。
繼續把精細速度、粗略速度、隨機……算出的變化量加上去,就是實際用的值。
位置:mypaint-brush.c,prepare_and_draw_dab()
跟GIMP的塗抹不同,類似其他軟體的水彩工具。
採取畫布顏色時會計算平均,像把顏料溶解的效果,且多了塗上筆刷顏色的能力。
用3個參數控制:塗抹(smudge)、塗抹長度(smudge length)、塗抹半徑(smudge radius)
暫存顏色和混合色只是一個RGBA值,不用記錄點陣圖buffer。
塗抹半徑也是e為底的指數,如果值是x,則採取半徑是「目前筆刷半徑*e^x」
塗抹長度實際上不是長度而是混合比例,跟GIMP塗抹的rate類似。
塗抹是與筆刷顏色的混合比例。
活動與參展 (0)
└活動與參展資訊 (1)
└活動與製作後記 (11)
└販售會遊戲團調查 (14)
遊戲團隊「電子妖精實驗室」 (0)
└重要消息 (4)
└Cyber Sprite遊戲秘密 (2)
└製作進度 (26)
創作 (0)
└繪圖 (24)
└程式 (48)
└故事、劇本 (3)