1. 導入:なぜNode3DとMeshInstance3Dが重要なのか
Godot Engineで3Dゲーム開発を始める際、最初に理解すべき最も重要な概念が Node3D と MeshInstance3D です。これらは、3D空間に存在するすべてのオブジェクトの「場所」と「見た目」を定義する、まさに 3Dシーンの構成要素の基盤 と言えます。
2Dゲーム開発では Node2D が 中心でしたが、3Dではその役割を Node3D が担います。
2. Godot 3D空間の基本概念
Godotの3D空間は、現実世界と同じように座標系と単位に基づいて構築されています。
3D座標系:右手系と軸の役割
Godot Engineは、多くの3Dソフトウェアで採用されている 右手系 の座標系を使用しています。
| 軸 | 役割 | 方向 |
|---|---|---|
| Y軸 | 高さ(Up/Down) | 上方向が正 |
| X軸 | 幅(Left/Right) | 右方向が正 |
| Z軸 | 奥行き(Forward/Backward) | 画面奥方向が正 |
特に重要なのは、 Y軸が「高さ」 を表す点です。また、Godotの3D空間における単位は、 1ユニットが1メートル に相当します。
Transform:位置、回転、スケール
3D空間におけるすべてのオブジェクトは、 Transform(変換) と呼ばれるデータによってその状態が定義されます。
- 位置 (Translation/Position): 空間のどこにオブジェクトがあるか。
- 回転 (Rotation): オブジェクトがどの方向を向いているか。
- スケール (Scale): オブジェクトの大きさがどれくらいか。
3. Node3D: 3D空間における「場所」の定義
Node3D は、Godotの3Dノード階層における最も基本的なノードであり、 すべての3Dノードの基底クラス です。その役割は非常にシンプルかつ強力で、 3D空間におけるオブジェクトの「場所」「向き」「大きさ」を定義すること に特化しています。
Node3D自体は、目に見える形状や物理的な挙動を持ちません。しかし、このノードが持つ transform プロパティを通じて、前述の 位置、 回転、 スケール の情報を保持しています。
Node3Dの実践的な使い方
Node3Dは、主に以下の目的で利用されます。
- ルートノード: 3Dシーンのルート(最上位)ノードとして使用されます。
- グループ化: 複数の3Dノードをまとめて管理するための親ノードとして使用されます。
- 相対座標の基準: 子ノードは常に親ノードの座標を基準とした 相対座標 で配置されます。
4. MeshInstance3D: 3D空間における「見た目」の定義
MeshInstance3D は、Node3Dを継承したノードであり、 3D空間に視覚的な形状(メッシュ)を描画する ためのノードです。
Node3Dが「どこに」オブジェクトがあるかを決めるのに対し、MeshInstance3Dは「何が」そこにあるか、つまり オブジェクトの「見た目」 を決定します。
Node3DとMeshInstance3Dの役割分担
| ノード | 役割 | 定義するもの |
|---|---|---|
| Node3D | 場所 | 位置、回転、スケール(Transform) |
| MeshInstance3D | 見た目 | 形状(Mesh)、質感(Material) |
MeshInstance3Dが持つ最も重要なプロパティは mesh です。ここに BoxMesh(立方体)、 SphereMesh(球体)、あるいは外部からインポートした複雑なモデルなどの Meshリソース を割り当てることで、初めてオブジェクトが画面に描画されます。
5. 実践例: スクリプトでシンプルな3Dオブジェクトを生成・操作する
ここでは、GDScriptを使用して Node3D をルートとし、その子として MeshInstance3D を動的に生成し、位置と色を設定する手順を紹介します。
extends Node3D
func _ready():
# 1. MeshInstance3Dノードを作成
var mesh_instance = MeshInstance3D.new()
add_child(mesh_instance)
# 2. BoxMeshリソースを作成し、MeshInstance3Dに割り当てる
var box_mesh = BoxMesh.new()
box_mesh.size = Vector3(1.0, 1.0, 1.0)
mesh_instance.mesh = box_mesh
# 3. StandardMaterial3Dを作成し、色を設定
var material = StandardMaterial3D.new()
material.albedo_color = Color(0.8, 0.2, 0.2)
mesh_instance.set_surface_override_material(0, material)
# 4. 位置を設定
mesh_instance.position = Vector3(2.0, 0.5, 0.0)
# 5. 回転を設定(Y軸を中心に45度回転)
mesh_instance.rotation_degrees = Vector3(0, 45, 0)
このコードは、エディタでノードを追加し、インスペ クターでプロパティを設定する操作を、すべてスクリプトで行っていることに相当します。
6. まとめ
本記事では、Godot Engineで3Dゲーム開発を始めるための基礎として、 Node3D と MeshInstance3D の役割、そして3D空間の基本概念を解説しました。
| 概念 | キーワード | 役割 |
|---|---|---|
| 3D空間 | 右手系、1ユニット=1m | オブジェクトが存在する環境 |
| Node3D | Transform、Position | 場所 を定義する |
| MeshInstance3D | Mesh、Material | 見た目 を定義する |
この二つのノードの役割分担を理解すれば、Godotの3Dシーン構築はもう怖くありません。Node3Dで配置を決め、MeshInstance3Dで見た目を整える。このシンプルな原則が、複雑な3Dゲームの世界を構築する第一歩となります。