平面の輪郭を描いたものを 3Dの立体にする処理は多くの人が望む手法です
Blenderのジオメトリノードでの方法を検証したので書き留めておきます
BlenderConference 2023の公演内の内容と Teddyアルゴリズムの考えを元にしています
今回のものはBlender 3.3で作成しました
4.1でも同じ挙動なのを確認しましたが。もっと楽な方法があるかもしれません
メッシュの三角分割
まずはBlenderConferenceで見かけた メッシュを細かい三角で分割する手法です
キャプチャの選択表示されている多角形ポリゴンのジオメトリを用意した状態からスタートします
「カーブフィル」のノードではカーブのシェイプ同士を最短で結んだ上で平面として塗りつぶす機能があるようです。
入力メッシュのアウトラインをカーブ化して
それとは別に「面にポイント配置」で適度な距離を保った座標を生成してカーブのスプラインを配置しています
ポイントにインスタンスで配置した状態だと実体をスプラインとしての実体を持たないので実体化を忘れずに。
今回の入力ジオメトリはNゴン状態でしたが
外周にあたる部分をカーブに変換して スプラインを平面上に配置さえできれば他にも色々手段はあります
カーブラインをインスタンス配置すると同位置2頂点になるのですが
フィル実行時に1頂点の扱いになるようです
平面の立体化1
三角で充填した後に 元のメッシュの外周からの距離に応じて応じて移動させれば膨らませることが可能です。
キャプチャでは 多角ポリゴン状態だったので
ジオメトリ削除で面だけを削除すると外周の辺が残り
ジオメトリ近接で 各頂点の辺からの距離が取得できます
単純に距離でを元に移動すると斜面は真直ぐになるので
Floatカーブ等で曲面にしてもいいかもしれません
平面の立体化2
もう少しだけ高度な処理を試したいと思います
冒頭で少し触れたTeddyアルゴルズムでは
- 手描きストロークで囲まれた領域を三角分割
- 内部の辺を2分割した中点を立体の軸と仮定する
- 直交する平面上に中点と外周との距離を元に新しい頂点を作成して円筒状の立体を作る
といった挙動のようですが、
膨らませる移動量の計算に 内部の辺の長さを利用する点を参考にしたいと思います
今回追加した主要な処理部分です
元のジオメトリを三角面化した後に
辺に接する面の数が1つしかない辺(=アウトライン)を削除することで内部に新しく作られた辺だけを抽出しています
「属性転送」を使って内部を三角分割する個々のポイントのから最も近い内部辺の長さを取得して
その長さを直径とします(利用したいのは半径なので0.5倍)
これを立体化するとこんな感じです
Teddyよりも簡易な部分での不具合がありますが 使える形になっているのではないでしょうか
ノード全体
今回のノードの全体はこんな感じです
カーブフィルのおかげでシンプルな構成ですね
英語表示のキャプチャも置いておきます
まだまだ改良点はあるかと思います
何かの参考になれば幸いです