LoginSignup
16
7

More than 3 years have passed since last update.

ポイントクラウドをモーフィングする

Last updated at Posted at 2020-12-13

はじめに

しゃんぺんです。こんにちは。
趣味でTouchDesignerを楽しんでいます。

この記事では、ポイントクラウド(以降、点群)のモーフィングについて紹介します。
サンプルファイルはこちら

参考資料

点群ビギナーは必読です。感謝のための語彙が足りません。
Point File In TOPを使った点群データの読み込みからレンダリングと、エフェクトの基礎を解説してくださっています。
本記事は、森岡さんのテキストの発展形の章を、試行錯誤した結果になります。

目標

点群に苦手意識があったのですが、腹をくくって勉強するきっかけになった映像です。

  • stillness by THINK AND SENSE
    stillness

  • Dissolving Realities Vietnam by RubenFro
    Dissolving Realities

このような美しい点群映像を目指した結果が以下になります。
(目標を達成した、とは言っていない)

点群データのモーフィング

全体をモーフィング

/project1/cross simple

cross_simple_1.png
これは非常に単純で、点群の位置情報(xyz)のTOPと、同じデータ数(解像度)のTOPを、Cross TOPでブレンドするだけです。
サンプルでは、PalleteにあるPointGeneratorで生成した適当な点群とブレンドしています。

カメラの近くだけをモーフィング

/project1/near camera

次は特定の部分(カメラの近く)だけをモーフィングする方法です。

カメラの位置を取得する

near_camera_1.png
まずはカメラの位置を取得します。
カメラ位置はObject CHOPで取得できます。今回はじめて知りました。
便利ですね!

カメラからの距離を計算する

near_camera_2.png
森岡先生のテキストで紹介されている方法で計算します。

  • カメラ位置を原点(0.0, 0.0, 0.0)にする(sub1)
    点群の位置情報(xyz)のTOP から カメラ位置のTOPを引き算すると、
    カメラの位置にいる点の座標が原点(0.0, 0.0, 0.0)になりますね

  • カメラ位置からの距離を計算する(math6)

  • 距離の最大値を調べる(analyze1)

  • 距離を0~1で正規化する(comp2)

これで、カメラからの距離(0.0~1.0)が設定されたTOPができあがりました。

カメラからの距離に応じた値を作る

near_camera_3.png
「カメラの近く」の閾値を「0.4」(threshold)とし、この閾値から「カメラからの距離(0.0~1.0)」を減算します(sub2)。
これにより、ざっくり以下のようになりました。

  • threshold(0.4) - カメラの近く(0.0~0.4)
    => 正の値(0.4 ~ 0.0)
  • threshold(0.4) - カメラの遠く(0.4~1.0)
    => 負の値(0.0 ~ -0.6)

つぎのlimit TOPでは、以下の2つを実施しています。

  • 負の値を全て0.0にclampする
  • Gチャネル(Y値)以外をマスクする(Y方向の動きを作るため)

これで、カメラの近くは距離に応じた値カメラの遠くはすべて0.0のTOPができました。
あとは適当に値を調整して、点群の位置情報(xyz)のTOPに足したり引いたりすると、良い感じの動きになりました。
(ここまで書いて、点の位置を直接加減算するこの処理はモーフィングと呼んでいいのか?という疑問がでてきましたが、見逃してください)

Curl Noiseを使ってモーフィング

/project1/curl noise

点群の動きにもう少しうねりが欲しいと思い、こちらのチュートリアルを参考にCurl Noiseを導入しました。

シェーダーはチュートリアルから全く変更ありません(変更できません)。
やっているのは以下の2点です。

アルファ値の変更

curl_noise_1.png
点群の位置情報(xyz)のTOPのアルファチャネルを乱数にします。
これはCurlNoiseのLifeの初期値に使われます。

解像度の変更

curl_noise_2.png
点群の位置情報(xyz)のTOPの解像度を、ComputeShaderが処理する解像度に切り上げます。
ここが不一致していると位置計算されないPixelが(0.0, 0.0, 0.0)になり、モーフィングしたときに一部の点群が原点に集まってくるという事象に悩まされます(悩みました!)。

ソートされた点群データをモーフィング

/project1/cross height

最後は、特定の高さの点群だけをモーフィングする方法です。

これは、点群データがソートされている必要があります。
今回、僕はTDSW Vol.032でもらったbase_shifter.toxでソートしました。
このtoxは、点群の原点位置の補正が簡単に出来て、たいへん便利です。
Vol.032では、TouchDesignerでの点群基礎以外に、点群ユーザ必携のCloud Compareの使い方なども説明されているため、ぜひ受講してみてください。

base_shifter.toxでは、点群の数が多くなってくると固まってしまい動きませんでした。
点群の数が多いときのソート方法は、森岡先生がこちらの記事で紹介してくださっています。

cross_height_1.png
サンプルの点群データはY値でソートしています。
点群データがソートされていれば、あとはMatte TOPでモーフィングする部分としない部分を分けるだけです。
点群のソート、すごく強力ですね。

おわりに

重たい点群操作がTOPだけでサクサク動くのは非常にありがたいですね。derivative様に感謝です。
点群の入門記事を書いてくださった森岡先生にも感謝いたします。

TouchDesignerをはじめて1年ちょっと経ちましたが、TDSWをはじめ多くの方の記事やチュートリアル動画のおかげで、少しずつ成長してこれました。
この場を借りて御礼申しあげます。
ありがとうございます!!!

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7