CSGを使う

ℹ️ 留意事項

この記事は Godot 3から Godot 4 へ内容の書き換え中です。 Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリのIssuesまでご報告ください。

これまで、インポートしたモデルを使って3D環境を設計する方法を見てきました。では、壁やドア、スロープなどの要素を含む部屋のようなものを作りたい場合、すでに適切なモデルがない場合どうすればいいでしょうか?そこで活躍するのがCSGです!

CSGとは何ですか?

CSGはConstructive Solid Geometry(空間領域構成法)の略です。これにより、基本的な形状を組み合わせて複雑な立体図形を構築できます。形状は、ユニオン(結合)インターセクション(交差)サブトラクション(減算) といった論理演算によって組み合わせることができます。

CSGは環境やゲームオブジェクトのプロトタイピングに最適なツールです。このチュートリアルの後半では、この技術を活用して、スロープや壁、プラットフォームを備えたシンプルなFPS風レベルを作成します。

その前に、まずCSGノードの動作原理について簡単にご説明します。

CSGの基本概念

新しいシーンを Node3D ルートで作成し、その後子ノードを追加して検索ボックスに「CSG」と入力してください。

alt alt

以下が利用可能なCSG形状です。開始するにはCSGBoxを選択してください。以下のような基本キューブメッシュが表示されます。 プロパティは以下の通りです。

alt alt

操作プロパティは、CSG形状の組み合わせ方法を決定するものです。選択可能なオプションは以下の通りです。

  • Union(結合) - 図形が統合され、内側の領域は削除されます。
  • Intersection(交差) - 重なっている部分のみ保持されます。
  • Subtraction(差集合) - 2つ目の形状が1つ目の形状から「切り取られ」ます。

CSG操作は子形状を追加することで行われます。CSGBoxCSGCylinderの子要素を追加してください。上部のサイズハンドル(オレンジ色のドット)をドラッグして少し高さを変更できます。さらに、プロパティ_Sides_を増やすことでより円筒形に近い見た目になります(ここでは値を20に設定しています):

alt alt

デフォルトでは、形状の演算は[結合]に設定されています。円柱形状がキューブに [追加]されようとしています。これを[交差]に変更してみてください。

alt alt

「減算」について説明します。

alt alt

これら3つの操作を通じて、複雑な形状を作成する可能性がすでにお分かりいただけたことでしょう。

alt alt

CSGCombiner

このノードは「空の」形状です。図形を整理する際に使用します。CSGCombiner の子要素は、上記と同様のルールに従って統合されます。

部屋の構築

以下の機能を備えた実用的なシーンを作成しましょう:障害物を配置した広い部屋と、キャラクターが操作可能で、今後のチュートリアルで活用できる要素。まず、作業を開始できるルートノードとして Node3D を持つ新しいシーンを作成してください。

まず CSGBox を作成し、以下のプロパティを設定します。

  • 幅 (Width) と奥行き (Depth) を 20 に設定
  • 高さ (Height) を 5 に設定

このボックスは内部に侵入するものとして扱う必要があるため、[面反転] (Invert Faces) プロパティも有効にしてください。これにより形状が反転し、内側の壁面が外側になります。さらに、[衝突機能使用] (Use Collision) プロパティもチェックしてください。これにより、物理エンジンはこの形状を静止物体オブジェクトとして適切に処理します。

プレイヤーキャラクターのインスタンスを追加し、新しい部屋で自由に移動できることを確認します。

ヒント

前のパートでは、マウスカーソルをキャプチャ/リリースするコードを追加しましたね。このシーンにも同じコードをコピーする必要があることを覚えておいてください。

機能の追加について

以下は作成を開始するのに役立つアイデア例です。

ヒント

各オブジェクトに CSGCombiner を使用すると、それらの整理や複製が格段に容易になります。必ず Use Collision を有効にしてください。

  • ドア付き壁

以下の手順で進めます。

  1. CSGBox オブジェクトを追加してください。
  2. その幅を 0.5、高さを元の部屋と同じ 5 に設定します(この高さは元の部屋と一致させます)。
  3. 奥行きは部屋の大きさの約半分になるように調整してください。
  4. ここではスナップ機能を有効にしておくと、配置作業をより簡単に行えます。

子ノードとして別のCSGBoxを追加し、それを「Subtract」に設定します。ドアのように見えるようにサイズを調整してください。円柱形状を使用してアーチ状のポータルを作成することもできます。

alt alt

  • スロープ

階段用にはCSGPolygonを使用します。このCSG形状では、指定した多角形を任意の深さまで押し出すことができます。デフォルトでは正方形ですが、頂点の追加・削除もできます。階段の場合、3つの点を指定します。

CSGPolygonを追加します。ポリゴン プロパティをクリックして点の数を調整できます。その後、3つの点を任意の位置にドラッグして移動できます。すべてを正確に配置するには、インスペクターに座標を直接入力できます。

alt alt

この画像では、スロープを作成し、エッジ部分を形成するためにCSGBox形状を何個か追加しました。

alt alt

まとめ

形状には必ず Material を追加し、好みに合う Albedo (アルベド) カラーを選択してください。以下の例では、茶色系の色を選択しています。

以下に考えられる部屋の配置例を示します。

alt alt

再生ボタンを押して、部屋を自由に歩き回れるようになるはずです。

alt alt

現在このエリアには特徴がありませんが、見た目をより印象的にするために、各部屋ごとに個別のライトを追加できます(ライティングに関する詳細は後日解説するチュートリアルで詳しく説明します)。以下に、シーンにOmniLightSpotLightノードを追加する例を示します。

alt alt

まとめ

CSG は、Blender などの別のモデリングアプリケーションを使用せずに Godot 内で直接オブジェクトを構築できる強力なツールです。ゲーム用テストレベルを作成する場合や、最終的な環境を構築する場合に特に役立ちます。ただし、CSG ツリーが複雑になるほどパフォーマンスに負荷がかかる点に注意が必要です。可能な限り CSGCombiner を使用してシーンを複数の独立した CSG ツリーに分割することで、この影響を最小限に抑えることができます。

次のセクションでは、3Dゲームで人気のスタイルである「ファーストパーソン」について解説します。

このレッスンの動画バージョンはこちらからご覧いただけます。