プチコン3号用 簡易毛筆 for 3DS(BIG対応)

最終更新日 2017年1月2日
初出公開日 2016年12月31日
【3DS両対応】【BIG動作可】 プチコン3号、BIG両方で動作可能です

 これはプチコン3号で毛筆のようなタッチで書く(描く)ことができるお絵かきソフトです。すでにプチコン3号ではQSPで入り抜き対応の「簡易毛筆QSP」を公開していますが、こちらはそれに加えてにじみやかすれも擬似的に再現しています。現時点ではプチコン3号用としては最もリアルな毛筆ソフトだと思います。
 プチコンBIGでも動作は可能ですが、プチコンBIGには専用の「簡易毛筆 for U」を用意しているのでそちらを使用してみてください。

《 メニュー 》



実行画面スクリーンショット







超極太による作例


超々極太による作例



プログラムリスト、公開キー



《 プログラムリスト 》
ACLS:FN$="GRP1:OCHA_FUDE"
XSCREEN 2
DISPLAY 1
IF CHKFILE(FN$) THEN LOAD FN$,0 ELSE GCLS #WHITE
IF BUTTON() AND #B THEN FL=1:BEEP 70:WAIT
DB=8-FL*4:DC=#BLACK

WHILE 1
 PX=TX:PY=TY
 TOUCH OUT TT,TX,TY
 DX=TX-PX:DY=TY-PY
 B=BUTTON()
 B2=BUTTON(2)
 BB=B2 AND 63
 IF BB THEN DB=BB
 R=MIN(TT,30-FL*20)/(SQR(DX*DX+DY*DY)+FL*12+4)*(DB+1)*(FL*2+.25)
 BL=B AND #L
 COL=!BL*DC-!!BL
 IF TT>1 THEN
  GFLINE PX,PY,TX,TY,R,COL
  ELSEIF B==B2 && B2==#L THEN DB=0
 ENDIF
 IF B AND #L THEN
  IF B AND #R THEN GCLS #WHITE
  IF B AND #X THEN SAVE FN$
  IF B AND #Y THEN LOAD FN$,0
 ENDIF
 VSYNC
WEND

DEF GFLINE X1,Y1,X2,Y2,R,C
 VAR A,B,I,J,M,X,Y
 VAR O=R*R*2+2,P=.5/PI(),Q=2/R
 M=MAX(ABS(X2-X1),ABS(Y2-Y1))
 FOR I=1 TO M STEP R/2
  X=X1+(X2-X1)/M*I
  Y=Y1+(Y2-Y1)/M*I
  FOR J=1 TO O
   A=RNDF()/P
   B=Q/(RNDF()+RNDF())
   GPSET X+COS(A)/B,Y+SIN(A)/B,C
  NEXT
 NEXT
END

ver.1.1.0 公開キー【 MKX3XJZY 】、ファイル名「OCHA_FUDE_110B


使用方法



 十字ボタンやA、Bボタンで筆の太さを7段階に選択可能です。

ボタン
太さ
適した文字数
Rボタンのみ
極細筆
60文字以上
ボタン
細筆
24〜60文字程度
ボタン
中筆
8〜24文字程度
ボタン
太筆
3〜8文字程度
ボタン
極太筆
1〜3文字程度
Aボタン
超極太筆
1〜2文字程度
Bボタン
超々極太筆
1文字程度

 筆の太さは「簡易毛筆QSP」とは異なり、押した瞬間に決まるため書いている間押し続けなくても良いです。適した文字数はあくまで目安です。「4文字書きたい」という場合には「太筆」で書くとちょうどいい感じの太さに収まるというだけであってダイナミックに書きたい場合はさらにワンランク上の太さである「極太筆」を選択しても問題ありません。
 Aボタン、Bボタンの超極太筆はダイナミックなデカ文字を書くのに使ってください。

《 筆の太さの目安 》


 筆の太さは書いている途中で自由に変えられるため気にする必要はありません。
 Lボタンを押している間は墨汁からホワイトインクに代わり書いた文字を消すことが可能です。毛筆なのでアンドゥはありません。

 セーブはLボタン+Xボタン、ロードはLボタン+Yボタン、全消しはLボタン+Rボタンです。
 なお、セーブは "GRP1:OCHA_FUDE" というファイルを上書き保存していきます。ロードはそのファイルをロードしていきます。したがって、「名前を付けて保存」という機能はありません。

 入り抜きに対応しているのですが、これは筆を動かす速度で実現しています。同じ筆でも速く動かすと細くなり、ゆっくり動かすと太くなります。一定以上遅い場合は玉状になりますが、これも筆っぽさを強調していると思います。
 したがって、はねやはらいはサッと素早く筆を動かす必要があり、慣れるまでは少し難しいかもしれません。
 また、速く動かすと線がかすれるようになります。細い筆でも線がかすれるため太い筆で書くのと同じくじっくり書いてください。

