Blenderのジオメトリーノードでハニカム配置

## やりたいこと

下図のような**ハニカム状に配置されたオブジェクトをジオメトリーノードで作成する方法**の紹介です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8e11c6c9-983b-f8b1-d494-657f308798b7.jpeg" width=400">

通常は、下図のような「2つの六角形」をx方向とy方向に配列モディファイアーで伸ばせば作成できます。
ここでは、配列モディファイアーを使わずに、Blender3.1のジオメトリーノードを使って作成してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9e173ad3-d6ee-135a-a71e-36b5bc6e2b5e.jpeg" width=200">

※ ちなみに、シンプルなハニカムであれば、`Add Mesh: Extra Objects`アドオンを有効にして、追加→メッシュ→その他→Honeycombで作成できます。

## やり方

プリファレンスのアドオンから「Node Wrangler」を入れておいてください。

元になる六角形を作成します。以降では、六角形の半径は1として進めます。

- `Shift + A`（追加）→メッシュ→円
    - 画面左下のオペレーターパネルで下記を設定
        - 頂点：`6`
        - フィルタイプ：`Nゴン`

画面を分割するか、今回使わないタイムラインの画面からジオメトリノードエディターを開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/fadcd7b2-eb48-6641-75fd-02c656d29afa.png" width=600">

六角形を選択して、ジオメトリノードエディターの新規を押します（これによりモディファイアープロパティにジオメトリノードモディファイアーが作成されます）。ジオメトリノードエディターのサイドバーは、`N`を押して一旦閉じましょう。

まずは、下図を作ってみましょう。下図では、わかりやすいようにオブジェクトプロパティのビューポート表示のワイヤーフレームをONにしてます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9e173ad3-d6ee-135a-a71e-36b5bc6e2b5e.jpeg" width=200">

- `Shift + A`（追加）→ジオメトリ→トランスフォーム（ノード間の緑のリンクが白く変わるところでクリックし、接続されるようにしてください）。項目を以下のように設定します。
    - 移動X：`sqrt(3) / 2`
    - 移動Y：`1.5`
- `Ctrl`と`Shift`を押しながら、「グループ入力」ノードから「トランスフォーム」ノードにドラッグしてください。下図のように「ジオメトリ統合」が作成されて六角形が2つになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a705773d-c890-ce4e-11a5-cb71e4729427.jpeg" width=700">

このあと「数式」ノードをたくさん使います。`Shift + A`（追加）のユーティリティの数式を右クリックし「お気に入りツールに追加」すると良いでしょう。`Q`（お気に入りツール）から使えます。
また、以降では「`Shift + A`（追加）」の表記は、煩雑なので省略します。

ジオメトリーノードで配列モディファイアーが使えればよいのですが、Blender3.1にはまだありません。ここでは、カーブを作り、ポイントにして、ポイントに配置して増やします。先は長いですが順番に作成していきましょう。ノードをたくさん作るので画面を広げると作業しやすいです。

- ユーティリティ→数式
    - 追加を`積和算`に変更
    - 乗数：`sqrt(3)`
    - Addend：`-sqrt(3)`

ここで、下図のように値のスロットから「グループ入力」の空のスロットにドラッグしてください。ドラッグの順番は逆でもOKです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/59330ffd-0447-5777-1c1e-1f2f103d6399.png" width=300">

- 入力→整数
    - 値を1

- 「積和算」を選択し、`Shift + D`（複製）で複製し複製元の積和算の下に配置してください。
    - 値：「整数」の整数からドラッグ
    - 乗数：3
    - Addend：-3

- ベクトル→XYZ合成
    - X：上の「積和算」の値からドラッグ
    - Y：下の「積和算」の値からドラッグ

ここまでで、下図のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/69b25ed6-d536-4b62-d826-fbffcc373991.png" width=400">

続きます。

- カーブプリミティブ→カーブライン
    - 終了：「XYZ合成」のベクトルからドラッグ
- ユーティリティ→数式
    - 追加を`最大`に変更
    - 上の値：「グループ入力」の値からドラッグ
    - 下の値：「整数」の整数からドラッグ
- カーブ→カーブからポイントへ
    - カーブ：「カーブライン」のカーブからドラッグ
    - 数：「最大」の値からドラッグ
- インスタンス→ポイントにインスタンス作成
    - ポイント：「カーブからポイントへ」のポイントからドラッグ
    - インスタンス：「ジオメトリ統合」のジオメトリからドラッグ

「ポイントにインスタンス作成」の出力のインスタンスから「グループ出力」のジオメトリにドラッグしてください。
下図のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/26dfc197-b7f9-de23-66d2-a0cfc2ab9489.png" width=800">

上図の赤い枠になっている7つのノードを選択し、`Ctrl + G`（グループ作成）でグループを作成します。
「グループ入力」の値が4つありますが、2つで良いので上2つの値から「最大」の2つの値につなぎ直します。また、`N`（サイドバー）でサイドバーを出し、グループの入力から下2つの値を削除します（`-`ボタンで削除）。
さらにサイドバーで、2つの値のタイプを`整数`にし、名前を`NumX`と`NumY`に変えてください。上の「積和算」につながるほうが`NumX`です。入力の順番は、リストの右の三角のボタンで変更できます。下図のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/b7382d17-6848-04c8-3583-004abce2fb8f.png" width=700">

`Tab`でグループ編集から戻ります（もう一度グループ編集するのも`Tab`です）。

さて、`NodeGroup`という深緑のノードができています。わかりやすいように名前を`Dup`に変えてください。入力できるところで変更できます。

「整数」ノードは、グループの入力にするために作成していました。もう不要なので削除してください。削除したら`NumY`は1にしてください。

この`Dup`ノードが配列モディファイアーに相当します。今作成したのはX方向の複製でした。Y方向にも複製しましょう。「Dup」を複製して右に配置し、インスタンスがつながるようにしてください。ちなみに、このグループは、「`Shift + A`（追加）」のグループからも作成できます。

複製した「Dup」の`NumX`を1にし、`NumY`は「グループ入力」の空のスロットからドラッグしてください。
また、グループ入力の値のタイプを`整数`に、名前を`NumX`にしてください。下図のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/17de335e-974c-6022-a6f9-55950badb6f7.png" width=700">

完成です。

サイズはモディファイアープロパティから変更できます。`NumX`を5に、`NumY`を2にしてみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/114e35a2-44b1-c117-7989-3c62e59e1d5d.png" width=200">


3Dビューポートでは、下図のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8e11c6c9-983b-f8b1-d494-657f308798b7.jpeg" width=400">

Y方向は、2個組で1段なので、`NumY`を2にすると4段になっています。
また、メッシュを変更すると下図のように反映されるのが確認できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/1b8f35c3-5122-6f3d-8636-b6c47562292a.png" width=400">

なお、今回作成したジオメトリーノードモディファイアーは、アセットとして登録できるようです。

## 追記（もっとシンプルな別の方法）

上記では、配列モディファイアーのように並べるために、カーブに変換していました。
しかし、メッシュラインを使うと、下記のようにカーブを使わずに並べることができます。こっちの方が簡単ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/cab4551e-ae12-2acc-6b87-c7bde155f4c6.png)

以上