「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

openFrameworks.cc Tutorial|Generating Meshesを読む#2

http://openframeworks.cc/tutorials/graphics/generativemesh.html Generative Mesh: Using an image to drive the creation of a mesh を読んでみた。

 このページの前半でofMeshの基本的な使い方を学んだので後半では何かGenerativeなサンプルを経験してもらおう!という意気込みで書かれている。

やっている事はこうだ。

  1. ofImageインスタンスに画像ファイルをLoad
  2. loadした画像の1ピクセルづつの色を取得し光度があるしきい値を超えた場合、meshにその位置と色をadd ※上記2つの処理はGL_PRIMITIVE_POINTSモードで行う。
  3. ここまで行ったらモードをLINESにして、mesh配列にの各頂点とその他の頂点との距離を測り、しきい値よりも小さい(近い)場合は、addIndexを行う。 ※各頂点とターゲット頂点を線で結ぶので条件が真の場合に行うaddIndexは、

addIndex(調べる頂点番号) addIndex(ターゲット) というように2つ行う。

■1.でloadする画像

Picture saved with settings applied.

■2.の処理で取得した状態のmeshをdrawしたもの

gMesh01

■3.の処理を行ったもの

gMesh02

ここまでのコードでは2Dの処理〜meshに頂点座標をaddする時にz座標のみ全て0〜にしていたので、z軸値をカラーから彩度を取得し、その彩度をofMapで-100〜100に変換したものとしている。この処理を行ったのみで実行をしてみても、ほとんど見た目は変わらないが各頂点座標値のz軸値に差が出来たのでカメラで回してみると面白いよ!と。。

https://vimeo.com/86824776

■Jitter効果

頂点を少量ランダムに動かしてみる。手段として-1.0〜1.0のパーリンノイズを発生するofSignedNoise()を使用する。 ofRandomは指定範囲内の値をランダムに返却する。立て続けにofRandomをcallする度に違う値が基本的には返却されるが、ofSignedNoiseは常に-1.0〜1.0の値を返却する。ofSignedNoiseが紙の上に描かれた曲がりくねった線だと想像してください。座標系にx値を渡せば、それに相当するy値が返却されます。例えばofSignedNoise(3.0)を連続してcallしても同じ値が帰ってきます。

パーリンノイズを何かのmotionとして一般的に使用する時は、引数に現在の時間を与えます。なので、ofGetElapsedTimef()を使います。今回は各頂点を個別に動かしたいと思っていますが、もし全ての頂点に対して同じ値〜ofSignedNoise( ofGetElasedTimef() )〜を与えてしまうと、全ての頂点が同じ方向に動いてしまいます。 そのため1つ1つの頂点に違う時間を使う必要があります。

をふまえて…

これまでのコードで生成しているvertexに対してパーリンノイズを各x,y,z値に加えて、更新する事を行うと以下の様にJitter効果が与えられる。

//パーリンノイズを使う典型的なデザインパターンは2、3のパラメータを用います。 //ofSignedNoise(time * timeScale + timeOffset) * displacementScale // ofSignedNoise(time) は時間をかけてゆっくりと変化する値を返します。 // ofSignedNoise(time*timeScale)は「スムーズさ」をコントロールする為にtimeScaleを乗算します。※timeScaleが小さいほど、スムーズ。 // ofSignedNoise(time+timeOffset)は同じパーリンノイズ関数を使って複数のものをコントロールし、独立した動きをしているようにします // ofSignedNoise(time) * displacementScaleは、パーリンノイズの値の限界を[-1. 1]から我々の好きな値へ変化させます。

眠い…続きは明日へ