Godot入門:Node3Dの使い方と活用法

はじめに

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

この記事を読むことで、3D座標系の理解、ノードの配置と変形、そして階層構造の作り方が身につきます。




Godot 4の3D座標系
Godot 4では右手系の座標系を採用しています。X軸は右、Y軸は上、Z軸は奥行きです。

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)




Node3Dの階層構造
Node3Dを親にして、複数の子ノードを組織化します。親の変形は自動的に子にも適用されます。

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ 説明
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について解説します。




基本的な3Dシーンの構成
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をもとに執筆しています。

コメント