scenario-blender-hard-surface について
機械部品や曲面モデルの作成と確認を行う、Agent向けのBlenderハードサーフェススキルです。モディファイアースタック、ブーリアンカッター、ベベルとシェーディングの監査に加え、ゲーム用ジオメトリの手順も扱います。
主な機能
- 01ブーリアン方式とサブディビジョン方式を選択
- 02モディファイアースタックを構築・整列
- 03ブーリアンカッターを作成・検証
- 04ベベル、法線、シェーディングを監査
- 05ゲーム用の三角形メッシュを作成
活用シーン
- 01複数のカットがある平面部品をモデリング
- 02サブディビジョンケージで曲面シェルを作成
- 03ブーリアンカット周辺のベベルを確認
- 04ミッドポリのゲームアセットを準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-blender-hard-surfaceインストール後、Claude Code で/scenario-blender-hard-surfaceを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdprocedures.mdsources.mdscripts/bx_hardsurface.py詳細
Blenderのハードサーフェス
熟練のハードサーフェス制作では、エッジに当たる光を制御します。ベベルやサポートループによって各エッジにハイライトが生まれ、平面は完全な平面に見え、デザインが固まるまではカットを編集可能な状態に保ちます。手法(Nゴンとブーリアンか、クワッドケージとサブディビジョンか)について意見は分かれますが、確認項目については共通しています。操作の順序、カッターの管理、平面、光沢のあるマットキャップでのオービットです。エージェントはツールキットでスタックを組み立て、測定可能なゲートで、人がオービットしながら確認する問題を見つけます。ここで名前が挙がっている関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で進める場合は、ツールのスキーマに従って作業し、不足している点を明記します。
必須の背景知識: scenario-blender-expert(実行チャネル、レビューループ、5.2のAPI変更)。
ツールキット:scripts/bx_hardsurface.py
(import sys; sys.path.append("<skills>/scenario-blender-hard-surface/scripts"); import bx_hardsurface as HS)、
ワールド空間のメートル単位、標準のBlenderのみ。
基本方針(熟練者との差が出る点)
- 最初にカットし、次にベベルを追加し、最後に法線を設定します。 角度制限のマイクロベベルより上にブーリアンを配置し、最下部にWeighted Normalを置き、その上に後からMirrorを追加します(Ryuu [00:26:26]、[00:28:37];du Mont
[00:19:46])。5.2では、ピン留めされたモディファイアーはピン留めグループ内で相対的な順序を保ち、新しいモディファイアーはその上に追加されます。そのため、下から順にピン留めします。
HS.order_stackがこれを行い、HS.add_booleanは常に末尾の上に追加されます(検証済み)。 - ベベルは2種類、それぞれ役割が異なります(du Mont [00:12:25]~[00:15:15])。カットの前に、選択したシルエットエッジにデザイン用の幅制限ベベル(8~12セグメント)を適用し、すべてのカットの後に、角度制限マイクロベベル(30度、Harden Normals、Miter Outer Arc)を適用します。現実には完全に鋭いエッジはないためです(Gambrell、du Mont、Ryuu)。
- ブーリアンの後にベベルが縮むのは、設定ではなくジオメトリの問題です(du Mont [00:20:18]、
[00:30:20])。カッターを対象のエッジから十分に離すか、ぴったり一致させます。Clamp Overlapはオンにします。Clamp Overlapはオブジェクト全体にわたってベベルを制限します。面のエッジから0.7度ずれたスロット(クランプ比3.8)によって、部品の別の箇所にある3 mmのベベルが消えました[5.2.1で検証済み]。
HS.clamp_culpritsで原因となったカットを特定できます。 - 壁、段差、隙間、丸みを構成する面はすべて、マイクロベベル幅の2倍より広くする必要があります[追記、検証済み]。ポケット底面が1 mm、壁が1.5 mm、溝が2 mmでベベルが1.5 mm(3.1 mmの溝は問題なし)、30度の面で丸めたスロットは、いずれもオブジェクト全体のベベルを制限しました。
- Harden NormalsやWeighted Normalで何も変わらない場合、その面は平面ではありません(Gambrell [00:01:06])。平面にしてください。法線モディファイアーを増やしても改善しません。
- 好みではなく、部品に応じて手法を選びます。 多数のカットがある平面加工部品には、Nゴン+ブーリアン+ベベル+カスタム法線を使います。作業時間はおよそ4分の1で、編集可能な状態を保てます(Gambrell [00:18:01])。連続した曲率、不均一な丸み、スカルプト、または高解像度ベイクには、クワッドケージ+サブディビジョンを使います(rileyb3d、PzThree)。サブディビジョンのエッジを鋭くするには、クリースではなくサポートループを使います。同等の品質で三角形数は36,800対3,600です(Lampel [00:05:28])。
- ソルバーにはEXACTを使います。 Gambrellの2021年の「Fastに切り替える」という助言は5.xより前のものです。Floatでは非多様体エッジが16個残りましたが、同一平面上のカッターでExactとManifoldは問題ありませんでした[検証済み]。Exactが正しく動作しない場合、問題はオペランド側にあります(Ryuu [00:15:13])。開いたカッターではExactに非多様体エッジが19個生じ、Manifoldではカットが警告なくスキップされました[検証済み]。
- 光沢のあるマットキャップで確認し、すべてのカットを拡大してチェックします(Gambrell [00:00:33]、rileyb3d [00:06:32])。オブジェクト全体を写したシートでは、汚れや縮んだベベルを見落とします。
まず確認すること
| 入力項目 | 計画が変わる理由 | 指定がない場合のデフォルト |
|---|---|---|
| 目的 | レンダリング:3つ以上の微細セグメント(Gambrell)。ゲーム向けのミッドポリ:1〜2セグメント、三角形化し、カスタム法線を使用。ベイク:サブディビジョンまたはブーリアンの高ポリモデルと、別個の低ポリモデル | レンダリング向けのまま |
| 実寸 | ベベル幅は絶対値です。du Montは、小型ロボットのボディに約3 mm、小さなパーツに1 mm、カラーに0.1 mmを使用します | 実寸でモデリングします。不明な場合、微細幅は最大寸法の0.5%です[追加] |
| 表面 | 主に平面か、曲面か、有機的な機械形状か | 平面パーツにはSchool A、曲面シェルにはB、混在する場合はハイブリッド |
| 予算とエンジン | Augusto:15k tris、2Kマップ1枚。四角形のみのパイプラインではSchool Bが必須です(Gambrell [00:24:35]) | 予算がなければ、trisを報告します |
| 後続工程 | スカルプトによる損傷やマルチレゾリューションのディテールには四角形のケージが必要です(PzThree)。リギングには折りたたんだ複製が必要です(du Mont) | なし |
| 対称性 | パーツが対称なら対象物をミラーリングします。カットのみが対称なら、対象物を中心にカッターをミラーリングします(Gambrell [00:14:53]) | リファレンスを確認します |
ワークフロー
- 実寸でブロックアウトします。 プリミティブまたは bmesh を使い、その後
HS.apply_scale(ob)を実行します(子オブジェクトの位置を保ち、負のスケールでは面の頂点順を反転します)。長い焦点距離のレンズを使い、人間サイズのボックスと比べてプロポーションを確認します(du Mont [00:10:01])。ゲート:ベベル、ソリッド化、または配列モディファイアーを持つすべてのオブジェクトのスケールが 1 であること。シルエットシートを確認します(bx_review.review(..., modes=("silhouette",)))。 - 方式を選び、ベーススタックを組み立てます。
- A:
HS.find_edges(ob, min_angle=80, inside=...)でデザインエッジを選び、HS.set_edge_attr(ob, edges, 1.0)を適用してから、HS.hard_surface_stack(ob, micro_width=..., design_width=...)を実行します。 - B:bmesh でクワッドケージを作成します(制御点を少なくし、正方形のクワッドを使います。rileyb3d / PzThree)。その後、
HS.subd_stack(ob, support_width=...)(ベベルウェイト、均等なセグメント、プロファイル 1.0、UV Smooth Keep Corners を設定したサブディビジョン)または明示的なHS.support_loopsを使います。ゲート:HS.stack_problems(ob) == []であり、A では評価済みメッシュにカスタム法線があること。
- A:
- カットします(方式 A)。
HS.make_cutter(target, "BOX"|"CYLINDER"|"SLOT", size, location, ...)で、チェックリストを満たすカッターを作成します(スケール 1、スムーズ、Cutters コレクションのみに配置、ワイヤー表示、レンダーで非表示、親子付け、EXACT、スタックの末尾より上にワイヤー表示)。カスタム形状にはHS.as_cutter、スライスにはHS.slice_booleanを使います。ルール:カッターは貫通するすべての面より先まで延ばします。カッターのエッジはターゲットのエッジから十分離すか、正確に重ねます。同じセグメント数のターゲットに対しては、丸いカッターをセグメント半分ずらします(同じ位相では非多様体エッジが 10 本でき、筋が発生しました[検証済み]。make_cutterのデフォルト設定)。丸いカッターの角は、ベベル角より十分小さいファセットにします(90 度あたり 4 セグメント以上)。各カット後のゲート:HS.cutter_report(c, target)に問題がないこと、HS.clamp_probe(target)["ratio"] < 0.1であること、カットのHS.closeupを確認していること。 - デザインパス。 ディテールをまとめ、落ち着いた領域を残し、隣接する特徴と位置を合わせます(Ryuu [00:28:37]、Gambrell [00:34:15])。完璧な交差はカラーの後ろに隠します(du Mont [00:39:36])。ベベルを共有する必要があるパーツは結合します(Gambrell [00:18:57])。ゲート:レビューシートで意図が伝わり、ノイズに見えないこと。
- シェーディングパス。
r = HS.shading_audit(ob); HS.verdict(r)を実行し、続いてHS.review([ob], out, modes=("matcap","reflect","hsgrey","wire"))とクローズアップを確認します。references/critique.mdを参考に、問題を切り分けます。平面上のにじみ、非平面の面、曲面上のカット(まずレンダーで確認します。Harden + WN により、24/48 セグメントの円柱上のカットはすでにきれいにシェーディングされていました。球体ではHS.transfer_normalsにより法線誤差の p95 が 2.79 度から 0.34 度に下がりました[検証済み])、ミラーシーム(HS.mirror_seam_fix)。ゲート:判定結果が空であるか、残っているすべての行について説明があり、クローズアップの結果とも一致していること。 - 方式 B のディテールとピンチを確認します。 ベベルセグメントを均等にし、プロファイルを 1.0 にして、Keep Corners を使います(Lampel [00:11:15])。リッジの両側を均等に補強します(rileyb3d [00:11:08])。インセットした円の周囲にボーダーリングをアウトセットします(PzThree [00:42:25])。ケージのアーティファクトをデバッグするには、サブディビジョンをオフにします(Gambrell [00:14:44])。ゲート:
r["subd_cage"]のクワッド率がほぼ 100% であること。スカルプトするケージに細長い長方形がないこと。光沢のあるマットキャップのクローズアップにピンチがないこと。 - ゲーム用またはエクスポート用にします。 ミッドポリでは、
g, tris = HS.game_version(ob, micro_segments=1)を実行します(WN の後にカスタム法線を保持したまま三角形化します。カッターを共有するため、配置は変わりません)。glTF ではカスタム法線が 100% 保持されました[検証済み]。ベイク済みアセットの場合、ローポリモデルとベイクデータは scenario-blender-retopology と scenario-blender-uv-baking に入れます。リグまたはエクスポートでは、コピーに対してHS.collapse(ob)を実行します(du Mont [01:07:29])。ゲート:三角形数が予算内であること。三角形のみであること。ゲーム用コピーのマットキャップのクローズアップを確認していること。 - レンダー、判定結果、オブジェクトごとの三角形数、および未検証の項目を納品します。
数値
| 値 | 設定 | 相対値/出典 |
|---|---|---|
| 微細ベベル | 角度30度、レンダー時3セグメント、ゲーム用1~2セグメント、法線をハード化、外側円弧のマイター | Gambrell [00:17:20]、du Mont [00:14:40] |
| 微細幅 | 本体は約3 mm、小部品は1 mm、カラーは0.1 mm | 実寸、du Mont |
| デザインベベル | 制限方法はウェイト、8~12セグメント | du Mont [00:13:32] |
| 大きな転がり曲線 | 46~50セグメント、カッターエッジのベベルは約8~10 | Ryuu [00:12:53]、[00:05:42] |
| 最小フィーチャー | 壁、段差、溝、面取りの幅 > 微細幅の2倍 | [追加、検証済み] |
| クランププローブ | 変位が幅の10%を超えるとクランプと判定 | [追加] |
| ソルバー | EXACT。マニフォールドのオペランドで高速化する場合はMANIFOLD。診断時のみFLOATを使用 | 5.2.1で検証済み |
| 丸形カッター | 作成時に頂点数を設定(ネジ穴は40)、ターゲットに対する位相を半セグメントずらす | Ryuu [00:29:43]、[検証済み] |
| サブディビジョン前のベベル | 2または4セグメント、プロファイル1.0、ウェイト、UV Smooth Keep Corners | Lampel [00:08:06]、[00:11:15] |
| クリース | 小さなディテールやレベル1で粗い円柱を丸める場合に有効。主要エッジでは三角形が10倍になる | Lampel、du Mont [00:52:18] |
| SubDケージ | 円形は本体が18頂点、より密度の高いパーツは36頂点。四角形クワッド | rileyb3d [00:01:34]、PzThree [00:03:15] |
| ミラー継ぎ目の修正 | ベベルのFace Strength Affected+WN Face Influence、ウェイト100 | Gambrell [00:06:57] |
| ゲーム用予算 | 15k tris、2Kマップ1枚、アニメーションするパーツは分離 | Augusto [00:11:48] |
| 計測コスト | ケース:1,984 tris(A)対4,608(B、レベル2)。バレル:7,308(A)、25,728(B)、3,716(A、ゲーム用) | test_03 [追加] |
品質ゲート
コード内(すべてHS.shading_audit内にあり、HS.verdictで確認できます):スケールが適用済みであること;
stack_problemsが空であること;想定される場合はカスタム法線が存在すること;非マニフォールドエッジが0であること;フラットシェーディング面が0であること;非平面のベース面が0であること(許容誤差はサイズの1e-4);にじみがないこと(平面上でコーナー法線が3度を超えて傾いている場合[追加]);45度を超えるハードエッジをまたいでスムージングされていないこと;クランプ比が0.1未満であること;すべてのブーリアン演算でメッシュが変化すること;カッターの検査結果がクリーンであること(同一平面、ほぼ平行、薄い壁、狭い隙間、ニアミス、丸みのあるファセット、突き出し、クリーンアップ)。School B:クワッドの割合、クワッドのアスペクト比、クリースの長さ。ゲーム用:HS.tri_count、三角形のみ。
ビジュアル:HS.reviewの各行で、matcap(形状)、reflect(check_reflection_horizontal:ベベルや丸みの上でもストライプが途切れず続くこと)、hsgrey(ベベルのハイライト)、wire(実際のブーリアントポロジー)を確認します。ビューは正面、斜め前、上、下からです。続いて、shiny(metal_carpaint)でカットごとにHS.closeup(ob, point, radius, ...)を1回実行します。平面上のグラデーションのにじみ、カット部分で途切れたり狭くなったりするベベルのハイライト、曲面のカットコーナーの伸び、ミラー継ぎ目のバタフライ、SubDのピンチ、カット壁のファセットを確認します。真上からの光沢ビューは白飛びするため、上から確認するときはmatcapまたはhsgreyを使用してください。
よくある間違い
| 間違い | 症状 | 修正 |
|---|---|---|
| マイクロベベルより下にブーリアンを配置する | 切断エッジは鋭いままで、他の部分はベベルされる | HS.order_stack(ob) |
| ベベルを固定してから Weighted Normal を追加する | WN がベベルの上に配置され、スミアが戻る | 下から順に固定する(order_stack) |
| カッターをターゲットの面やエッジの近くに置くが、接触させない | オブジェクト全体のベベルが狭くなり、薄い段差ができる | はっきり離すか、正確にスナップする;cutter_report、clamp_culprits |
| 溝や壁の厚さがベベル幅の 2 倍未満 | あらゆる箇所でベベルがクランプされる | 形状を広げるか、ベベルを薄くする |
| 丸いカッターの位相をターゲットのファセットに合わせる | 筋、黒い斑点、非多様体エッジが生じる | 半セグメント分ずらす位相(make_cutter のデフォルト) |
| 30 度のファセットに角を丸めたカッターを使う | マイクロベベルがファセットのエッジを拾い、クランプされる | セグメント数を増やす(beveled_narrow_facet_edges) |
| カッターをフラットシェーディングにする | 切断面にファセットが生じる | カッターをスムーズシェーディングにする(make_cutter が実行) |
| 「Fast に切り替える」 | 同一平面上の面で非多様体の結果になる | EXACT を使う;代わりにオペランドを修正する |
| スケールを適用しない | ベベル幅が均一でなくなる | HS.apply_scale |
| 非平面の面で法線修正を重ねる | 何をしても直らない伸びが生じる | HS.flatten_faces |
| Data Transfer を WN の前に配置する、または頂点グループで範囲を指定する | 効果がない/切断面が表面と同じシェーディングになる | HS.transfer_normals(WN の後に配置し、距離で範囲を指定) |
| du Mont のサポートカットを丸いカットに通す | リムエッジが半分になり、クランプが 0 から 1.2 に変化する[検証済み] | sliver_report でブーリアンのスライバーが示される箇所だけに適用する;前後を計測する |
| 主な SubD エッジにクリースを付ける | 柔らかく、ピンチが生じ、重くなる | サポートループを使うか、細分化の前にベベルする |
| ゲーム用コピーやスライスを移動する | カットが消える(カッターは元のオブジェクトに残る) | そのままの位置に保つか、HS.collapse を実行してから移動する |
Blender 5.2 の注意事項
- Auto Smooth は廃止されています(4.1)。
bpy.ops.object.shade_auto_smoothは、ピン留めされた Smooth by Angle ノードモディファイアを追加します(temp_overrideを使えばヘッドレスでも動作します)。WN、Harden Normals、Data Transfer には Auto Smooth は不要です。 - Boolean ソルバー:
'EXACT'(デフォルト)、'MANIFOLD'(4.5)、'FLOAT'(従来の Fast。5.0 で名称変更)。 - ベベルウェイトとクリースは、属性
bevel_weight_edge/crease_edgeになりました(4.0)。Bevel モディファイアはedge_weightを通じて任意の属性を読み取ります。 ob.modifiers.move(i, j)は、ピン留めされたモディファイアを含む移動を黙って拒否します。modifier_move_to_indexは CANCELED を返します。ピン留めを解除し、下から順に移動して、再度ピン留めしてください。bmesh.ops.bevelのデフォルト値はsegments=0, profile=0.0です。必ず両方を指定してください。- EXACT は、カッターによって生成された頂点にターゲットの頂点グループのウェイトを適用します(検証済み)。そのため、頂点グループを使って Data Transfer をカット面から除外することはできません。
- Bool Tool、LoopTools、Extra Objects は拡張機能です(4.2)。LoopTools の Circle/Flatten/Space は組み込み機能になりました(
mesh.circularize、mesh.flatten、mesh.space_edge_loops_evenly)。Relax と Round Cube は組み込まれていません。
参考資料
references/procedures.md:3 つのパーツ(パネル、両流派のケース、両流派のバレル)について、テスト済みの完全なコード、すべての監査ケース、ゲームのルートを記載しています。スクリプト作成の前に読み込んでください。references/critique.md:レンダーと判定を評価するためのルーブリックとトリアージ表です。シェーディングの各工程で読み込んでください。references/expert-notes.md:専門家の原則、意見の相違、判断条件をタイムスタンプ付きで記載しています。ここに記載のない選択をする場合に読み込んでください。references/sources.md:9 本の動画、各動画の制作者と得意な内容、最適なタイムスタンプを記載しています。