Blender Geometry Nodes Part 4
hr.icon
1. はじめに
1.1 参考チュートリアル
下YouTubeチュートリアル(Blender 3.4環境)を参考に、Geonemtry Nodeを利用して3DオブジェクトをLEGOブロッグで構成する表現を学ぶ。
YouTubeはBlender 4に対応していない部分(Mesh to Volumeノード)は独自に補足する
https://www.youtube.com/watch?v=LrEHoaq6QFE
参考)同じクリエイターのMinecraft風表現
https://www.youtube.com/watch?v=TUw65gz8nOs
1.2 練習課題2つと最終課題
YouTubeの参考チュートリアルをもとにBeach Ballと小倉城をLEGO化する。
https://gyazo.com/16753f20a36cfa4745a72f9a84942341
https://gyazo.com/a4b13461defe3d2efca7fef64b54ba5f
最終課題は自分の3DスキャンデータをLEGO化する。
https://gyazo.com/a010743868bdae578fc1a6fd58697d45
https://gyazo.com/41bbde15d8343eeec025a1926f91ae65
hr.icon
2. 準備
2.1 素材データ(Beach Ball)のダウンロード
上記URLよりGLBデータをダウンロードする。blendファイルもあるが、バージョン違い等もあり手間が必要なのでGLBデータの方がシンプル。
https://gyazo.com/cae673a3c5936423de71159162d7cc26
https://gyazo.com/a5b8def3d187df85e8ddae6d57d1fdf7
2.2 Blenderへ読み込み
Blenderでbeach_ball_free_download.glbを読み込む。
https://gyazo.com/3fe31ffbb29f4aedbc597ebe21d69f32
Viewport Shading: SolidでMetaCapのCheck Normalに設定する。
左右上下対象に近い物体はNormaプレビューすると方向が確認しやすい。
https://gyazo.com/6b18611a6ae58040260e0e899ba5b6bf
hr.icon
3. Mesh内部へポイント配置
3.1 Geometry Nodesの追加
Geometry Nodes Workspaceに切り替える。
Spreadsheetパネルは3D Vewportから統合する。
Viewport Shading: Solid
Lighting: Metacap
Studio Light: check_normal+y.exr EXR=ハイダイナミックレンジ (HDR) ラスター画像フォーマット
Geometry Node Editor中央上部のNEWを押す。もしくはModifierから追加する。
https://gyazo.com/ea19f8bff71735fb4a02d4c6a7c7b89f
3.2 ノードの検索による追加方法
ノードの追加方法には以下の方法があるが、ノード名がわかっている場合は③の検索文字による追加が効率的。
方法① UIのメニューから
方法② SHIF+Aのメニューから
方法③ SHIT+Aの後、すぐに検索文字を入力
https://gyazo.com/ec8a37f72e347e14d6168760441298f4
3.3 Mesh to Volumeノード
3.2の方法でMesh to Volumeノードを下図のように追加する。
https://gyazo.com/24c1ab6ff5770f6ccdf4dd1d7e6c4b13
Mesh to Volumeノードは通常、雲や霧を作成する前処理。
Meshがなくなり、オブジェクトの内部を扱う場合に用いる。
3.4 Distribute Points in Volumeノード
Distribute Points in Volumeを下図のように追加する。
メモ)Candyで利用したDistribute Points on Facesノードは逆にオブジェクト表面へのPoint処理なので異なる。
メモ)Interior Band WidthはVolumeの境界のボケ具合を調整するもの。5の方法でMesh to Volumeのプレビューをすると理解できる。
https://gyazo.com/f5aa44af43eaa1610cdbd08a21b6afef
Distribute Points in VolumeノードのDistribution MethodをRandomからGridに変更する。
Spacingを極端に下げるとBlenderがフリーズするので数値で0.1以下にはしないほうがよい
https://gyazo.com/0b7e9f5e700ed95fd65e73aea5b79fcd
hr.icon
4. Cubeをインスタンスとして置き換える
4.1 Instance on Pontsノード
Instance on Pointsノードを下図のように追加する。
追加した時点ではインスタンス元を接続していないので、3D Viewportは空になる。
https://gyazo.com/4878ee18ebb93ed93c4cb1d3cc18f338
4.2 Cubeノード
Cubeノードを追加して、下図のようにCubeノードのMeshソケットからInstance on PointsノードのInstanceソケットに接続する。
https://gyazo.com/faa0c3fde5e3b0e7cbc2807c8d314275
4.3 Valueノード
Mesh to VolumeのResolutionをAmountからSizeに変更する。
https://gyazo.com/42e874a333f68f40dcca010d78a4bf65
Valueノードを追加して、以下の3つに接続する。
Mesh to VolumeのVoxel Sizeソケット
Distribute Points in VolumeのSpacingソケット
Instance on PointsのScaleソケット
Valueの数値は0.3程度に設定する。
https://gyazo.com/4f8119f1271b855df7895626a8780bc5
hr.icon
5. 内側のPointを削除(Fill Volume代替) ※YouTubeチュートリアルにはない手法
5.1 独自手法について
YouTubeチュートリアルのBlender 3環境のFill Volumeの設定(YouTube 1:30頃)は、Blender 4環境では使えない。
CubeノードのSizeを小さくして確認する。
現在のままでは内部にもCubeが配置されていることがわかる。
https://gyazo.com/97b5ebb578529fbf317f257103d8789a
このままでは、見えない部分にもオブジェクトが配置されるため処理が重くなる。
次の手順で、元のBeach Ballオブジェクトと少し小さくしたBeach Ballオブジェクトの間の領域にPointを配置する処理を行う。
Geometry Proximityノードを追加
Group InputノードのGeometryソケットとGeometry ProximityのGeometryソケットを接続
Delete GeometryノードをDistribute Points in VolumeノードとInstance on Pointsノードの間に追加
Compareノード(=Greater Thanノード)を追加
Geometry ProximityノードのDistanceソケットとGreater ThanノードのAソケットを接続
ValueノードのValueソケットとGreater ThanノードのBソケットを接続
Greater ThanノードのResultソケットとDelete GeometryノードのSelectionソケットを接続
https://gyazo.com/a7ca4ec18fbd59a0b20534fb0e8d1a09
Valueの数値を0.1程度に変化させるとCubeが歯抜け状態になる部分があることがわかる。
https://gyazo.com/6f843c4ff50b974d14eefb30a158e45d
ValueノードとGreater Thanノードの間にMathノード(FunctionをMultiplyに変更)を追加して、MathノードのValueは2.0程度に増やす。この方法により隙間にCubeが埋められる。MathノードのValueを上げすぎると内部のCubeも増えるので注意。Cubeのサイズに関係するValueとMathノードのValueはバランスなので、最終段階で調整してもよいだろう。
https://gyazo.com/d8c7cf40c20571fb2ecdd6854928df3b
このあたりからBlenderの処理が重くなるので、編集したら都度保存しておく
hr.icon
6. 特定のノードから最終出力プレビューする方法
途中の処理を確認するには以下の方法がある。
5.1 方法① Link to Viewer
ノードを選択後、右クリックメニューでLink to ViewerでViewノードが追加される。Xで削除。
5.2 方法② Node Wranger Addon
Blender標準のNode Wrangerを有効にする。※演習の前半で設定済
ノードを選択して、Oキー(Link to output node)で確認。戻す場合は、Cmd+Z or Gourp Output前のノードでOキー。
Geometryに関係しない数値を出力するノードには反映されない。
hr.icon
7. レゴブロックの作成
7.1 レゴブロックのサイズ
https://gyazo.com/e5d35168b418dda79cae41d1e402a8b1
底面の1辺を1としたときのサイズ。
https://gyazo.com/ef306acff57ce2f7294efa8feb2d8a1d
7.2 レゴブロックのモデリング
下準備として不要なBeach Ballを非表示にする。
OutlinerでSketchfab_model(Beach Ball)をSHIFTを押しながら非表示にする
=Sketchfab_model/Root/Sphere/Sphere_0を非表示
ルートを非表示にしてもSphere_0は非表示のまま
以下の手順でモデリングを行う。
Add > Mesh > Plane
Edit Modeに切り替える 忘れずに ※Vertex選択モードのまま
Mesh Edit Mode Overlays > Meseament > Edge Lengthにチェック
S(Scale)、0.5、ENTER
E(Extrude)、1.23、ENTER ※このとき上面のVertexの4点が選択されている状態
I(Inset)、0.192、ENTER ※Inset=面を差し込む
E(Extrude)、0.218、ENTER
下方から底面の頂点を選択(一度何もないところをクリックして、頂点を選択し直す)
I(Inset)、0.154、ENTER
側面ビュー、X-Ray: ON(Alt+Z) ※任意
(操作によっては頂点選択し直してもよい)
E(Extrude)、マウスで空洞化する。およそでよい
数値で行う場合は、E、-1.076(1.23-0.154)、ENTER
Edge Lenght表示をオフにする
Edge選択モードに切り替える
トップの4隅のEdgeを選択
Cmd+B(Bevel)、マウスホイールで分割数をアップして、およそ丸に近い状態に加工する
AキーですべてのEdgeを選択して、MキーでMerge > By Distance
一定距離以下で頂点をマージする
Adjust Last OperationでMerge Distanceを0.01程度に調整
ざっくりな加工だけど円に近くして、近づきすぎた頂点を融合させることが目的
これをしないとBevelが処理されない
Object Modeに切り替える
ModifierでBevel ※Edit ModeのBevelではないので注意
Amount: 0.02
Shade Auto Smooth
OutlinerでPlaneの名称をLEGOに変更
https://gyazo.com/b8fe4a1a5aa4133c9801ccc3b261c184
hr.icon
7. LEGOブロックのインスタンス処理
7.1 準備
LEGOを非表示にする
Sketchfab_model(Beach Ball)を表示する。
Sletchfab_modelを選択して、Geometry Nodeを表示する
https://gyazo.com/dd586371756b3da817e1a354c2453431
7.2 LEGOブロックのインスタンス処理
OutlinerのLEGOをGeometry Node Editorにドラック&ドロップすれば、自動的にObject Infoノードが追加される。
Cubeノードは削除する。
https://gyazo.com/e301c573f06a3fdc11e48d068d32094e
下図のようにObject InfoのGeometryソケットからInstance on PointsのInstanceソケットに接続する。
LEGOオブジェクトはY軸奥が上になっていることが確認できる。
https://gyazo.com/84b123737cf2151250b4029a597aefac
Instance on PointsのRotation Xを90に変更する。
https://gyazo.com/317b405e95ba3362c864bc5643a17258
メモ)YouTubeチュートリアルでは3D Viewport上で回転(R、X、90、ENTER)している。原因不明(Fill Volume代替が影響?)だが、今回の方法ではYouTubeのようにRotationのApplyができないので異なる方法で変更している。
他にも方法はいくつか考えられるが、マテリアルの回転角度にも影響するので、現時点ではこの方法で行っている。どの方法が最適かはわかっていない。
Distribute Points in VolumeのSpacingはValueの値を1:1:1で反映させているので、LEGOブロック同士が重なっている。
https://gyazo.com/b7bf2d8cdbc2f24bc4775c72410210fd
Vector Mathノード(Operation: Multiply)を下図のように追加する。
数値は1, 1.23, 1に変更する。(YouTubeでは1, 1, 1.23だがRotationがApplyできていないので、Y回転を変更している)
https://gyazo.com/a284c206a1c0f9cacccc77f945d4b9bc
メモ)1.23を大きくすれば内側がよくわかる。その状態でGreater Than手前のMultiplyの値を変化させれば、内側の変化もよくわかる。あくまでパラメータの理解のための実験。
https://gyazo.com/1b22a669601996f98aba3b074101e6ad
hr.icon
8. マテリアル
8.1 マテリアル状態の確認
Viewport ShadingをMaterial Previewに変更すると白色になり、Beach Ballのマテリアルは反映されていないことがわかる。
https://gyazo.com/ddab11703693997b614d2f6cf7036361https://gyazo.com/184ecda5f1e5147f162f0258250ac9e1
ModifierのViewport PreviewをON/OFFすれば元のBeach Ballのマテリアル状態と比較して確認できる。
https://gyazo.com/f1c2f1cb2b325133131554535cf8d103
Material PropertiesパネルでScene_-_Rootマテリアルが設定されていることが確認できる。
Scene_-_Rootマテリアルは、beach_ball_free_download.glbに含まれていたマテリアル。
https://gyazo.com/b4cdfc4cc5420b7ee61e0afd09caf0f1
8.2 Materialの設定
Instance on Pointsノードの後にSet Materialノードを下図のように追加して、Scene_-_Rootを設定する。
黒色になる。(原因はShader EditorのColor Attributeのようだがまだ理解できていない)
https://gyazo.com/e1d56bced3b72f057fbcbf246337c8e9
Shading WorkspaceもしくはShader Editorを表示する。
https://gyazo.com/287119fc621591aecbbd33b6eecfdbfd
Mix Vertex Colorノードを削除
Color Attributeノードを削除
BASE COLORノードのColorソケットとPrincipled BSDFノードのBase Colorソケットを接続
https://gyazo.com/24ae66c72fd4027cf0b02530fe13c008
LEGO一つずつにMaterialが貼られているので、LEGO全体でBeach Ballに見える設定に変更する。
Geometry Node Workspaceに切り替えて、以下の手順で編集する。
Named Attributeノード
Data Type: Vector
Name: UVMap(プルダウンリストから選択)
Sample Indexノード
Data Type: Vector
Domain: Face Corner(プルダウンリストから選択)
Sample Nearestノード
Domain: Face Corner(プルダウンリストから選択)
さらに、下図のように接続する。
https://gyazo.com/a49fe89605de780fd39df1c47734eba6
Store Named Attributeを追加(Instance on PointsとSet Materialの間)
Data Type: Vector
Domain: Instance(プルダウンリストから選択)
Name: UVMap
https://gyazo.com/5c7ad10b0eaa18d03b2007673f0e0c37
Shading Workspaceに切り替える。
Attributeノードを追加
Type: Instancer
Name: UVMap(手入力)
VectorソケットとBASE COLORのVectorソケットを接続
https://gyazo.com/4e0ebeba392e14323de0a5a944d281d1
メモ)Edit Modeで回転すれば、LEGO配置はそのままでマテリアルのみが回転する
メモ)複数のマテリアルがある場合は、処理が複雑になるので実質難しいので、複数マテリアルを一枚にベイクしてから処理したほうがよいかも。
hr.icon
8. パラメータをModifierパネルに取り出す
8.1 Valueの取り出し
ややこしい、他にも効率的な方法があるかも
Geometry Nodes Workscapeへ切り替える。
Group Inputを複製(SHIF+D)
Add > Layout > Rerouteを追加
Rerouteの移動はGキー
ValueノードのValueソケットをCmdを押しながらドラッグしてRerouteに接続
Group Inputの空のソケットとRerouteを接続
Nキーでサイドバーを出してInputの名前をResolutionに変更
Typeをfloatに変更
https://gyazo.com/f6d729dbc439eea3c10f99fa98b2f4a6
8.2 Material設定の取り出し
Group Inputを複製(SHIF+D)
空のソケットとSet MaterialノードのMaterialソケットを接続
https://gyazo.com/1b1a18efec1369a45981e3c64633f03e
8.3 練習課題1の完成
カメラやライトを設定してレンダリングを行う。
https://gyazo.com/6d6c5a168ba3aaf29b9d2ae413a61880
hr.icon
9. (紹介のみ)Sketchfab Addon
Sketchfab Addonを使えば、Blenderから直接Sketchfabデータを読み込むことができる。ただし、ネット環境によっては重いので、普通にDLしたほうが問題が起こりにくいかも。
https://gyazo.com/d90c3f5297b50dc2f23b6ca67deeb1de
hr.icon
10. 小倉城
10.1 小倉城データのダウンロード
上記URLより、GLBデータ(テクスチャ1k、52MB)をダウンロードする。
10.2 Blenderへ読み込む
BlenderデータはBeach Ballのまま続けて行う。
必要に応じてBeach Ball等不要なものは非表示&非レンダリングに設定しておく。
https://gyazo.com/356303cbecc8198930a94603a95f9d97
10.2 サイズの調整
サイズがかなり大きいので、横幅1m程度にスケールする。
サイズ調整後、ScaleをApply(Cmd+A)しておく。
https://gyazo.com/7fa594b5a9fbce495c179f10a84b68cf
10.3 複数オブジェクトの結合
OutlinerでObject_*を複数選択する。このとき、一つはアクティブ(薄いオレンジ)でないと結合されないので注意。
https://gyazo.com/5fa708ccfa359043522fa45b1c98e428
3D Viewport上でCmd+J(結合)する。
Outlinerで一つのオブジェクトに結合されていることを確認する。
https://gyazo.com/6f14ea2233913d5c6f58fe4747658356
10.4 Geometry Nodeの追加
ModifierパネルからAdd Modifier > Geometry Nodeを追加する。
https://gyazo.com/2878a2dbca578d22e2a21dc5e2d5ced0
Browse Node Treeアイコンを押して、Beach Ballで作成したGeometry Nodesを読み込む。
https://gyazo.com/6d13488d42feb4af052ce82a6dbd1757
Resolutionはリセットされて0なので、3D Viewportには何も表示されない。
https://gyazo.com/57bb80e83a9a9bd7c366e99ed253c13d
わかりやすくするために、下図の部分を選択して、名称をGeometry Nodes for Beach Ballに変更しておく。
https://gyazo.com/c1d503e6362d21b1e84c432a01e28b80
下図の2の部分をクリックして、Geometry Nodeを複製する。
https://gyazo.com/e281681fcf015f307b3a13df3f2cb74a
自動的に名称が変更される。
https://gyazo.com/0b0f928fb5cc2cc16bdef7408ffa037a
先ほどと同様に、名称をGeometry Nodes for Kokura Castleに変更する。
https://gyazo.com/d06043fe3979fa644f5717fc1982a032
Resolutionを0.2に変更する。
マテリアルはBeach Ballのままだが、LEGOブロッグが反映される。
https://gyazo.com/4b988d7685963df0f1231368ab0e6781
LEGOブロックの向きがおかしいことが確認できる。
https://gyazo.com/8a127ec5cc24d006730423cc7b5cdefa
以下に修正する。
Instance on PointsノードのRotation X: 180
Vector Mathノード(Multiply)のVector: 1.0, 1.0, 1.23
https://gyazo.com/61f60c764c1592a1bbeb81786d7fee51
10.5 マテリアルの設定
Materialをmat0に変更する。
https://gyazo.com/d1326d1b892efbfeb758eb63ea30e9fd
Shading Workspaceに切り替える。
下図の部分は削除する。
https://gyazo.com/3ede9aa1fa53729095fc02250d8eb7cb
Attributeノードを追加
Type: Instancer
Name: UVMap
下図のように接続する。
https://gyazo.com/36cc6a910717f701aa384fd2b74a4606
10.6 練習課題2の完成
カメラやライトを設定してレンダリングする。
https://gyazo.com/59623fc7400c968329a38a167125a609
hr.icon
11. 人体スキャンデータ
11.1 人体スキャンデータの読み込み
3D Scanした自分のデータを準備する。データが重い場合は事前にローポリ化を行っておく。
Blenderデータは小倉城のまま続けて行う。必要に応じて不要なものは非表示と非レンダリング設定にするか削除してよい。
https://gyazo.com/8c2eb31f6634b6ea9ed24e9878365aea
11.2 LEGO化
小倉城を同じ方法でLEGO化できるので、自分で試してみよう。
https://gyazo.com/fa789d5162178761fc9c59f64594ceef
LEGOブロックを前に向ける。
https://gyazo.com/e03e2f18c755bb1ec7f1fb949de4e68f
細身になる場合は、Mesh to VolumeのDensityを上げる。
https://gyazo.com/03a424b2093e65c9e8461e45e4902903
1.3 最終課題
カメラとライトを調整してレンダリング。
https://gyazo.com/47187b8ead47cb2e2acbbba290c7a980
https://gyazo.com/41bbde15d8343eeec025a1926f91ae65
hr.icon
参考)日野キャンパス
https://gyazo.com/969efd46faf2450dc8ff3abac734f93a
https://gyazo.com/9d7e1d835aad8af3e03009b918a88954
3D Google Mapを利用して街のLEGO化もできるだろう。
参考