blender-environment-kits について
blender-environment-kitsは、地形生成、アセット散布、モジュール式環境パーツの検査を行うBlenderスキルです。ゲーム環境アーティスト向けに、地形作成、プロシージャル配置、キット検証のスクリプトを備えています。
主な機能
- 01プロシージャル地形とハイトマップの生成
- 02ハイトマップと地形スプラットマップの書き出し
- 03傾斜と高さでコレクションを散布
- 04モジュールキットのグリッドとピボットを検証
- 05オブジェクトの変換と原点を修正
活用シーン
- 01ゲーム環境の地形を作成
- 02地形に樹木や岩を配置
- 03ゲームエンジン向けに地形データを出力
- 04モジュール式の壁や床の接合を確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-environment-kitsインストール後、Claude Code で/blender-environment-kitsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/_bpyx.pykit_check.pyscatter.pyterrain.py詳細
環境キット
実行モデルはblender-coreにあります。カスタムGNツールはblender-geometry-nodes、マテリアルはblender-texturing(トリム、頂点ブレンド)、時間帯や天候はblender-time-of-day/blender-weather-fxにあります。
それぞれを1回呼び出す
scripts/terrain.py -- --size 400 --res 513 --height 60 --type ridged --erosion 30 --flatten 0 0 40 --material
scripts/terrain.py -- --heightmap //hm.png --size 1000 --res 1009 --height 120 --export-splat //T_Splat.png
scripts/scatter.py -- --target Terrain --collection Trees --density 0.02 --min-distance 5 --max-slope 25 --height-max 45
scripts/scatter.py -- --target Terrain --collection Rocks --density 0.05 --max-slope 70 --align 0.8 --name ENV_Rocks
scripts/kit_check.py -- --objects SM_Wall_4m SM_Floor_4m SM_Door_4m --grid 0.5 --fix
地形(terrain.py)
--sizemの範囲に、--res²個の頂点でグリッドを作成します。Unityでは2^n + 1(513/1025/2049、.raw16ビットLE)を使用し、UE Landscapeでは推奨サイズ(505/1009/2017/4033、16ビットPNG)を使用してください。1025を超える場合はタイルに分割してください。--type fbm(起伏)、ridged(山岳)、hills(不均一な地形)。--scale= 地形の特徴サイズ(m)。--erosion N= 熱侵食の反復回数(安息角33°):斜面が緩やかになり、土砂が谷を埋めます。--terracem = 段状の平地。--flatten X Y R= 平坦なプレイ/建築エリアを作り、スムーズステップで周囲になじませます。ENV_Slope(度/90)とENV_Height(0~1)のポイント属性を書き込みます。--materialはこれらを使って草、岩、雪を設定します。35°を超える斜面には岩、標高が上位25%で傾斜が約40°未満の斜面には雪を配置し、ノイズで境界を崩します。- エンジン:
--export-heightmap(PNG = 16ビットグレースケール、.raw= 16ビットリトルエンディアン、行0 = −Y端。Unityで反転して表示される場合は垂直方向に反転してください)と、インポート時のZスケールを指定するheightmap_z_scale_m。--export-splat= 地形レイヤー用の16ビットRGBAウェイト(Rは草、Gは岩、Bは雪、合計1)。どちらもRaw(ディスプレイトランスフォームなし)で書き出されます。往復変換誤差は0.001未満です。
散布(scatter.py)
- レイヤーごとにGNモディファイアーを1つ使用します。ポアソンディスク(
--densityは最大密度/m²、--min-distanceはm)に基づき、補間されたサーフェス法線が--max-slope以内で、Zが--height-min/maxの範囲内(オブジェクト空間)の位置に配置します。--mask= 頂点グループまたは密度係数として使う浮動小数点属性(ペイントするか、ENV_Heightを使用してください)。 - コレクションの子オブジェクトはそれぞれの原点を基準に、ランダムなヨー、
--scaleの範囲、--align(0 = 直立した木、0.6~1 = 斜面に沿う岩)でインスタンス化されます。ソースコレクションはビューレイヤーから除外されます。 - 結果では、各インスタンスを実際のサーフェス(
slope_max_deg、height_range)に照らして確認し、ソースごとの数を数えます。インスタンスはインスタンスのまま維持されます。エクスポーターやブーリアン処理で実メッシュが必要な場合にのみ--realizeを使用してください。 - 密度:森林の木は0.01~0.05/m²(最小距離4~8 m)、低木は0.05~0.2、岩は0.01~0.1、草の株は2~20/m²(カメラ付近のみ)。大きいものから小さいものへレイヤーを重ねます。木、幹から離すマスクをかけた低木、草の順です。
- エンジン:glTFでは
export_gpu_instances=True(EXT_mesh_gpu_instancing)、またはUEのFoliage/PCGやUnityのインスタンシングスクリプト向けに--export-points file.json(ワールド変換、Z-up、m、wxyzクォータニオン)を使用します。FBXでは実体化したジオメトリか、インスタンスごとのオブジェクトが必要です。
モジュラーキット(kit_check.py)
- まず寸法を決めます:グリッド(0.5 m単位、1/2/4 mモジュール)を選び、全体で統一してください。屋内の壁の高さは3~4 m(プレイヤーの目の高さは約1.8 m、目線は1.6 m、ドアは幅1 m以上、高さ2.2 m以上)、床は4 × 4 m、階段は蹴上げ0.18 m/踏面0.28 mです。UEはcm単位(インポート時に×100)、Unityはm単位です。
- パーツを一定間隔でスナップできるよう、
--pivot corner(デフォルト)、bottom-center、centerのピボット規約を使います。フットプリントの長さはグリッドの倍数にします。1セルより薄い寸法(壁の厚さ、トリムなど)はグリッドに合わなくてもかまいません。 - 開いたエッジを設けてよいのはパーツの外面(継ぎ目)のみです。内部の穴はエラーです。継ぎ目の頂点はグリッド上に配置し、隣接パーツと視覚的につながるようにします。テクセル密度はキットの中央値から25%以内にします(
--texturepx)。名前にはSM_を付けます(--prefix)。 --fixは回転/スケールを適用し、ジオメトリを動かさずに各原点をピボットへ移動します。リンク複製はメッシュデータを共有するため、ソースは一度だけ修正してください。- トリムやデカール(
blender-texturing)、頂点カラーのブレンド、回転/ミラーのバリエーションを使って繰り返しを目立たなくします(ミラーでは法線が反転するため、blender-asset-qaで確認してください)。継ぎ目は接合部を覆うトリムパーツで隠します。
注意点
- 散布する前に、地形/キットのスケールを適用してください。密度と傾斜はワールド座標基準です。
- 散布の高さはターゲットのオブジェクト空間での値です。地形は原点に配置するか、
--height-*でオフセットしてください。 - ポアソン数が非常に大きいと処理が遅くなります。タイル/エリアごとに散布するか、ビューポートでは密度を下げ、レンダリング時に上げてください。
blender-asset-qa(崖に浮いたインスタンス、デカールのZファイティング)とblender-game-optimization(インスタンス、LOD、ドローコール)で、地形と散布を検証してください。
コメント
Markdown 対応