Copy機能の拡張:POPを試す6

copy

はじめに

生物の形を模倣するためにCopyに着目し、ある形状を構成するポイントに別の形状をCopyし、それを同じあるいは別の形状にインスタンシングすることで、生物っぽい形状が作れることを見つけました。これを2025.12.24のblog「Copy:生物の形の模倣1」で紹介しました。この時、Copyに相当するインスタンシングは1回しかできないこと、Copy SOPの場合、パソコンへの負荷が高く複雑になると動かなくなること、同じ形状がCopyされ、それぞれのサイズを変えたり、色を変えたりできないこと、を課題と感じました。これがきっかけとなりPOPを導入してみようと思いました。その結果として2026.03.29「生物の形の模倣3・・・」で、ヒドラに似せた形状を作成しました。今回は当初感じた課題を扱い、Copyしたにもかかわらず、サイズを変更したり、色を変えたりできること、を述べます。Copyを繰り返せることはヒドラの例で試しましたが、今回も使います。POPはSOPに対して随分と概念が違うことをこれまで述べてきました。Copy POPもまたCopy SOPとは違い、アトリビュートを使ってそれぞれを変更できる新しさを備えています。

Copy機能の拡張

最初に作製した映像を見ていただきましょう。エネルギーを放出すリアクターをイメージして作成しました。

円周から粒子が放出されています。円周に近い粒子は大きく、離れていくほど小さくなり見えなくなります。そして色も円周近傍が強く黄色で、周囲へ行くほど薄く青くなっています。また粒子は後ろから前に少し曲がっています。これをSOPで作るとすると、光の放射を1本だけparticle SOPで作り、それを円周上にCopyすることになります。しかしparticleにサイズや色の分布はインスタンシングで付けることになります。それではPOPによる作成の仕方を紹介致します。オペレータの配置はスタンダードな配置です。

circle POPを設定し、particle POPと繋ます。これでcircle POPを構成するポイントから粒子が放出します。しかしこれだけでは粒子は動きません。粒子を動かすのはparticle POPの後に繋ぐフィードバック系が必要です(null POPがparticle POPにフィードバックされています)。フィードバック系には主に2種類があります。一つはフィードバックの中にtransform POPを入れて、scaleを0.98や1.02等にすることで、内側にあるいは外側に粒子を動かす方法です。これは2026.04.05「モノの形状が作る場:・・・」で使いました。もう一つは粒子に作用するfroce radial POPをフィードバック内に入れる方法です。粒子に力が作用することで粒子が動きます。今回はこちらを試しました。手前方向に粒子が曲がっているのもz軸方向にforceを設定したからです。

次に粒子のサイズを変える方法について説明致します。パーティクルは粒子で点ですからサイズの情報はありません。従って粒子に実体を当てはめる必要があります。実体を当てはめ、これの大ききさ変えることを行います。実体を当てはめて大ききを変える働きをするのが、Copy POPです(サイズや色や回転を変える操作を実行する機能もCopy POPが担います)。実体を当てはめるまでにすることがあります。これはサイズを変更する新しい属性を作ることです。この属性は、最初は大きくだんだん小さくなるようにする関数になります。

オブジェクト指向プログラムは物事の記述は、属性と行為によって記述されます(2025.06.05「オブジェクト指向プログラム、世界の捉え方」が参考になります。ここでは属性をプロパティと呼んでいますが、TouchDesignerではアトリビュートと呼んでいます)。この属性が途中で作成できるようになったのは画期的だと思います。この属性を決めるのがmath mix POPです。このパラメータは次になります。

A/Bを求めることで新しい属性を作ります。AはPartAge, BはPartLifeSpanです。この2つはparticle POPが属性として最初から持っているものです。これらはparticle POPのパラメータで値が変わります。PartAgeは粒子の年齢のことです。粒子が生まれてから何秒経ったかを表しています。PartLifeSpanは粒子の寿命のことです。粒子が生きられる最大時間を表しています。ですので例えば3なら、3秒経てばその粒子は無くなります。このため、PartAge/PartLifeSpanは無くなる時間に対して今どこなのかを0~1の値で示す関数となります。これをp_sizeと名付けました。例えばサイズにこれを適用すると、最初小さく、消える前まで次第に大きくなります。行いたいのは、最初大きく時間が経つにつれて小さくしたいので、1 – p_sizeを作り、これを改めてp_sizeとしました。これでp_sizeは1~0になります。次にlookup Texture POPを使ってramp TOPの情報を参照させます。この設定を次に示します。

ramp TOP_1はResolutionを例えば500, 1等と設定し一次元にします。ramp TOPの表示を見ると色のついた表示がありますが、これが0~1に対応しています。ramp TOPは色ですからその位置(0~1)に対応したRGBAの情報を持っています。lookup Texure POPはTex座標を扱います。Tex座標は0~1で規格化した座標系です(Tex座標については、「モノの形状が作る場・・・」、「粒子で描く・・・」を参考にしてください)。ramp TOPもその値は0~1なので、rampの位置とTex.uの位置の対応が取れます。この対応を取る関数が先ほど作ったp_sizeです。0~1ではなく、1~0で対応を取ることになります。続いてChannel MASKでRを選択しています。rampに対応させた1~0の位置にはRGBAの情報があるわけですが、そのRだけを取り出し、名前をOutput Attribute Scopに記載したPointScaleにします。サイズはスカラーですので一つだけ使えばいいわけです。サイズだけでいうなら、PointScaleを使わずに、p_sizeをCopy POPのTemplate Scaleに使ってもOKです。

それではlookup texture POP_2についてみてましょう。

違っているところは、Channel MASGがRGBA全てが選択されており、Output Attribute ScopeをColorにしている点です。Tex.uとrampを対応させ、その対応の規則がp_sizeなのは同じです。対応したrampの値にはそれぞれRGBAがあり、色を変えるわけですからそれらを全部使い、それにColorという名前を付けたということです。

最後にCopy POPについての説明です。
Copy POPは第一インレットにコピー対象を第二インレットにコビーする場所を入力します。ですので、今回の場合はそれぞれの粒子にsphere(球)をコピーします。SOPの場合はこれだけでしたが、POPではこれまで説明してきた、関数(アトリビュート)を作用せることができます。この設定が次です。

Template TranslateはPですの、パーティクルの位置のことです。ここのsphereがコピーされます。続いてTemplate Scaleに上で作成してきたPointScaleの関数を入れています。これでsphareにscaleの重みがかかります。これにより円の周囲には大きく、離れるほど小さくなります。そして、Template AttributeでColorを設定しています。

これも上で作ってきた色情報がsphereに対して適用されます。このようにCopy POPでアトリビュートが実行させることになります。

リアクター映像の作成

Copy機能の拡張について説明してきましたが、作った映像を更にコピーして複雑な形状を作ることを述べていませんでした。そこで、上で作った映像をサイズを大きくしたCircle POPを用意し、構成する20のポイントにコピーしました。中央にsphere POPを配置し、そしてrender TOPの後にfeedbackEdgeのフィルタを加えて見栄えを整えました。それが次の映像です。

エネルギーがほとばしっている感じがでているのではないでしょうか?
今回のblogの音はアナログシンセサイザーdark energy2で作成しました。

まとめ

POP導入のきっかけとなった、SOPではCopyをした際にそれぞれに対してサイズや色を変えることができないという問題に対して、POPを使うとできることを述べました。アトリビュートを作成し、これをCopy POPで設定・実行することで行います。アトリビュートを関数として作成していける点、0~1の規格化した値をTex座標の0~1に対応させることで情報を移す点、いづれも優れた方法で感服致します。

コメント