2Dで作ってきたゲームを、いざ3Dに——と踏み出すと、「オブジェクトが表示されない」「動かしたら当たり判定だけ置いていかれた」「座標がなぜかズレる」と、2Dでは気にしなかった壁にぶつかります。その多くは、3Dの土台である Node3D と MeshInstance3D の役割を分けて理解すれば、すっと解けます。
2Dの Node2D にあたるのが Node3D。ただし3Dでは、「どこにあるか(場所)」と「どう見えるか(見た目)」が別のノードに分かれているのがポイントです。この記事では、3D座標系・Transform3D・親子関係を押さえながら、この2つのノードの関係を整理します。
この記事でわかること
- GodotのY-Up右手系と「1ユニット=1メートル」
Transform3D(basisとorigin)が姿勢を決める仕組みNode3D(場所)とMeshInstance3D(見た目)の役割分担- Pivotと親子関係で、自転・公転のような動きを組む方法
3D空間の基本:Y-Up右手系
Godotの3D空間は、多くの3Dソフトと同じ 右手系 で、Y軸が上(Y-Up) です。単位は 1ユニット=1メートル 。移動距離やサイズはこれが基準になります。

| 軸 | 役割 | 正の向き |
|---|---|---|
| Y軸 | 高さ | 上 |
| X軸 | 幅 | 右 |
| Z軸 | 奥行き | 手前( -Zが前方 ) |
とくに 「-Zが前」 は最初つまずきやすいポイントです。「前に進む」は -Z 方向、と覚えておきましょう。
3D空間内のオブジェクトの姿勢は、Transform3D というデータで表されます。中身は2つ。
basis(基底) :回転とスケールを表す3×3行列origin(原点) :位置を表すVector3
インスペクタで触る position / rotation / scale は、この Transform3D を人が扱い やすくした便利プロパティです。
Node3D:場所と姿勢の土台
Node3D は、すべての3Dノードの基底クラスです。役割は 3D空間でのTransform3D(位置・回転・スケール)を持つこと 。それ自体は目に見える形も当たり判定も持たない、純粋な「空間上の点・座標系」です。ノードの親子関係の基本は 「シーン」と「ノード」の基本 と共通です。
Node3D のいちばん強力な使い方は、 空のNode3Dを親にして、複数のノードをまとめる ことです。親を動かせば、子は全部ついてきます。子の transform は常に「親から見た相対値」になります。

キャラクターや、複数パーツでできた機械などは、この「空のNode3Dでグループ化」が土台になります。
MeshInstance3D:見た目を与える
MeshInstance3D は Node3D を継承し、そこに メッシュ(形状)を描画する機能 を足したノードです。Node3D が「どこにあるか」なら、MeshInstance3D は「何が、どんな見た目で存在するか」を決めます。

| ノード | 役割 | 主なプロパティ |
|---|---|---|
Node3D | 場所・姿勢 | transform(position / rotation / scale) |
MeshInstance3D | 見た目・形状 | mesh, material_override |
MeshInstance3D が何かを表示するには、最低でも mesh に Mesh リソース(BoxMesh・SphereMesh や、インポートした3Dモデル)を割り当てます。 「Node3Dで骨格、MeshInstance3Dで肉付け」 と覚えると、3Dシーンの組み立てが一気に整理できます。インポートしたキャラの表示は 3Dスケルタルアニメーション も参照してください。
実践:回転する惑星と公転する衛星
親子関係とPivot(回転の軸になる空のNode3D)の練習に、 自転する惑星と、その周りを公転する衛星 を作ってみます。3DのRPGでもシューティングでも、「軸を回して周回させる」考え方はそのまま使えます。
コツは、 オブジェクト自体ではなく、その親のPivotを回す こと。こうすると自転と公転を別々に制御できます。

extends Node3D
@export var spin_speed := 40.0 # 惑星の自転(度/秒)
@export var orbit_speed := 60.0 # 衛星の公転(度/秒)
@onready var planet: MeshInstance3D = $PlanetPivot/Planet
@onready var satellite_pivot: Node3D = $PlanetPivot/SatellitePivot
func _process(delta: float) -> void:
planet.rotate_y(deg_to_rad(spin_speed * delta)) # 惑星は自分で自転
satellite_pivot.rotate_y(deg_to_rad(orbit_speed * delta)) # 衛星は「軸」を回して公転
ノード構成はこうします。衛星は公転軸から離して置くのがポイントです(軸を回すと、離れた分だけ円を描いて回ります)。
Node3D
└─ PlanetPivot (Node3D)
├─ Planet (MeshInstance3D … SphereMesh)
└─ SatellitePivot (Node3D) … これを回すと公転
└─ Satellite (MeshInstance3D) … position を (4, 0, 0) など離して置く
ポイントは2つです。
- 回すのは本体でなく軸 :
Planetを直接回すと自転、SatellitePivot(軸)を回すと、その子のSatelliteが円を描いて公転します。役割を軸に分けるのがコツです。 - 親を動かせば全部ついてくる :
PlanetPivotごと動かせば、惑星も衛星もまとまって移動します。これが「空のNode3Dでグループ化」の威力です。
よくある間違いとベストプラクティス

| よくある間違い | ベストプラクティス |
|---|---|
MeshInstance3D を直接動かして物理と噛み合わない | CharacterBody3D / RigidBody3D をルートにし、その子に MeshInstance3D を置く(物理ボディの使い分け) |
position でグローバル座標を取ろうとする | position は親からの相対。ワールド座標は global_transform.origin を使う |
スケールで反転(scale.x = -1)する | 物理やシェーダーで不具合のもと。rotation で向きを変えるか、モデル側を直す |
| 同じメッシュを大量に個別配置する | Draw Callが増える。MultiMeshInstance3D を検討する |
おまけ:先に知っておくと良いこと
- 大量配置は MultiMeshInstance3D :森の木々のように同じメッシュを何百も置くなら、これ1つでまとめて描くと軽くなります。
- Pivotは空のNode3Dでいくらでも作れる :回転軸・武器の取り付け位置・エフェクトの発生点など、「基準点」が欲しいときは空のNode3Dを足すのが定番です。
- 向きは
-Zが前 :look_at()やキャラの前方向を扱うときは、前が-Zであることを思い出すと混乱しません。 - 見た目の質感は Material :
StandardMaterial3DをMeshInstance3Dに割り当てると、色・金属感・発光などを設定できます。
まとめ
- 3D空間 :Y-Up右手系、1ユニット=1メートル、前は -Z
- Transform3D :
basis(回転・スケール)とorigin(位置)で姿勢を表す Node3D:場所と姿勢の土台。空のNode3Dでグループ化・Pivotに使うMeshInstance3D:meshで見た目を与える。Node3Dで骨格、MeshInstance3Dで肉付け
この「場所(Node3D)」と「見た目(MeshInstance3D)」の分担が、3Dシーン作りの背骨です。まずは空のNode3Dの下に SphereMesh の MeshInstance3D を置いて、親を回してみるところから始めましょう。次は 3Dスケルタルアニメーション でモデルを動かしたり、物理ボディを付けたりすると、3Dシーンがぐっと動き 出します。