距離と回転角による図形の描き方:POPを試す追加

particles

はじめに

スパイラルやフィロタキシス等は距離と角度の関数です。距離と角度で決まる関数をTouchDesignerを使って描く場合、決まったプログラム形式があります。一方すでに使っていますが、新しオペレータ群であるPOPが2025年にリリースされました。POPではmathmix POPの中で関数を直接書くことができます。Monogokoroでは、POPを用いて線形2階微分方程式やトーマスのストレンジアトラクター等を描いてきました。今回従来の方法とPOPを使う方法で、スパイラル図形とフィロタキシスの描き方を紹介します。「POPを試す」シリーズを少し前に書いていたのですが、本来そこで紹介すべきでした。追加致します。

スパイラル図形

ここでスパイラル図形と呼んでいるのは、次の図のように、距離rと角度をパラメータとして描く図形のことです。

この図形の描き方を紹介致します。まづ最初は従来の描き方です。プログラムを次に示します。

スパイラルの図形の左の図の描き方を述べます。全体の流れですが、geo COMPのインスタンシングによって描きます。そしてインスタンシングは距離txとある軸からの角度rz(z軸に対する回転角)で描くことができます。つまり極座標表示がそのまま使えます。ここで重要になるのが、point数です。txとtzのpoint数を合わせる必要があります。つまり1番目のpointがtxとrzに変換されてプロットされ、2番目のpointがtxとrzに変換されプロットされ、これを続けて図形を描いてきます。このように順番を与える数がベースに必要です。それが次に示すpattern CHOPです。それではプログラムを最初から見ていきましょう。

constant CHOPにpointの数とスパイラルを何回転させるかの値を入れます。pattern CHOPのLengthとTypeで設定するrampが、1番目、2番目というpointの数に番号を付ける役割になります。例えばLengthを100とするとrampは1~100に対して0~1の値が付きます。即ち1番目は0, 2番目は0.01, 3番目は0.02・・・になります。次のmath CHOPで距離と角度を作っていきます。例えば距離はmath CHOPでramp CHOPの値を10倍します。すると距離は0, 0.1, 0.2, 0.3・・・となります。角度に対してもmath chopで何回転×360を入れます。ここでは2回転させるようにしているので720が入っています。これをrampに掛けます。ですので、0, 7.2. 14.4, 21.6・・・となります。これをmergeしてrenameして(tx, rz)にします(これは極座標表示です)。即ち(0, 0), (0.1, 7.2), (0.2, 14.4), (0.3, 21.6)・・・となります。txをgeo COMPのTranslate xにrzをRotate zにインスタンシングすると、スパイラル図形の左側が描けます。patten CHOPのrampを使うということが重要です。

次にスパイラル図形の右側の図の描き方を述べます。即ちpoint間を接続する表示方法です。null CHOPの後にselect CHOPを使ってtx, rzを別けます。これは次のtransform CHOPの変換機能を使うには第1インレットと第2インレットに別々に入力する必要があるためです。transform CHOPはtx, rzのような極座標をtx, ty, tzのデカルト座標に変換してくれます。これをsop to CHOPで3D化します。この時point間は自動的に補間されます。上のプログラムの図はここまで表示しています。この後geo COMPとrender TOPで通常どうり2D化することで描けます。

次にPOPを使って同様なことを行う場合を見てみましょう。次の図が描いたスパイラルです。

そして、プログラムが次です。

プログラムのPOP部分と書いた部分でスパイラルが描けます。mathmix POPの画像がスパイラルの画像の左側です。このようにブロックとしては非常にシンプルに描けます。line POPはpointの一番元を作るためのものです。ここでは(0,0,0)-(1,0,0)を199分割しています。ですのでpointの数は200になります。line POPは属性としてP(位置)を持っています。ですので場所に関して操作をすることは可能ですが他の属性はありません。そこでこれを粒子化します。これがparticle POPです。これに接続することで粒子の属性が付与されます。これはP, PartVel, PartID, PartAge,・・・等複数あります。今回はこの中のPartIDを使います。これはpartice IDで、粒子の一つ一つに順番に番号が振られます。言わばこれが従来の例ではpattern CHOPのrampの設定に相当します。Maximum Particlesを200にしてポイント数を合わせておきます。後はmathmix POPの中で式を記述すればOKです。それを次に示します。