《 にじみとかすれについて 》


 基本的に毛筆で文字を書くイメージで書いてもらえれば良いのですが、慣れないとペンや鉛筆で書くように書く人もいることでしょう。そういう人のためにイージーモードを用意しました。イージーモードはBボタンを押しながら起動すれば良いです。
 イージーモードは「はね」や「はらい」が出来にくくなる反面で鉛筆で書くような速さで書いても極端に線が細くなったりせずに無難な感じの線で書くことが可能になります。

《 イージーモードと通常モードの違い 》


 イージーモードはあくまでビギナー向けの機能なのである程度慣れた人や「はね」や「はらい」を表現してみたい人は通常モードで使用してください。


プログラムの仕組み・改造点



 筆の「入り」「抜き」に関してはすでに書いているように「筆を動かす速さ」と「タッチ時間」で実現しています。タッチ時間は「入り」のみに使用しているのですが、これは最初にいきなり素早く動かすというのが難しいため徐々に太くなるようにしているわけです。
 これだとどんどん太くなってしまうため一定段階で太くなりすぎないようにしています。入り以外の部分は筆の速さで太さをコントロールしています。

 「入り」「抜き」表現はQSPである「簡易毛筆QSP」でさえ実現できていたのでそれからさらに一歩進んで「にじみ」「かすれ」の表現にも着手してみました。

《 プチコン3号の毛筆ソフトの進化 》


 筆の動作をシミュレートしてにじみやかすれをきちんと計算してコントロールしようと思ったらプチコン3号では完全に力不足です。したがって、それっぽい感じの計算式を導き出すしかありません。「にじみ」となるとランダムで広がるエアブラシがそれに近い感じですが、実際に実装するとあまりににじみすぎるし「かすれ」の表現も難しいです。

 そこで思いついたのが乱数に意図的な偏りを持たせるというものです。乱数を複数回発生させてその平均値をとれば中心極限定理によって徐々に正規分布に近づきます。

《 乱数を複数足した場合は正規分布に近づく 》

 ◎RNDF()を2回足した場合の分布


 ◎RNDF()を7回足した場合の分布


 このように発生させる乱数の数が増えれば増えるほど正規分布に近くなり、それと同時に平均値付近の値(中央値付近の値)が出やすくなるわけです。半径をRとすればR/2付近の値が出やすくなるわけでそれを極端にすればドーナツ状のブラシになります。

《 ドーナツ状のブラシ 》


 このドーナツ状のブラシこそがこの簡易毛筆の最大のポイントとなっています。複数回発生させた平均を取る場合に乱数の数が多ければ多いほどR/2付近の値が出やすくなるためはっきりとしたドーナツ状になり数が少なければぼけたドーナツ状になります。
 つまり、1ドット当たりの乱数の発生回数によってにじみがコントロール可能になるわけです。

《 乱数発生回数によるにじみの違い 》


 ただし、これを見てのように回数(RNDF()の発生個数)が多くなると分布が偏りすぎるためドーナツ形状がはっきり見えるようになるため2コ〜4コくらいが妥当だと思います。
それが原因で発生個数が増えると同じループ回数でもかすれやすくなります。

 かすれについてはループ回数でコントロールが可能です。これは円内にランダムに発生する乱数をプロットした場合にはループ回数が多いと完全に円がドットで埋まるのに対して少なければドットがまばらになるためです。ただし、これもループ回数が少ないと単純に薄い線となってしまうためあまり良いかすれ具合にはなりません。したがって、そう見えないギリギリのループ回数を実際に試し書きを積み重ねることで見つけ出すことが必要です。

《 ループ回数によるかすれの違い 》


 このようにループ回数を増やしてかすれを少なくすると薄い部分が減るため相対的に見て「にじみ」も小さくなったように見えます。つまり、ループ回数は単純に「かすれ」を増減させるだけではなく「にじみ」にも影響を与えるということです。*2とか+2とかの意味は下記の「改造点」参照)

 「かすれ」においては「ドーナツ状のブラシ」というのもいい感じで有効になっています。それは中央部分のドットが出にくいため単純な乱数ではループ回数の増減をコントロールしても難しい中央部分のかすれをいとも簡単に発生させることが可能になるためです。それに関しては上記の「にじみ」においてRNDF()8コで中央部分に隙間があるのを見れば一目瞭然でしょう。
 あとは線形補間によって前フレームと現在フレームのタッチ座標をR/2単位でつなげているだけです。(1ドット単位でつなげると速度面で非常に無理があるしかすれをコントロールするのが難しくなる)

 ちなみにプチコンBIG版となる「簡易毛筆 for U」とプチコン3号版となる「簡易毛筆 for 3DS」ではそのにじみやかすれの具合を意図的に変えています。プチコンBIGでは高解像度であるためにじみはリアルな感じになるように「にじみすぎない」ようにしているのに対してプチコン3号は低解像度であるため少し極端ににじむようにしています。(本体ならばドット数が半分なのでにじみ量も半分にすべきだけどそうなるとあまりにじんだ感じにならない)
 あと、プチコン3号版のver.1.0.0では旧3DSで動作させた際に標準の「太筆」でも処理落ちしていたので許容できるギリギリまでループ回数を減らすことで処理速度を稼いでいます。これによって、ver.1.1.0はver.1.0.1と比べて最大3倍くらいの高速化ができています。(20〜30fpsしか出なかった極太筆が60fpsキープ、7〜9fpsしか出なかったBボタンによる超々極太筆も20〜30fpsへと高速化!)
 高速化にはループ回数を許容限界まで減らすだけではなくループ内での処理を極限まで減らす工夫や「プチコン3号は乗算より除算の方が速い」という特性も活用しています。

 今後、さらに進化して「薄墨を使って水墨画を描けるようにする」というのも考えられますが、そのためには1pixel単位でアルファチャンネル合成する必要があります。端的に言えばGSPOITで色を読み出してRGBに分解して一定値を掛け合わせるだけの処理なのですが現時点で旧3DSで動作するプチコン3号では限界速度となっているため実現してもNew3DS専用もしくはプチコンBIG専用になるでしょう。

