ジオメトリノードでキャタピラ（履帯）を作る

Blenderでキャタピラを作る方法を検索すると
配列複製で形状を並べて　カーブで曲げる　といった方法がよく出てきます
一見うまくいっているように見える簡単な方法ですが
履帯一個一個のパーツを見ると台形状に変形したり　曲がってほしくない部分で曲がってしまいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/efee3359-4df7-cffd-ca04-e368512a79ec.png)
大きく映すことがなければ問題ないでしょうが
ジオメトリノードを利用した変更しないキャタピラの作り方を書いておきたいと思います
Blender3.3環境での画面ですが　以降のバージョンでも大きな変更はないかと思います
## キャタピラの構造
本来のキャタピラの構造は
地面に接地する「履版」と　履版同士をつなぐリンクやピンでできています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/0aecbd9f-8fea-73e0-a099-690bed086315.png)

3Dでキャタピラを作るためには
軌道にあたるカーブと　個々の履板のオブジェクトが最低限必要です
コマのオブジェクは　ピンが刺さる部分の片方に原点があるようにオブジェクトを作成してください
また、ピンが刺さる部分同士の幅は自分で覚えておいてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/e616796c-302e-a464-fd6e-c956160728a4.png)


## パーツの配列
カーブにジオメトリノードを作成して　履板のオブジェクトをカーブに沿う形で配置していきます
この辺りは以前に書いた「カーブに沿わせたオブジェクト配置について考える」とも共通しています
https://qiita.com/yukimituki11/items/94cc61828eb1d6080db7

ジオメトリードでオブジェクトを配置する基本は　配置座標を決める情報「ポイント」を作成して
ポイントに指定したオブジェクトを配置する「ポイントにインスタンス作成」を利用します

軌道のカーブ上に配置するには「カーブのポイント化」の利用します
長さを指定することでポイントが均等に配置されます
長さは　ピンが刺さる部分同士の間隔にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/a04c2fcd-5942-ca3a-85c4-d5e0160c2b48.png)



## パーツの回転
配列をしたままだと　元のオブジェクトと平行に並べたようになるので　回転させます
カーブのポイント化では元のカーブを元に回転を取得できますが
サンプリングをした位置での接線になるので　大きく曲がる部分では曲がり方にズレが出てしまいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/80b9959b-9007-1056-9380-f11d0d07c81c.png)
そのため　回転を自分で計算する必要があります

回転の計算は
隣のポイントの座標を取得して　位置ベクトルの差分をとることで計算します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/bdd85a1d-9bb5-d95c-6beb-6bcfee3c0818.png)
オイラーをベクトルに整列で　方向ベクトルを回転の値に変更できます

この時に裏表が逆転して配置された場合には計算で変更もできますが
軌道用のカーブの向き自体を反転してしまった方が楽かと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/0dd1e110-8870-e728-321e-c71f851314cd.png)

さて、キャプチャでは一見これでうまくいっているように見えますが
ループの最後のポイントでは　存在しないポイントのインデックスを指定しているので回転が計算されていません。

ポイントがいくつあるか「属性統計」を利用して取得して
最後のポイントの差分計算に最初のポイント（インデックス0）を利用するようにノードを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/e647d392-7bc6-67ad-8959-a09d3b48c2f9.png)
これで基本形は完成です

:::note
追記：Blender 3.6以降では属性統計のインデックスが
インデックスサンプルとして個別のノードになったようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/cb70f8cd-8c23-a6f7-4914-3f49d69eee73.png)

:::

# キャタピラの移動(オフセット)
静止画用途ならこれでいいのですが　このままでは走行する動画を作ることができません
カーブ上の位置のオフセットをする方法を考えます

「カーブのポイント化」のノードは位置のオフセットを設定する機能がないので
このノードを別の計算で置き換えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/24f28809-359f-ffc0-b13e-f5c2a869c04f.png)
カーブのスプライン上の座標は　始点を0　終点を1.0とした係数で表すこともできます
「カーブサンプル」で一旦カーブの制御点の数を作成したいポイントの数に増やしておいて
「カーブリサンプル」でオフセットした座標の値を取得するという形をとりました

さきほどの回転の計算も調整して加えるとこんな感じになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/14665679-14a4-76b8-ed8e-bfccd73e2d56.png)
ポイントの個数を途中で計算しているため　それを利用することで少しだけ計算が変わっています
（個数は1始まり　ポイントのインデックスは0始まりなのに注意が必要です）
# ノードグループ
グループ入力の項目を設定して　ジオメトリノードとしての仕上げになります
![23121401.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/b8f2ec93-6eaa-ccd3-3475-07b4cc001de7.gif)

# 宣伝
今回の技術は　来春公開の映画でも使用しています
他にも多くの場所でBlenderを利用していますので　今後の情報をご期待ください

https://twitter.com/kurayukabaINFO/status/1732897780551557208