PartIDをrとして定義しなおします。回転角thetaを5rとします。これでPartIDの位置を元にした角度が求まります。cos(theta)とsin(theta)を求め、r×con(theta)をP(0)(x座標),r×sin(theta)をP(1)(y座標)とすると、図形が描けます。つまりデカルト座標のスパイラルの式そのものをmathmixに書いています。

プログラムのPOP部分移行は点を線にして2次元化する方法です。pop to CHOPでデータにしてこれをchop to SOPで3Dにします。この時点の間が補間されます。後はいつものようにgeo COMPとrender TOPで2D化しています。この画像がスパイラ画像の左側です。

フィロタキシス

2025.05.17のblog「「再帰」とは、L-system, フラクタル, フィボナッチ, フィロタキシス」でフィロタキシスを描いています。この時は具体的にプログラムを紹介していませんでした。描き方は前節のスパイラル図形と同じですが、2つ目の例として紹介致します。
フィロタキシスの式は

です。黄金角は円周を1:(1+sqr(5))/2 に分割する角度のことで、137.5°になります。(1+sqr(5))/2がフィボナッチ数列に現れる黄金比であること、ひまわりの種の並び等、自然界に表れるという点で神秘性を持つ関係です。
次の図はフィロタキシスの図形とそれをchop to SOPで3次元化した場合の図形です。

chop to SOPを行うとpoint間が繋がります。番号順に繋いでいくので、形状が変わって見えています。プログラムは次です。

基本的にはスパイラル図形の場合と同じです。constant CHOPはpoint数(2000)と黄金角の137.5です。pattern CHOPで数式にあるnを設定します。typeはrampです。point数であるlengthを2000としました。ここで重要な点としてpattern CHOPのAmplitudeも2000に設定することです。何故なら数式のパラメータであるnは順番ですので、0, 1, 2・・・の整数にする必要があるからです。例えば通常のようにAmpliude 1ならx軸が1増える毎にy軸は1/2000ずつ増えるので0.0005, 0.001・・・となります。それではnは0, 1, 2・・・となりません。そこでAmplitudeの2000にして0, 1, 2・・・となるようにする必要があります。当たり前のことですが、patternで整数を作る時は注意しておく必要があります。math chopで137.5を掛け算して、n×137.5を作ります。もう一方で、function CHOPを使ってsqr(n)を作ります。定数のcはc=1です。次にrename CHOPを使ってtx, rzを求め、これをgeo COMPのTranslate xとRotate zにインスタンシングします。これでフィロタキシス図形の左図ができます。次は各pointを線でつないだ右図を作る方法ですが、これはselect CHOPを使ってtxとrzに分けてtransfrom CHOPによって、tx, ty, tzに変換します。これをchop to SOPにすることで3D化します。この時各ポイント間は線で結ばれます。これをgeo COMP, render TOPで2次元化すると出来上がりです。

次にPOPによる作製方法を紹介致します。描いた画像は次になります。

プログラムは次です。上の図の左側がPOP部分の図で、右側がSOPに変換後2D化した図です。

POP部分でフィロタキシスが描けます。line POPで(0,0,0)-(0.5,0,0)を799分割し800point作製しました。次のparticle POPで属性PartIdを持たせます。この時Maximum Particlesを800にして数を合わせます。mathmix POPで数式を書いていきます。この時PartIdは最初から整数ですのでこのまま使えます。入力図は次です。

距離rをPartIdのルートにより作製し、これに137.5を掛けて角度thetaを作ります。r×sint(theta)とr×cos(theta)を作り、それぞれをP(0), P(1)に設定すると画像が得られます。後はこれまでと同様、chop to SOPを使って各point間を接続し、geo COMPとrender TOPを使って3Dを2Dに変換しています。

最後にparticle POPをInitialize, startして描いた映像を示しておきます。

まとめ

距離と回転角で定めることができる図形の描き方を、CHOPを使ってインスタンシングする方法とPOPを使う方法、及びSOPに変えてから2D化することでポイント間を結ぶ方法を述べました。例としてスパイラルとフィロタキシスを試しました。実際使う上ではどちらでも構わないと思います。ただ数式を直接使うPOPは、より汎用的な方法だと言えるでしょう。この他にもGLSLを使う方法があります。GLSLが不得意な私としては、POPは数式を直接使えるありがたい機能です。

コメント