Work in progress
The content of this page was not yet updated for Godot
4.5
and may be outdated. If you know how to improve this page or you can confirm
that it's up to date, feel free to open a pull request.
CSGによるプロトタイピング
CSGは Constructive Solid Geometry (空間領域構成法) の略で、基本的な形状あるいはカスタムメッシュを組み合わせることで、より複雑な形状を作成するツールです。3Dモデリングソフトウェアでは、CSGは『ブーリアン演算』という名でも知られています。
レベルのプロトタイプ作成は、GodotでCSGを使う主な理由の一つです。このテクニックにより、ユーザーはプリミティブを組み合わせることで、レベル地形でよく使われるような形状を作れます。インテリアマッピングも反転したプリミティブで作成できます。
注釈
The CSG nodes in Godot are mainly intended for prototyping. There is no built-in support for UV mapping or editing 3D polygons (though extruded 2D polygons can be used with the CSGPolygon3D node).
プロジェクト用の使いやすいレベルデザインツールを探している場合は、代わりに FuncGodot または Cyclops Level Builder を使用することをお勧めします。
参考
CSGノードを使用してさまざまな形状 (階段や道路など) を構築する方法については、Constructive Solid Geometry デモプロジェクト を使用して確認できます。
CSGノードの入門
Godotの他の機能と同様に、CSGもノードとしてサポートされています。これらがCSGノードです:
CSGツール機能
すべてのCSGノードは3種類のブーリアン演算に対応しています:
Union (和集合): プリミティブのジオメトリを結合させて、共通部分のジオメトリは除去されます。
Intersection (共通部分): ジオメトリの共通部分のみを残し、他は除去されます。
Subtraction (差集合): 第一の形状を、第二の形状で差し引いて、形状に穴を開けます。
CSGPolygon
CSGPolygon3Dノードは、2Dに描いたポリゴン (X, Y 座標にて) を、以下の方法により押し出します:
Depth (深さ): 指定された量で後ろに押し出します。
Spin (回転): 原点を中心に、回転しながら押し出します。
Path (パス): Pathノードに沿って押し出します。ロフティングともよく呼ばれる操作です。
注釈
Path モードを動かすには、まずPath3Dノードを用意しなければなりません。このPathノードにてパスを描くと、CSGPolygon3Dのポリゴンはそのパスに沿って押し出されます。
カスタム メッシュ
Custom meshes can be used for CSGMesh3D as long as the mesh is manifold. The mesh can be modeled in other software and imported into Godot. Multiple materials are supported.
For a mesh to be used as a CSG mesh, it is required to:
be closed
have each edge connect to only two faces
have volume
And it is recommended to avoid:
negative volume
self-intersection
interior faces
Godot uses the manifold library to implement CSG meshes. The technical definition of "manifold" used by Godot is the following, adapted from that library's definition of "manifold":
Every edge of every triangle must contain the same two vertices (by index) as exactly one other triangle edge, and the start and end vertices must switch places between these two edges. The triangle vertices must appear in clockwise order when viewed from the outside of the Godot Engine manifold mesh.
Making an existing mesh manifold with Blender
If you have an existing mesh that is not already manifold, you can make it manifold using Blender.
In Blender, install and enable the 3D Print Toolbox addon.
Select the mesh you want to make manifold. Open the sidebar by clicking on the arrow:
In the 3D Print tab, under Clean Up, click the Make Manifold button:
The mesh should now be manifold, and can be used as a custom mesh.
CSGCombiner3D
CSGCombiner3D ノードは、整理のための空のシェイプです。子ノードを一つにまとめます。
処理の順番
すべてのCSGノードは、まずその子ノードとその演算 (和集合、共通部分、差集合) をツリー順に処理し、それらを自身へ次々に適用します。
注釈
複雑なメッシュは処理に時間がかかるので、性能を上げるためには、CSGジオメトリを比較的シンプルなままに保ってください。(テーブルや部屋の物体など) 複数の物体を一緒にする場合は、それぞれ別のCSGツリーに分けましょう。ひとつのツリーに多くのオブジェクトを入れすぎると、やがて性能に影響が出始めます。バイナリ演算は本当に必要な時にだけ使用するようにしてください。
レベルのプロトタイプ作成
CSGツールの練習に、部屋のプロトタイプを作ってみましょう。
Tip
CSGシェイプを組み合わせるときは、平行投影のほうが見えやすくなります。
これから作るレベルには次のような物体があります:
部屋、
ベッド、
ランプ、
机、
本棚。
Node3Dノードをルートにしてシーンを作成します。
Tip
環境のデフォルトの照明設定では、角度によってはシェーディングがきれいに表示されません。3Dビューポート メニューにて表示モードをオーバードロー表示にするか、あるいは DirectionalLight をひとつ追加すれば、はっきりと見えるようになります。
CSGBox3Dをひとつ作成し room という名前を付けて、Invert Facesを有効にしてから、部屋のサイズを変更してください。
次に、CSGCombiner3Dを作成して desk という名前を付けます。
デスクにはひとつの平面と4本の脚があります:
子ノードのCSGBox3Dを平面として1つ作成し、Union (和集合)モードにしてから大きさを変更します。
脚は子ノードのCSGBox3Dを4個作成し、Unionモードにしてから大きさを調節します。
それらの位置を調節してデスクの形にしましょう。
注釈
CSGCombiner3Dの中にあるCSGノードは、その combiner(連合) の中だけで演算処理を行います。そのため、CSGノードの整理にはCSGCombiner3Dが使われます。
CSGCombiner3Dを作り、bedと名付けます。
ベッドは3つのパーツからなります: ベッド本体、マットレス、そして枕です。まずCSGBox3Dを作成し、サイズ調整してベッド本体とします。さらにCSGBox3Dをもうひとつ作って、大きさ変更をしてマットレスにします。
bedの子として、pillowという名前のCSGCombiner3Dを作ります。シーンツリーはこのようになるでしょう:
それから3つの CSGSphere3Dノードを Union (和) モードにして組み合わせ、枕にします。それぞれの球体をY軸でサイズ変更し、Smooth Faces を有効にします。
pillowノードを選択して、モードをSubtraction (差)に切り替えます。すると組み合わせた球体により、マットレスに穴が開きます。
pillowノードの親を、ルートNode3Dに変更してみましょう。そうすれば穴は消えます。
注釈
これはCSGの処理順による影響を示すためのものです。ここでのルートノードは CSGノードではないため、CSGCombiner3Dノードの処理は最後になります。これがCSGCombiner3Dを使ったCSGシーン整理の一例です。
結果を確かめてから、親の変更とモード変更を取り消すと、ベッドはこのようになっているはずです:
CSGCombiner3Dを作成してlampと名付けます。
ランプはスタンド、支柱、そしてランプシェードの、3つのパーツからなります。CSGCylinder3Dを作成し、Cone オプションを有効にしてスタンドにします。それから、もうひとつCSGCylinder3Dを作って、大きさを調整して支柱にします。
ランプシェードにはCSGPolygon3Dを使います。CSGPolygon3Dを Spin モードにし、ビューを前面図 (テンキーの1) にしてから台形を描きましょう。この形状は原点を中心に、回転しながら押し出されてランプシェードを形作ります。
3つのパーツの位置を調整して、ランプに見えるようにします。
CSGCombiner3Dを作り、bookshelfと名付けます。
本棚には3つの CSGBox3D を使います。CSGBox3D をひとつ作って、サイズを調節してください。これが本棚のサイズになります。
この CSGBox3D を複製して、すべての軸で縮小させてから、モードを Subtraction (差) に変更します。
本棚はもうすぐ完成です。CSGBox3D をもうひとつ作成して、棚を二段に分けます。
部屋の中に家具を自由に配置すれば、シーンはこういう風になるはずです。
これで部屋のレベルのプロトタイプを、Godot の CSG ツールを使って作ることができました。迷路や街など、あらゆる種類のレベルをデザインするのに CSG ツールは使えます。ゲームをデザインするときは、その限界まで探ってみてください。
プロトタイプテクスチャの使用
Godot の StandardMaterial3D と ORMMaterial3D は 三平面マッピング (triplanar mapping) をサポートしています。Godot はまだ CSG ノード上の UV マップの編集をサポートしていないので、これは CSG を使うときに便利です。三平面マッピングは比較的低速なので、地形のような有機的なサーフェスには通常は不向きです。しかし、プロトタイピングの際には、CSGベースのレベルにテクスチャを素早く適用するために使用できます。
注釈
プロトタイプ用のテクスチャが必要な場合は、Kenney が作成した CC0ライセンスのプロトタイプテクスチャセット を参照してください。
CSGノードにマテリアルを適用するには、次の2つの方法があります。
これを CSGCombiner3Dノードにマテリアル オーバーライドとして適用します (インスペクターの Geometry > Material Override)。これで子ノードに自動的に適用されますが、個々の子ノードのマテリアルを変更できなくなります。
個々のノードにマテリアルを適用します (インスペクターの Material)。この方法では、各CSGノードに独自の外観を持たせることができます。減算CSGノードは、他の形状を掘った内側のマテリアルに適用されます。
CSGノードに三平面マッピングを適用するには、ノードを選択してインスペクターに移動し、Material Override (または個々の CSGノードの場合は Material) の横にある [empty] テキストをクリックします。New StandardMaterial3D を選択します。新しく作成されたマテリアルのアイコンをクリックして編集します。Albedo セクションを展開し、Texture プロパティにテクスチャをロードします。次に、Uv1 セクションを展開し、Triplanar をオンにします。上記の Scale プロパティと Offset プロパティを操作することで、各軸のテクスチャ オフセットとスケールを変更できます。Scale プロパティの値を大きくすると、テクスチャがより頻繁に繰り返されます。
Tip
StandardMaterial3Dをコピーして、CSGノード間で再利用することができます。これを行うにはインスペクターのマテリアル プロパティの横にあるドロップダウン矢印をクリックし、コピー を選択します。貼り付けるには、マテリアルを適用するノードを選択し、そのマテリアル プロパティの横にあるドロップダウン矢印をクリックして、貼り付け を選択します。
Converting to MeshInstance3D
Since Godot 4.4, you can convert a CSG node and its children to a MeshInstance3D node.
This has several benefits:
Bake lightmaps, since UV2 can be generated on a MeshInstance3D.
Bake occlusion culling, since the occlusion culling bake process only takes MeshInstance3D into account.
Faster loading times, since the CSG mesh no longer needs to be rebuilt when the scene loads.
Better performance when updating the node's transform if using the mesh within another CSG node.
To convert a CSG node to a MeshInstance3D node, select it, then choose CSG > Bake Mesh Instance in the toolbar. The MeshInstance3D node will be created as a sibling. Note that the CSG node that was used for baking is not hidden automatically, so remember to hide it to prevent its geometry from overlapping with the newly created MeshInstance3D.
You can also create a trimesh collision shape using CSG > Bake Collision Shape. The generated CollisionShape3D node must be a child of a StaticBody3D or AnimatableBody3D node to be effective.
Tip
Remember to keep the original CSG node in the scene tree, so that you can perform changes to the geometry later if needed. To make changes to the geometry, remove the MeshInstance3D node and make the root CSG node visible again.
glTFとしてエクスポート
CSGを使用して作成したレベルをメッシュ化し、それを3Dモデルとしてエクスポートして、3Dモデリングソフトにインポートすると便利です。それを実現するには シーン > 名前を付けてエクスポート... > glTF 2.0 シーン を実行します。