Wednesday, July 2, 2014

第12回GEMで物理モデル

画像/映像を扱うGEM(発音はジェムとかゲムとか呼びます)の機能に加えて、物理演算モデルを扱うpmpd(Physical Modeling for Pure Data)というライブラリがあります。
今回はそのpmpdの基礎を紹介して、GEMと組み合わせてみます。

物理演算モデルというのは、現実世界での物理的な運動、例えば引っ張ったバネを離すとビヨーンとたわんだり、落ちたボールが弾んだり、水の流れるような動きをコンピュータの演算でシミュレートしたものです。
Pd-extendedにはこのpmpdを実現するためのライブラリがあらかじめ入っています。フランスのCyrille Henryさんが開発しました。pmpdのオブジェクトを使用すればPdで物理演算ができるようになります。

pd_lesson12.zipをダウンロードしてください。

バネの動き

pmpdの構造は主に以下の2つから成り立っています。

  • mass(マス):質量や重さのあるポイントの役割
  • link(リンク):massとmassの間をつなぐバネの役割

それぞれ[mass]や[link]というオブジェクトを設定して、接続することで物理モデルを作ります。
では、それぞれのオブジェクトはどのような入力を受け付けて、どういう出力をするのでしょうか。


  • [mass]: [link]からのforce(力)データがインレットに入力されるとポイントの位置が変わり、位置のデータを出力します。重さと位置データを持っています。
  • [link]: 2つのmassの位置データが左右のインレットに入力されると、計算してforceデータをそれぞれのmassに向かって出力します。このlinkは粘弾性(viscosity-elastic)のあるバネで、粘性(粘り)と弾性(弾力性、伸縮性)を設定できます。


これを確認するために、pd_lesson12_pmpd1.pdを開いてみましょう。


[pd stuff]

[pd preset]

これは[link]と[mass]をつないだものです。
下の2つはそれぞれのサブパッチ[pd stuff][pd preset]の中身です。
[pd stuff]の中では、$0-massと$0-linkに[metro]からbangシグナルを送っています。$0-massと$0-linkとは[mass]と[link]につけられたラベルです。
bangシグナルを受け取ると[link]と[mass]は動作をします。bangシグナルがなければ動きません。

親パッチの[pd preset]の中ではそれらの初期設定値のパターンが用意されています。
水平ラジオボタンでそのパターンを選択できます。
左側の垂直スライダーを動かすと、[link]の設定値によって右側スライダーの追従の具合が変わってくるのがわかります。
また、[link]には[setL][setK][setD][setD2]のメッセージボックスを経由して、設定値が送られています。

[link]の設定を変更するメッセージ
  • setL: バネの長さ
  • setK: バネの剛性、固さ
  • setD: バネの減衰性、ブレーキ具合
  • setD2: massのスピードの減衰性

手動で設定を変えてからスライダーを動かして、感覚をつかんでみましょう。

重さによる変化

「弾力のあるバネ」である[link]がつながって制御しているのが、「重さを持った」ポイントである[mass]です。
[mass]の初期設定値は10000になっていますが、手動で変更することができます。

[mass]の設定を変更するメッセージ

  • setM: massの重さ

例えばmassの重さを小さくし過ぎたりすると、バネの強さが勝ってしまい、massの演算結果が発散します(結果が想定の範囲外になること)。いったん発散すると、数値を適正の範囲内に戻しても物理モデルの反応がなくなる場合があります。
その場合は数値を変更してから[reset( を何回かクリックしてください。
それでも直らない場合はパッチを閉じて、再度開いてください。

複数のポイントとバネをつなぐ

では、次に複数の[mass]の間を力が伝わっていくモデルを試してみましょう。
pd_lesson12_pmpd2.pdを開いてください。
これは[link]-[mass]-[link]...というように数珠つなぎに接続したものです。それぞれの[mass]のアウトレットからは、forceを受けて変化するポイントの位置の数値が出力されています。これをスライダーに割り当てています。
左端か右端のスライダーを動かすと、動きが連動するのがわかります。

チャレンジ

[link]の設定値を変更して変化を見てみましょう。

GEMで表現する

このmassの動きをCGで表示してみましょう。
pd_lesson12_pmpd3.pdを開いてください。
上下するスライダーの動きをGEMウィンドウで表示しました。
GEMウィンドウでは円のグラフィックがスライダーの動きと同じように上下します。
これは[pd gem]の中で[translateXYZ]のYの数値に割り当てているからです。
数値のスケーリングを行なっています。
右側の設定値変更で[link]の動きを変更できます。

カメラの映像を貼付ける

pd_lesson12_pmpd4.pdを開いてください。
さらに1つ1つの円にWebカメラの映像をリアルタイムに表示したパッチです。
[circle_camera]というAbstractionを作って呼び出しています。
[pix_video]と[pix_texture]はAbstractionの外側に設定してあります。これは複数の[pix_video]がAbstractionの中にあると、1つしかないWebカメラの出力口を奪い合ってしまうからです。Abstractionの中の[separator]でGEMリスト(映像のデータ)の流れを分岐しています。

動きと音を連動させる

pd_lesson12_pmpd5.pdを開いてください。

スライダーの動きに応じて、バンドパスフィルターをコントロールしています。
[readsf~]の[openpanel]で再生したいファイルを指定してから、[start(メッセージボックスをクリックすると再生されます。
[readsf~]は長い音のファイルを再生するのに適したオブジェクトです。例えば、アレイと[tabplay~]はコンピュータのRAMにいったん全部を読み込んでから再生します。それに対して[readsf~]は大きな音のファイルのデータの一部を細切れで読み込んで再生します。
コンピュータに保存してあるMP3ファイルを再生するのに対して、ストリーミング放送のようにネット回線越しに音をデータを細切れにして転送して再生するのをイメージするとわかりやすいでしょう。
長い音のファイルは特に用意はしませんでしたので、各自好きな曲のファイルを用意してください。再生できるのはwav、aiffファイルです。

チャレンジ

マイクからの入力に対してバンドパスフィルターをかけてみましょう。
また、バンドパスフィルターの値を変えてみましょう。
※ハウリングを起こさないようにイヤフォン、ヘッドフォンを使ってください。

pmpdで物体の形を作る

 pd_lesson12_pmpd6.pdを開いてください。

ここまでpmpdは一次元の物理運動を表したものでした。
pmpdでは2次元や3次元の物理運動のシミュレートができます。
[mass2D][link2D]は2次元、[mass3D][link3D]は3次元のためのオブジェクトです。

pd_lesson12_pmpd6.pdは2次元の物理運動をシミュレートして、ポイント[pd]をリンクで繋いで形にしています。
もともとはPd-extendedのチュートリアルファイルにあったものをポイントを少なくしたパッチです。

[metro]をオンにすると、pmpdの演算が開始します。マウスで動かすことができます。

[pd structure]の中でポイントとリンクの形を作っています。
[pd_masse]がポイント、[pd_lia]がリンクのためのAbstractionです。
[pd_lia]の中の[curve]はリンクの線の描画に使っています。

チャレンジ

このパッチを基に、好きな形の構造物を作ってみましょう。


No comments:

Post a Comment