Sweepを使用してカーブに沿ったパイプを作成した場合に、UVをカーブの長さに合わせたいと思います。
まずは、パイプを作成します。
これでジオメトリは作成できますが、UVは持っていません。
UV TextureノードをカーブとSweepの間に追加します。
UV TextureノードでTexture TypeをArc Lengthに設定し、Attribute ClassをPointにします。
UVEditorを確認すると以下のようにカーブのUVが生成されます。
この状態だとカーブを移動しても、それにあわせてUVが変わることはありません。
そこで、UV TextureノードのScale Xに以下のエクスプレッションを追加します。
arclen("../curve1", 0,0,1)
arclenは描いたカーブの長さを取得することができます。
Curve1は求めるカーブ、その次の0はプリミティブ番号、その次の0はUの開始値、最後の1はUの終了領地になします。
これでカーブのポイントを移動すると、それに応じてUVの位置が変わるようになります。
これをもとに、パイプジオメトリにUVを設定します。
SweepのOutputにuvと入力し、カーブのUVをジオメトリに渡します。
pointVopを接続します。
pointvopの中に入ります。
moduloを作成します。このオペレーターは名前の通りモジュロ演算を行います。
※Wikiより、剰余演算(モジュロとも呼ぶ)は、コンピュータにおいて、ある数値を別の数値(法と呼ばれることもある)で除算し、余りを取得する演算である。
geometryVopGlobalのptnum(ポイント番号)をmoduloのinput1に入力します。
このパイプはDivision=12のCircleから作成されています。
そのため、作成されたポイント番号も0から始まり12までで1つの繋がりを作成し、次にセクションが作成されています。
UVを作成する場合、0から12まで(1サークルのポイント数)までで1つの区切りとしてこれを縦の軸していきます。
ということで、取得したptnumをサークルのポイント数を使用してモジュロします。
paramオペレーターを作成し、名前そslidesに設定します。
TypeはCircleのポイント数を入力するためIntegerにします。
paramオペレーターを追加すると、その上部であるpointVopノードのslidesという名前のパラメーターが追加されたことがわかります。
CircleのDivisionをCopy Paramterして、
pointVopのslidesにPaster Relative Referenceします。
ただし、このままだと12という数字が入力されてしまいます。実際には0から開始し、12までとなるので常にCircleのDivisionに+1した数値が必要です。
add constを追加し、1を追加します。
Add constの結果をmoduloに接続します。
これで、常に0から12の間に数字がクランプされます。
次にこの0から12までの数字で0から1の間に等間隔に並ぶようにします。
12を0-1に等間隔に並べるためのXは1割るslidesで算出できます。
constantオペレータで1という数字を作成し、それをslidesで除算します。
その結果をMuduloで計算された0-12の数字にかければ、Vの値が決まります。
この結果の計算値は常にfloatなので、UVにするためにfloattovectorを作成し、fval2(つまりはv)に接続します。
更に2つ目のparamを追加します。
ここには、先ほどカーブに設定したUVをもってきます。
Nameをuvにします。popvop
paramオペレーターはNameに既に存在するパラメーターを入力すると、そのパラメーターを参照するようになります。今回はuvとしたので、このpointvopに入力した時点で持っているuvの値を参照します。
これでUとVの値を作ることができたので2つのVecotを足し算します。
最後にBindを作成します。
bindのNameをuvとし、TypeをVector(float)に設定します。
Use This Node to Set Parameter Attributesを有効にします。
ExportをWhen Input is Connectedに設定します。
Game Dev ToolsのUV Visualizeを接続してみると、元のカーブに合わせてUVが設定されていることがわかります。後からカーブを編集しても、UV Textureでカーブの長さからUの値を取得しているので、常にこの状態を保つことができます。