チュートリアル 10:
ランダムな描画

イントロダクション

チュートリアルを開いて下さい。

このチュートリアルでは、lcd オブジェクトを使った描画についてより詳しく調べます。しかし、図形を決められた値によって描画するのではなく、random オブジェクトや drunk オブジェクトを使って自動的に描画コマンドを生成する方法による描画を見ていきます。

数多くの様々なアートの様式では、面白い、予想できないような内容を生み出すために、乱数や疑似乱数のテクニックを使用します。ここでは、元となる素材に対してある範囲の数値を生成するrandom オブジェクトの使い方を理解しましょう。これは、Max の中でランダムな素材を作るための手段として使用されるものです。drunk オブジェクトはある数値の範囲の中でのランダムウォークを実行する手段を提供します。このオブジェクトでは、乱数生成による意外性が得られると同時に、生成される数値の望ましくない急激な変化を避けることができます。

randomを使った描画

チュートリアルパッチを見て下さい
。パッチャーの左上には、random オブジェクト(緑色)を使用して乱数を生成するパッチがあります。random オブジェクトに接続された button をクリックすると、オブジェクトの出力は 0 から 999 までの間の数字になります。これは、1000の可能性を持つ一様乱数の範囲になります。これが、オブジェクトアーギュメントが示すものです。アーギュメントはこのオブジェクトが生成できる数値の範囲を設定します。

button をクリックするたびに、オブジェクトは異なる数値を生成します。出力範囲を変更したい場合には、アーギュメントを変更するか、random オブジェクトの右インレットに新しい値を送信します。random に接続された上側のナンバーボックスに20 を入力した場合、button をクリックすると 0 から 19 の間の数値が出力されるようになります。これを使って、パッチの左下にある lcd オブジェクトに面白いグラフィックスを生成してみましょう。

1 というコメントがあるパッチのセクションは、下のlcdに対する自動的なグラフィックスジェネレータです。metro オブジェクトはbang メッセージの規則的な流れを5個の random オブジェクトに送っています。それぞれの random オブジェクトは lcd オブジェクトのサイズ(幅320ピクセル、高さ240ピクセル)にふさわしい値の範囲を持っています。最初の 2個の random オブジェクトの出力は、必要な数値を作り出すために、いくつかの演算オブジェクトによって処理されます。すべての値は1つにまとめられ、(pack オブジェクトによって)7個の数値からなるリストが作られます。さらにこのリストの先頭には(prepend オブジェクトによって) paintoval というメッセージが追加され、これが lcd オブジェクトに送信されます。 

リストの7個の数値が何を表しているかを知りたい場合には、lcd のリファレンステキストを参照しなければなりません。リファレンスを表示させるためには、パッチをアンロックし、lcd オブジェクトを選択して、Help メニューからOpen lcd Reference を選びます。すると、lcd のマニュアルページが表示され、paintoval メッセージについて調べることができます。

リファレンスマニュアルによると、このアーギュメントは左、上、右、下、そして色(赤、緑、青の各色の値を示す3つの数値のリストとして送信されます)になっています。自動描画を行なうプログラムを見ると、最初の random オブジェクトが左右の位置(5ピクセル加算、減算して10ピクセル幅の値を作っています)を決定して、2つめの random オブジェクトが同じような方法で上下の位置を決定しています。最後に、残った3つのrandom オブジェクトが3つの乱数(0から255 の範囲の値)を生成し、描画に用いる色の RGB の値を決定しています。

toggle ボックスをクリックして metro をオンにすると、lcd が直ちに画面中にランダムな色による小さな(直径10ピクセルの)円の描画を始めるのがわかります。これは、位置と色の選択を完璧にランダムな方法で行なっている良い例です。ところで、描画を行なう位置をもう少しコントロールしたいと思う場合にはどうすればよいでしょうか?

drunk を使った描画

コンピュータでモデル化できるランダムな振る舞いには、数多くのタイプがあります。random オブジェクトは、その中でも最も「ピュア」なランダムに近いものを提供します。この場合、範囲内にあるすべての数値は等しい確率で選ばれます。random オブジェクトに代わるものとして drunk オブジェクトがあります。drunk オブジェクトの名前の由来は、数値の範囲の中で「酔っぱらいの千鳥足」のように変化する値が得られることからきています。このランダム化の方法(技術的には、ブラウン運動と呼ばれるものの中の1つ)は、自然界で見られる多くのランダムな過程の特性を示すものです。

random のテストを行なったパッチ(パッチの左上)の下には、drunk オブジェクトをテストする2つめのテストパッチがあります。接続された button をクリックすると、drunk オブジェクトが第1アーギュメントで指定された範囲(アーギュメントが1000の場合、0 から 999 の範囲の数値が出力されます)に基づいて乱数を出力するのを見ることができます。しかし、2回目に button をクリックしたときには、少し異なった結果が得られます。ここでも乱数を得ることができますが、この乱数はその前の乱数の値 +/- 20の範囲内にあるものです(この範囲は第2アーギュメントで指定されています)。button のクリックを続けると、出力される値が、常にその前に出力された値から20ステップ以内に収まっていることがわかります。drunk の第2アーギュメントは、1回のbang の受信で用いられるステップサイズの最大値を指定するものです。

