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

はじめに

3Dシーンを作ったけれど、実際にプレイヤーがどんな角度で見るのか?その視点を決めるのがCamera3Dです。この記事では、3D空間を映すカメラの基本から、視点の切り替えまで解説します。

この記事を読むことで、TPSカメラ、FPSカメラ、シネマティック演出の基礎が身につきます。




Camera3DのPERSPECTIVEとORTHOGONAL投影
左はPERSPECTIVE(透視投影)で、遠いほど小さく見えます。右はORTHOGONAL(正投影)で、距離に関わらずサイズが一定です。

Camera3Dとは?

Camera3Dは、3D空間を映すカメラノードです。ゲーム画面に映る風景や登場人物は、すべてこのカメラが「何を見ているか」によって決まります。

Camera3Dは「プレイヤーの目」です。シーンをどんな角度からどんな広さで見るかを完全に制御します。

継承ツリー:


Camera3D
  ├── Node3D
  │   ├── Node
  │   └── ...
  └── ...

このノードを使うべき場面

Camera3Dを使う場面:

  • メインゲームの視点(TPSカメラ、FPSカメラ)
  • シネマティックなカットシーン・イベントシーンの演出
  • 複数のカメラを切り替える演出(ボス戦での演出カメラ等)
  • 監視カメラやミニマップの視点
  • 3D空間を俯瞰して見るパズルゲームのカメラ

Camera3Dを使わない場面:

  • 2Dゲームの場合 → Camera2D を使う
  • カメラが一切不要な(または自動で設置される)プロジェクト

主なプロパティと機能

プロパティ 説明
current bool trueの場合、このカメラがアクティブ(実際に映される)
projection ProjectionType PERSPECTIVE(透視投影)か ORTHOGONAL(正投影)
fov float 視野角(PERSPECTIVE用)。単位は度。デフォルト75°
size float 見える領域の高さ(ORTHOGONAL用)
near float カメラからの最短距離。これより近いオブジェクトは表示されない
far float カメラからの最長距離。これより遠いオブジェクトは表示されない
environment Environment 空色、グローバル照明などの環境設定
attributes CameraAttributes 露出値(EV)など、カメラの高度な設定

重要メソッド:


# このカメラをアクティブにする
make_current()

# 画面上の座標から、ワールド座標の3D光線を取得
project_ray_from_screen(screen_position: Vector2)

# ワールド座標から、スクリーン上の2D座標に変換
unproject_position(world_position: Vector3)

# ビューマトリックスと投影マトリックスを取得
get_camera_transform()
get_projection()

# カメラのZ値(深度)を設定して、その距離を基準にする
set_orthogonal(size: float, z_near: float, z_far: float)
set_perspective(fov: float, z_near: float, z_far: float)

コード例1:基本的なTPSカメラ(プレイヤーの後ろを追う)


extends Camera3D

@export var distance: float = 5.0  # プレイヤーからの距離
@export var height: float = 2.0    # カメラの高さ
@export var smooth_speed: float = 10.0  # スムーズさ

@onready var player = get_parent()

func _process(delta: float) -> void:
    # プレイヤーの背後にカメラを配置
    var target_position = player.global_position
    target_position -= player.global_transform.basis.z * distance  # Z軸に沿って後ろに
    target_position.y += height  # 高さを調整

    # スムーズにカメラを移動
    global_position = global_position.lerp(target_position, smooth_speed * delta)

    # プレイヤーを見つめる
    look_at(player.global_position + Vector3(0, height * 0.5, 0), Vector3.UP)

    # このカメラをアクティブに
    make_current()

コード例2:視野角(FOV)を動的に変更(ズーム効果)


extends Camera3D

@export var default_fov: float = 75.0
@export var sprint_fov: float = 90.0
@export var zoom_speed: float = 10.0

func _process(delta: float) -> void:
    var target_fov = default_fov

    # スプリント時は視野角を広げる
    if Input.is_action_pressed("sprint"):
        target_fov = sprint_fov

    # スムーズにFOVを変更
    fov = lerp(fov, target_fov, zoom_speed * delta)

    # マウスホイールでズーム
    if Input.is_action_just_released("scroll_up"):
        fov = max(fov - 5.0, 30.0)  # 最小30°
    elif Input.is_action_just_released("scroll_down"):
        fov = min(fov + 5.0, 120.0)  # 最大120°




異なるFOV値による見え方
左からFOV 30°、60°、90°、120°です。FOVが小さいほど望遠(ズームイン)、大きいほど広角(ズームアウト)になります。

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

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

パラメータ 説明
v_offset float カメラの垂直オフセット。キャラの目の高さを調整
h_offset float カメラの水平オフセット。OTS(オーバーザショルダー)カメラ用
doppler_tracking DopplerTracking ドップラー効果の追跡。IDLE/OBJECTS/PHYSICS_BODIES
cull_mask int 描画レイヤーの選別。特定のレイヤーのみ描画
physics_interpolation_mode PhysicsInterpolationMode 物理フレームとレンダリングフレームの同期方法

まとめ

Camera3Dはシーンの「見え方」を完全に制御し、TPSカメラ・FPSカメラ・シネマティック演出など、様々なゲーム体験の基盤となるノードです。

  • current プロパティを true にすることでそのカメラがアクティブになり、画面に映される
  • projection でPERSPECTIVE(透視投影)とORTHOGONAL(正投影)を切り替え、異なる見え方が実現できる
  • fov や near/far を調整して、ゲーム体験を細かくコントロール可能

次回は、3D空間を照らすライトノード、DirectionalLight3Dについて解説します。




Camera3Dのセットアップ例
通常、Camera3Dはプレイヤーノードの子ノードとして配置され、プレイヤーの動きに追従します。

シリーズ: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をもとに執筆しています。

コメント