これまで描画APIやイベント関数など、基礎となる利用方法を解説してきました。Frocessingを使うことでグラフィック描画を手軽に、手早くプログラミングできるとことがわかっていただけたかと思います。手軽さや手早さは、いろいろなことを試す、つまりスケッチ(素描・試作・思索)を行う上では重要な要素です。
最終回となる今回はスケッチの例としてペイントプログラムの制作過程を紹介します。
スケッチのはじまり
前回、マウスを使ったプログラムとして「PaintSample」を紹介しました。マウスに沿って線が描かれるシンプルなペイントプログラムです。
このプログラムをスケッチのはじまりとして、最終的には次のFlash(SketchSample7)を制作します。この2つを見比べると随分違うように見えますが「PaintSample」に少しずつ手を加え、変化を積み重ねた結果です。
では、早速スケッチの過程を見てみていきましょう。
線の色を変化させる
まずは、描画する線に表情を与えるため色をつけてみます。次のプログラム(リスト1)と実行結果をご覧ください。
線の色はHSV指定を利用して(1a)、赤付近(色相)の色をランダムに指定しています(1b)。random()の値によって表示される印象が変化しますのでいろいろと試してみましょう。
線の動きを変化させる
マウス座標に沿って線を描くのはペイントプログラムの基本です。しかしインタラクティブなFlashとしては単調な印象があります。この部分に面白み、あるいは心地よさを与えるために線の動きに加速度運動(バネ運動)を加えてみます。
加速度運動
加速度運動のプログラムはペイントプログラムに限らず一般的によく行われることです。ここでは実装方法のひとつの例を紹介しておきます(リスト2)。位置・速度は運動の状態、加速度係数・減衰係数は運動の性質を意味しています。
リスト2では、差分(dx,dy)から加速度(ax,ay)を求めることによって、(xx,yy)がターゲット点(x,y)を追随するような運動になります。
このプログラムは、以下のリスト2'のように簡潔に記述することができます。
ペイントプログラムに組み込む
リスト1に加速度運動のプログラムを加えてみます(リスト3)。実行結果と合わせてご覧ください。
加速度運動は性質(ac,de)によって表示結果の印象が変化します。数値を変更して好みのポイントを探してみましょう。
線のサイズを変化させる
加速度運動を追加したため動的な印象は増しましたが、よりイメージを強調するため線の形状を動きに合わせて変化させてみようと思います。
線幅を変化させる
動きの大きさは速度や方向の変化などで考えることができますが、ここでは扱いやすい速度の情報を使います。速度(vx,vy)の大きさと線の幅を対応させてみます。
リスト4と実行結果をご覧ください。
速度の大きさはvx,vyから求め(4a)、係数(wd)を乗算して線幅に指定します(4b)。
- mag
- 指定したベクトルの大きさを求めます。
- strokeWeight
- 線の幅を指定します。GraphicsクラスのlineStyle()の第一引数に該当します。
線をシェイプで表現する
リスト4の実行結果を見ると、線の接合部分に段差ができることを確認できると思います。これは線幅が一定で、次の線との差が出るためです。線をシェイプ(四角形)に置き換えることで段差をなくしてみます(図7・注1)。
以下のリスト5は、図7の方法をプログラムしています。実行結果と合わせてご覧ください。
線を滑らかにする
線の大きさと動きの関連付けを行いましたが、線が直線で構成されているため角張った印象になる場合があります。滑らかに動くプログラムなので線も滑らかであって欲しいところです。
線を曲線で描く
線を滑らかにするために、シェイプ(四角形)を曲線に置き換えてみます(図9)。曲線の描画にはcurveVertex()を使います。
実際のプログラムはリスト6のようになります。曲線の描画には少なくとも4つの座標が必要なため、px0、py0、px1、py1を配列にしています。
グラデーションで塗る
線を曲線で表現することで動きと形状のイメージが合ってきたと思います。さらに手を加えて単色による塗りをグラデーションに変更してみます。
グラデーションの指定方法はGraphicsクラスと同じです(リスト7)。引数の内容はFlashのマニュアルなどをご覧ください。
beginGradientFill()の第5引数(matrx)はグラデーションの位置や方向を指定する重要な値です。実はこのmatrixの指定方法が少々分かりにくく、Frocessingではグラデーションのmatrixを指定するためのクラスが提供されています(frocessing.geom.FGradientMatrix)。
FGradientMatrix
実際に指定方法の違いを見てみましょう。次のリスト8、リスト8'は開始位置(x0,y0)から終了位置(x1,y1)に線形のグラデーションを指定するMatrixのプログラムです。FGradientMatrixでは直感的に指定できることが分かっていただけると思います。
FGradientMatrixには線形の他に放射グラデーションなどの指定方法があります。詳しくはドキュメントをご覧ください。
次のFlashはリスト6にグラデーション塗りのプログラムを追加したものです。プログラムはWonderflでご覧ください。
※プログラム中のcolor()はstorke()やfill()と同じ色指定方法で色値(uint)を求める関数です。
線を複数にしてみる
これまでに線の動き・形状・色といった表現について手を加えてきました。最後に線そのものではなく数を複数に増やしてみたいと思います。
線情報のクラス化
複数の線を描く準備として線の形状や動きを決定する変数をクラスにまとめます(リスト9)。
setup()での線情報の初期化は以下のように書き換えます(リスト10)。
nは線の本数で、配列brushsに線情報を示すインスタンスを格納していきます。この初期化の際に加速度係数(10a)をランダムに指定し、線の運動に違いを持たせます。また、線の幅(10b)もランダムに指定してみます。この2点は表示の印象を変化させる大きな要素になるのでいろいろと試してみましょう。
描画プログラムの修正
drawing関数内のプログラムも複数線に対応させます(リスト11)。BrushStateクラスの変数名はこれまで使っていた変数と同じなので、with()を使い描画プログラムをほとんど修正せずに利用します。
フレームスクリプトの場合
フレームスクリプトに記述する場合、クラスファイルの作成が手間になるので情報の保持にObjectを使うとよいでしょう。リスト10やリスト11のBrushState(10c・11a)をObjectに書き換えましょう。
スケッチのおわり
次のFlashは複数線のプログラムを加えたものです。プログラム全体はWonderflでご覧ください。
今回のスケッチはここまでとしますが、もちろん明確な終わりがあるわけではありません。紹介した線の描画方法もひとつの例に過ぎません。イメージの赴くままにプログラミングを進めてみてください。
また、スケッチは表現方法やアルゴリズムの試作を目的とした側面があります。実際の作品などに発展させるにはプログラムの最適化が必要になるでしょう。
おわりに
これまで4回を通じてFrocessingによるグラフィック描画プログラムを紹介してきました。この連載によってわずかでも描画プログラムのたのしみが伝わればと考えています。
連載では2次元グラフィックの基本をテーマとしていましたが、Frocessingは3次元のグラフィック、画像、テキスト、SVGの描画APIも提供しています。これらはより多様な表現を手軽にするためのものです。いろいろと触れていただければ幸いです。