【Godot】Node3DとMeshInstance3Dで学ぶGodotの3D空間基本概念

作成: 2025-12-08最終更新: 2026-07-08

Godotで3D開発を始めるときに押さえるNode3DとMeshInstance3Dの役割、Y-Up右手系の座標、Transform3D、親子関係とPivotを、実践的なコード例とともに解説します。

2Dで作ってきたゲームを、いざ3Dに——と踏み出すと、「オブジェクトが表示されない」「動かしたら当たり判定だけ置いていかれた」「座標がなぜかズレる」と、2Dでは気にしなかった壁にぶつかります。その多くは、3Dの土台である Node3DMeshInstance3D の役割を分けて理解すれば、すっと解けます。

2Dの Node2D にあたるのが Node3D。ただし3Dでは、「どこにあるか(場所)」と「どう見えるか(見た目)」が別のノードに分かれているのがポイントです。この記事では、3D座標系・Transform3D・親子関係を押さえながら、この2つのノードの関係を整理します。

Godotの3D空間のイメージ。グリッドの床の上に、ソフトブルーの球体と立方体が置かれ、隅に3D座標軸がある

この記事でわかること

  • GodotのY-Up右手系と「1ユニット=1メートル」
  • Transform3Dbasisorigin)が姿勢を決める仕組み
  • Node3D(場所)と MeshInstance3D(見た目)の役割分担
  • Pivotと親子関係で、自転・公転のような動きを組む方法

Sponsored

3D空間の基本:Y-Up右手系

Godotの3D空間は、多くの3Dソフトと同じ 右手系 で、Y軸が上(Y-Up) です。単位は 1ユニット=1メートル 。移動距離やサイズはこれが基準になります。

GodotのY-Up右手系の座標軸。Yが高さ、Xが幅、Zが奥行きで-Zが前方、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を親に立方体・球・円柱をまとめ、親を動かすと子が相対位置を保って全部ついてくる図

キャラクターや、複数パーツでできた機械などは、この「空のNode3Dでグループ化」が土台になります。

Sponsored

MeshInstance3D:見た目を与える

MeshInstance3DNode3D を継承し、そこに メッシュ(形状)を描画する機能 を足したノードです。Node3D が「どこにあるか」なら、MeshInstance3D は「何が、どんな見た目で存在するか」を決めます。

Node3D(場所・姿勢)とMeshInstance3D(見た目・mesh)を合わせると、空間の場所に実体のある球体が置かれる図。骨格+肉付け
ノード役割主なプロパティ
Node3D場所・姿勢transform(position / rotation / scale)
MeshInstance3D見た目・形状mesh, material_override

MeshInstance3D が何かを表示するには、最低でも meshMesh リソース(BoxMeshSphereMesh や、インポートした3Dモデル)を割り当てます。 「Node3Dで骨格、MeshInstance3Dで肉付け」 と覚えると、3Dシーンの組み立てが一気に整理できます。インポートしたキャラの表示は 3Dスケルタルアニメーション も参照してください。

実践:回転する惑星と公転する衛星

親子関係とPivot(回転の軸になる空のNode3D)の練習に、 自転する惑星と、その周りを公転する衛星 を作ってみます。3DのRPGでもシューティングでも、「軸を回して周回させる」考え方はそのまま使えます。

コツは、 オブジェクト自体ではなく、その親のPivotを回す こと。こうすると自転と公転を別々に制御できます。

惑星の自転(Planet)と衛星の公転(SatellitePivot)を軸の回転で作る図。軸を回して周回させる
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でグループ化」の威力です。
Sponsored

よくある間違いとベストプラクティス

positionは親からの相対座標、global_transform.originはワールドの絶対座標という違いを示す図。基準がちがう
よくある間違いベストプラクティス
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 であることを思い出すと混乱しません。
  • 見た目の質感は MaterialStandardMaterial3DMeshInstance3D に割り当てると、色・金属感・発光などを設定できます。

まとめ

  • 3D空間 :Y-Up右手系、1ユニット=1メートル、前は -Z
  • Transform3Dbasis(回転・スケール)と origin(位置)で姿勢を表す
  • Node3D :場所と姿勢の土台。空のNode3Dでグループ化・Pivotに使う
  • MeshInstance3Dmesh で見た目を与える。Node3Dで骨格、MeshInstance3Dで肉付け

この「場所(Node3D)」と「見た目(MeshInstance3D)」の分担が、3Dシーン作りの背骨です。まずは空のNode3Dの下に SphereMeshMeshInstance3D を置いて、親を回してみるところから始めましょう。次は 3Dスケルタルアニメーション でモデルを動かしたり、物理ボディを付けたりすると、3Dシーンがぐっと動き出します。