《 改造点 》

 以上のように「にじみ」や「かすれ」がコントロール可能なことは分かったと思いますが、具体的にはそれを変えるにはプログラムのどの部分をどのように変えれば良いかを書いておきます。

 まず、「にじみ」は40行をB=Q/(RNDF()+RNDF()+RNDF()+RNDF())*2とすれば前バージョンと同程度になります。足していくRNDF()を増やせばにじみが小さくなります。(増やせばその分処理が遅くなるため旧3DSでは厳しいです)
 RNDF()を単純に足すだけでは線がどんどん細くなりますが、RNDF()の個数の半分の数を掛けると太ささはほぼ維持ができます。(RNDF()を5個足したら2.5を掛ければ良い)

 また、「かすれ」具合は33行目の O=R*R*2+2 を変えることで調整できます。前の *2 を増減すると太い筆を使用時のかすれ具合に影響を与え、後の +2 を増減すると細い筆のかすれ具合に影響を与えます。(小さくすればするほどかすれやすくなりますが処理速度は速くなります)
 現状で「極細筆がかすれすぎて使いにくい」という人は「+2」の部分を「+4」くらいにすると良いかもしれません。(ただし、3DS版の極太筆は解像度の問題で太さ変化が乏しくかすれによって擬似的に太さを表現しているため値を大きくすることによってかすれなくなると筆圧表現ができにくくなる)

 New3DSでの動作を前提に調整を行うのであれば個人的にはRNDF()が4個(要するにB=Q/(RNDF()+RNDF()+RNDF()+RNDF())*2とする)、ループ回数は「*4」と「+4(要するにO=R*R*4+4とする)くらいが妥当だと思います。これでも、New3DSならば極太筆で常時60fpsが可能で超極太筆で57〜60fpsになる程度ですが、旧3DSでは極太筆で50〜60fpsに落ち込み、超極太筆だと30fps前後まで落ち込みます。(現在公開のver.1.1.0は旧3DSで超極太筆を使っても常時60fpsが可能になるように調整している)
 この改造を行ってもver.1.0.1よりは高速であるもののこのプログラムは60fpsの動作を前提としているためそれを大きく割り込むと筆圧処理が正常に働かないため凸凹な筆跡になってしまいます。MAINCNTを監視して処理落ちしている場合は筆圧を線形補間してやればこの問題は解決が可能)


最後に



 このプチコン3号用の「簡易毛筆 for 3DS」はQSPの「簡易毛筆 QSP」と比べると飛躍的な進化があるもののそれでも同時開発の「簡易毛筆 for U」と比べたら劣ります。
 これがfor Uで書いたサンプルです。アルゴリズムは全く同じなのですが、速度と解像度のアドバンテージがあるプチコンBIG用に調整しているだけでにじみ表現は格段に優れているのが分かると思います。

   

 やはり、速度と解像度の違いはどうすることもできません。プチコン3号版「は旧3DSでも可能な限り60fps動作」を実現するため少し妥協した部分もありますが、それだけではなくやはり解像度が高いためにじみ表現をやりやすいというのが影響しています。
 というわけで、自信がある「簡易毛筆 for 3DS」ですがプチコンBIGを使っている人はぜひ「簡易毛筆 for U」の方も使ってみてください。

《 更新履歴 》
ver.1.0.1 2016年12月31日 プチコン3号版の初公開バージョン
ver.1.1.0 2017年1月2日 にじみやかすれの仕様変更による大幅な高速化、イージーモード搭載


RETURN (プチコン3号/BIGプログラムのページにもどる) RETURN *MAIN (トップページにもどる)

inserted by FC2 system

inserted by FC2 system