はじめに
3Dゲームを作る際、キャラクターや障害物、環境全体をどうやって配置・移動させるのか?そんなときに必要になるのがNode3Dです。この記事では、3D空間における最も基本的なノードの役割と使い方を解説します。
この記事を読むことで、3D座標系の理解、ノードの配置と変形、そして階層構造の作り方が身につきます。

Node3Dとは?
Node3Dは、3D空間におけるすべての3Dノードの基底クラスです。位置、回転、スケール(大きさ)といった3D変形を管理する最上位のノードとしての役割を果たします。
Node3Dは「3D世界の舞台」です。2D編で登場したNode2Dの3D版として理解できます。
継承ツリー:
Node3D
├── GeometryInstance3D
│ ├── MeshInstance3D
│ ├── MultiMeshInstance3D
│ └── ...
├── Camera3D
├── Light3D
│ ├── OmniLight3D
│ ├── SpotLight3D
│ ├── DirectionalLight3D
│ └── ...
├── PhysicsBody3D
│ ├── CharacterBody3D
│ ├── RigidBody3D
│ ├── StaticBody3D
│ └── ...
├── Marker3D
├── Node3D(単純な親ノード)
└── ...
このノードを使うべき場面
Node3Dを使う場面:
- 3Dシーンの最上位の親ノードとして(全体の基準点)
- 3Dキャラクターグループの親ノードとして(頭・体・手足を束ねる)
- 回転・移動が必要ない「空のアンカーノード」として
- 複数の子ノードを一度に変形させたいとき(グループ化)
- 3D座標系を理解する最初の一歩として
Node3Dを使わない場面:
- 実際に目に見える形状が必要なら → MeshInstance3Dを使う
- 物理演算が必要なら → RigidBody3DやCharacterBody3Dを使う
主なプロパティと機能
| プロパティ | 型 | 説明 |
|---|---|---|
position |
Vector3 | ローカル座標(親ノード基準)での位置。例:Vector3(0, 1, 0)はY軸上1単位 |
global_position |
Vector3 | グローバル座標(シーン全体基準)での位置 |
rotation |
Vector3 | ローカル回転(ラジアン単位)。X軸・Y軸・Z軸周りの回転 |
rotation_degrees |
Vector3 | ローカル回転(度数法)。プログラムより直感的 |
scale |
Vector3 | 大きさ。デフォルト(1, 1, 1)。例:(2, 2, 2)で2倍に拡大 |
global_transform |
Transform3D | 位置・回転・スケール全てを含む3D変形行列 |
basis |
Basis | 回転とスケール情報を持つ3×3行列 |
重要メソッド:
# 方向を向かせる
look_at(Vector3(5, 0, 0), Vector3.UP)
# 相対的に移動
translate(Vector3(1, 0, 0))
# 相対的に回転
rotate(Vector3.UP, PI / 4) # Y軸周りに45度回転
# 親ノードを基準にした変形を適用
rotate_object_local(Vector3.UP, PI / 4)
# グローバル座標への変換
global_position = Vector3(10, 5, 20)
コード例1:位置と回転の設定
extends Node3D
func _ready() -> void:
# 位置を設定(ローカル座標)
position = Vector3(0, 1, 0)
# 回転を設定(度数法)
rotation_degrees = Vector3(0, 45, 0) # Y軸周りに45度回転
# スケール(大きさ)を設定
scale = Vector3(2, 2, 2)
# グローバル座標でも設定可能
global_position = Vector3(5, 2, 10)
コード例2:親子関係と相対移動
extends Node3D
func _process(delta: float) -> void:
# 毎フレーム少しずつ移動(ローカル座標基準)
translate(Vector3(1, 0, 0) * delta)
# Y軸周りにゆっくり回転
rotate(Vector3.UP, TAU * delta * 0.1) # 10秒で1周
# 特定の方向を向かせる
if Input.is_action_pressed("ui_right"):
look_at(global_position + Vector3(1, 0, 0), Vector3.UP)

もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 型 | 説明 |
|---|---|---|
name |
String | ノードの識別名。シーンツリーで表示される |
visible |
bool | 表示・非表示フラグ。falseで子ノードも非表示に |
process_mode |
ProcessMode | INHERIT/ALWAYS/WHEN_PAUSED等。ゲーム時間の影響を受けるか制御 |
top_level |
bool | trueの場合、親の変形を無視してグローバル座標で動く |
clip_children |
ClipChildrenMode | 子ノードの描画を親の領域内に制限(高度な機能) |
まとめ
Node3Dは3D空間における最上位の基準点として、位置・回転・スケールを管理する基本ノードです。
- 3D座標系は右手系。Y軸が上、Z軸が奥行き
- position は親ノード基準のローカル座標、global_position はシーン全体基準
- 複数の子ノードを親のNode3Dの下に階層化することで、グループ化や一括変形が容易になる
次回は、このNode3Dの上に実際の形状を描画するMeshInstance3Dについて解説します。

シリーズ:Godot 4 ノード解説
001〜040:各種ノード
- 001 Node2D
- 002 Sprite2D
- 003 AnimatedSprite2D
- 004 Label
- 005 Button
- 006 TextEdit
- 007 Panel
- 008 VBoxContainer / HBoxContainer
- 009 TabContainer
- 010 OptionButton
- 011 CheckBox
- 012 Slider
- 013 LineEdit
- 014 RichTextLabel
- 015 Control
- 016 NinePatchRect
- 017 TextureRect
- 018 ItemList
- 019 Tree
- 020 ColorPickerButton
- 021 Timer
- 022 AudioStreamPlayer / AudioStreamPlayer2D
- 023 Marker2D
- 024 Area2D
- 025 CharacterBody2D
- 026 RigidBody2D
- 027 StaticBody2D
- 028 TileMap
- 029 Camera2D
- 030 CollisionShape2D
- 031 Polygon2D
- 032 Line2D
- 033 ParticleSystem2D / CPUParticles2D
- 034 CanvasLayer
- 035 Sprite3D
- 036 SubViewport
- 037 MultiplayerSpawner
- 038 RemoteTransform2D
- 039 NavigationAgent2D
- 040 VisibleOnScreenNotifier2D
- 051 Node3D
- 052 MeshInstance3D
- 053 Camera3D
- 054 DirectionalLight3D
- 055 CharacterBody3D
この記事はGodot 4.xをもとに執筆しています。


コメント