はじめに
複数間の衝突回避について、2025.08.27のblog「Boids(ボイド)群コントロール」で扱いました。色を利用したMatixのベクトル計算で、衝突すると反対方向に動かします。やっていることはわかるのですが、プロブラムはなかなか難しく、Youtubeをみながら追っていくことになります。しかし、3体間の衝突回避は原理的で十分理解できるし、プログラムも難しくありません。プログラムしている中で、発振現象が生じる場合があることを見つけました。どうして発振するのかを後で述べます。勿論発振しないように調整することもできます。このため、非発振で動く状態から発振へ、その逆というようにコントロールができます。この現象に魅力を感じました。回転する方向や向きもその時によって偶然に決まるように見え、複数用意すると、相転移するように見えるでしょう。3体の集まりを一つとして、別の3体の集まりと相互作用させるといった応用もありそうです。今回は基礎的な現象を話します。
もう一つ関係性に注目した例を挙げます。これは2025.06.14のblog「プロシージャル3「創発的関係」」に対応するものです。このblogで、本来関係性がない対象に関係性を与えて動かす方法を「創発的関係」として紹介しています。今回は3体間の関係性を別のオブジェクトに与えて、それらを動かします。これが何に応用できるのか定かでありませんが、このオブジェクトが動いているのは、実は別のオブジェクトが動いているからだ、という隠された関係があることに魅力を感じています。プログラムはTouchdesignerで行っています。
3体間の衝突回避
まず映像をみていだだきます。3つの球体が衝突することなく動いています、そして、互いの距離を縮め発振現象を示し、その後またもとに戻ります。これを2回繰り返します。
この動作の原理を説明します。半径rの3つの球体はそれぞれnoise CHOPで発生させたx,y,zの位置を与え、それぞれ独立して動いています。3つの球体間の距離を常に求めており、それが2rより小さくなると、衝突したと判定し、衝突したのと反対の方向に指定した距離だけ動かします。例えば0.2動かす等です。この動かすベクトルをフィードバックし、元のnoise CHOPで作ったx, y, zに加えます。球体をA, B, Cとすると、A-B間の距離が短くなった場合は、Bを動かし、B-C間ではCを、C-A間ではAを動かしています。プログラム部分を次に示します。

この図で重要なのはobject CHOPです。これは便利なCHOPで入力したCHOP間の差のベクトルと距離を求めてくれます。つまりA-Bのベクトルです。これを距離で割ったものが単位ベクトルになります。これの符号を反対にし0.2倍しています。これが移動させるベクトルです。この値を球Bの座標にフィードバックして加えます。objedt CHOPから距離を求めているので、これが2r以下になるかどうかで衝突判定をします。衝突した場合はスイッチを切り替えて、移動させるベクトルを球Bへフィードバックさせます。衝突していないときは(0, 0, 0)のベクトルをフィードバックしています。
発振現象の理由を説明します。衝突回避のためにフィードバックが行われて少し距離が離れます。するとフィードバックの値がゼロになり、足す前のx,y,zに戻ります。このため再び衝突する距離になりフィードバックが加わり、距離を開けます。距離が開くとフィードバックの値はゼロになり、足す前の位置に戻ります。これを繰り返し発振します。実際は常に動いているので、x, y, zの値も常に変化しています。値がゼロになったからといって元の位置に戻るわけではなりませんが、戻る時間が短い、あるいは、移動する領域が狭いと、元の位置付近にもどり発振しやすくなります。ですので発振がいつも生じるわけではありません。発振する/しないのコントロールをするために次のことを行っています。1つはフィードバックの値にフィルタを入れています。発振させない場合は、フィルター機能を使い、フィードバックする値が直ちにゼロになることを防いでいます。発振させる場合はフィルタ機能を無くすようにパラメータを変えています。もう一つは球の移動範囲の制限です。x, y, zの移動範囲が大きい時は発振しにくくなります。これは一旦衝突すると衝突しない距離に移動しそこから更に移動できるからです。これに対して移動範囲を狭くしていくと、衝突を検出して動いても、直ぐに次の衝突がまっています。このため発振現象が維持されます。発振を起こそうとすると、移動範囲を狭くし、フィルタを掛けないようにします。反対に移動範囲を広くし、フィルタを掛けると、発振はなくなります。このようにしてコントロールしています。
これまでblenderで発振現象を見つけたことを述べてきました(2025.07.12「非線形動画+α」)。今回Touchdesignerでも発振現象が作れることが分かりました。
プロシージャル 「創発的関係」
上に挙げた3体間の距離を3つのオブジェクトの高さ方向にアサインしたのが次の映像です。この映像の左上に3体の球の動きを描いています。それでは見てください。
3体の球の動きと、大地, 海, 都市とは本来何の関係もありませんが、距離のパラメータで結び関係付けているのが、プロシージャル「創発的関係」です。3体の球の動きに同期して、3つのオブジェクトが上下に動き、位置関係が常に変化していきます。緑の球と白の球の距離が大地の動きに対応し、緑の球と青の球と距離が海の動きに対応、青の球と白の球の距離が都市の動きに対応しています。
今回の例は、3体の球の動きに関連させてオブジェクトを動かしたに過ぎません。特に意味はありません。今後何か意味のある例を考えたいと思っています。


コメント