random オブジェクトの場合と同様、用意されたインレットにナンバーボックスを接続することによってdrunk の2つのアーギュメントを変更することができます。drunk オブジェクトの場合、第2インレットで値の範囲を変更し、右(第3)インレットでステップの値を変更します。範囲とステップサイズを小さな値(例えば、それぞれ10と1など)に変更すると、button をクリックした際に出力される値が狭い範囲に固定されるようすを見ることができます。

チュートリアルパッチの 1 というセクションの下にあるclear と書かれたメッセージボックスをクリックすると、lcd のカンバスに描画されているものをすべて消去することができます。右上のパッチ(2 と表示されているもの)は、drunk オブジェクトを使って、前とは異なる自動的な描画処理を実行している例を示しています。このパッチの見た目はrandom オブジェクトの説明に使用した描画ルーチンと非常によく似ていて、単に1つのオブジェクトを入れ替えただけのようです。lcd オブジェクトをクリアし、パッチ上部の toggle をクリックして処理をスタートさせて下さい。lcd オブジェクトには、生成された整数値を伴った paintrect メッセージが送信されます。その結果、矩形が lcd の中を動き回りますが、与えられる数値の変化が小さなステップサイズ(20 x 15ピクセル)に制限されているため、大きくジャンプすることはありません。また、色を指定するアーギュメントの変化もdrunk オブジェクトのステップサイズ(5)で制限されるため、色の変化が非常にゆるやかであることにも気がつくと思います。

もう1つのrandom による描画

自動描画を行なう3つめのオブジェクト群はパッチの右下(3 と表示されています)にあります。パッチのこのセクションはやや複雑に見えます。また、lcd オブジェクトに対する新しい描画メッセージ framepolyが使われています。再び lcd のリファレンスページを開くと、このメッセージが、ポリゴンフレームを描画もので、そのために、ポリゴンの角、または頂点を表す1組の x、y の値を必要とすることがわかります。この自動描画ルーチンでは、8個の random オブジェクトを使って4組の座標値を生成しています。これらは(pack によって)リストにまとめられ、framepoly メッセージを(prependによって)先頭に付加されて、lcd に送信されます。色情報は framepoly メッセージに埋め込むのではなく、3つの乱数によるセットを別に計算し、それをリストにして frgb(前景色のRGB)メッセージを作り、lcd に送信しています。

このルーチンは、ランダムな点の選択をするために、今までとは異なったアプローチをしています。lcd 画面の中の任意の点をランダムに選択するのではなく、ランダムな数値として 0 から 9 の値を生成し、その結果に乗算を行なって座標を選択しています。水平座標(x)では乱数の値に32を掛け、垂直座標(y)では 24 を掛けています。このようにすると、lcd の画面は 10 x 10 のグリッドに分割され、すべての座標はグリッド上に「固定」されます。

パッチのこのセクションの metro を(その上の toggle オブジェクトによって)オンにすると、(ランダムに)生成された色を使ってポリゴンフレームが描画されるようすを見ることができます。しかし同時に、乱数の選択が制限されている結果も見ることができます。このグラフィックスはクモの巣のような特徴を持っています。特に縁の部分ではそれが顕著に現れています。random オブジェクトの使用法をわずかに変更することは、生成される結果に対する何らかのコントロールを行なうことを意味します。

座標を生成している random オブジェクトを drunk オブジェクトで置き換えると、やや異なった結果を見ることができます。すべてのrandom 10 オブジェクトを drunk 10 2 というオブジェクトで置き換えて下さい。このようにすると、パッチを実行した際のクモの巣の生成が、さらにコントロールされているように見えます。色を生成する部分を random 255 オブジェクトから drunk 255 15 というようなオブジェクトに置き換えることによって、さらに描画機能に手を加えることができます。このようにした場合、色の変化がスムーズになり、生成された描画に対する別の視点を与えてくれます。

結び

ここでは、lcd オブジェクトへ描画についてさらに学び、のpaintoval(小さな円の描画)、paintrect(小さな四角形の描画)、framepoly(連結された線の描画)メッセージの使い方を学習しました。また、興味深い内容として、Max に描画を実行させることも学びました。その際、random オブジェクトや drunk オブジェクトを使って lcd へ描画する際の座標や色を生成させました。さらに、値の範囲や乗算を用いて、アプリケーションごとの必要性に合わせた乱数生成を扱うことが可能であるということを見ました。random オブジェクトや drunk オブジェクトが、音楽やグラフィックスを生成する多くのアプリケーションの心臓部となっているということは、驚くにはあたらないことです。

参照

random 数値の表示と出力
drunk ランダムウォークの実行