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

はじめに

3Dシーンで太陽や月の光を表現するには、どんなライトを使えばいいのでしょう?その答えがDirectionalLight3Dです。この記事では、無限遠から平行に光を照射するライトの基本から、影の設定まで解説します。

この記事を読むことで、屋外シーンの照明設計、影の表現、そして複数ライトの組み合わせが身につきます。




3種類のライトタイプの光の範囲
DirectionalLight3Dは無限遠から平行光線を照射します。OmniLight3D(全方向)、SpotLight3D(懐中電灯状)とは光の範囲が異なります。

DirectionalLight3Dとは?

DirectionalLight3Dは、無限遠から平行に光を照射する3Dライトノードです。太陽光や月光のように、光源が非常に遠いために、シーン全体に均等な光と影をもたらします。

DirectionalLight3Dは「太陽と同じ光」です。どこにいても同じ方向から同じ強度の光が降り注ぎます。

継承ツリー:


DirectionalLight3D
  ├── Light3D
  │   ├── VisualInstance3D
  │   │   ├── Node3D
  │   │   │   └── Node
  │   │   └── ...
  │   └── ...
  └── ...

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

DirectionalLight3Dを使う場面:

  • 屋外シーンの太陽光(主照明)
  • 月光や昼間の空光の表現
  • シーン全体に影を落としたいとき
  • 時間帯による光の色・強度の変化をシミュレーション
  • ゲームシーン全体を均等に照らすデフォルトライト

DirectionalLight3Dを使わない場面:

  • 光源が限定された範囲のみに照射(懐中電灯、照明等)→ SpotLight3D を使う
  • 光源が点状で全方向に照射 → OmniLight3D を使う
  • 屋内で複数の点光源が必要 → OmniLight3D を使う

主なプロパティと機能

プロパティ 説明
light_color Color ライトの色。白は Color.WHITE、朝日なら黄色など
light_energy float 光の強度。1.0がデフォルト。大きいほど明るい
light_energy_multiplier float light_energy の倍数。複数ライトのバランス調整に便利
light_shadow bool 影を投影するか。true で影が生成される
shadow_mode ShadowMode 影の品質。UNFILTERED/PCF3/PCF5/PCF7/PCF9/PCF13
directional_shadow_max_distance float カメラからこの距離までのオブジェクトが影を落とす
directional_shadow_split_count int カスケード影の分割数。1/2/4 推奨
directional_shadow_fade_start float 影が薄れ始める距離の比率(0.0〜1.0)

重要メソッド:


# ライトの有効・無効を切り替え
set_enabled(true)

# 光の強度と色を同時に調整
set_light_color(Color.WHITE)
set_light_energy(1.5)

# 影の設定を変更
set_shadow_enabled(true)
set_shadow_mode(Light3D.SHADOW_PCF5)

コード例1:時間帯による光の色と強度の変化


extends DirectionalLight3D

@export var cycle_duration: float = 120.0  # 時間周期(秒)
var time_of_day: float = 0.0  # 0.0 = 朝、1.0 = 次の朝

func _process(delta: float) -> void:
    # 時間を進める
    time_of_day += delta / cycle_duration
    if time_of_day >= 1.0:
        time_of_day = 0.0

    # 朝(明るい黄色)
    var morning_color = Color.from_hsv(0.08, 0.3, 1.0)  # 薄い黄色
    var morning_energy = 1.0

    # 昼(白)
    var noon_color = Color.WHITE
    var noon_energy = 1.2

    # 夕方(オレンジ)
    var evening_color = Color.from_hsv(0.05, 0.7, 1.0)  # オレンジ
    var evening_energy = 0.8

    # 夜(薄紫)
    var night_color = Color.from_hsv(0.75, 0.5, 0.6)  # 薄紫
    var night_energy = 0.3

    var time_phase: float
    var color1: Color
    var color2: Color
    var energy1: float
    var energy2: float

    if time_of_day < 0.25:  # 朝 -> 昼
        time_phase = time_of_day / 0.25
        color1 = morning_color
        color2 = noon_color
        energy1 = morning_energy
        energy2 = noon_energy
    elif time_of_day < 0.5:  # 昼 -> 夕方
        time_phase = (time_of_day - 0.25) / 0.25
        color1 = noon_color
        color2 = evening_color
        energy1 = noon_energy
        energy2 = evening_energy
    elif time_of_day < 0.75:  # 夕方 -> 夜
        time_phase = (time_of_day - 0.5) / 0.25
        color1 = evening_color
        color2 = night_color
        energy1 = evening_energy
        energy2 = night_energy
    else:  # 夜 -> 朝
        time_phase = (time_of_day - 0.75) / 0.25
        color1 = night_color
        color2 = morning_color
        energy1 = night_energy
        energy2 = morning_energy

    light_color = color1.lerp(color2, time_phase)
    light_energy = lerp(energy1, energy2, time_phase)

    # 光源の向きを回転させる(朝から夕方へ)
    rotation_degrees.x = -90.0 + (time_of_day * 180.0)

コード例2:影の基本的な設定


extends DirectionalLight3D

func _ready() -> void:
    # 影を有効化
    light_shadow = true

    # 影の品質を設定(高品質)
    shadow_mode = Light3D.SHADOW_PCF5

    # カスケード影(遠距離も含めた複数の解像度で影を描画)
    directional_shadow_split_count = 3  # 通常は2または4

    # カメラから200単位までの距離で影を計算
    directional_shadow_max_distance = 200.0

    # 影が薄れ始める地点(全距離の90%地点から)
    directional_shadow_fade_start = 0.9

    # ライトの色と強度
    light_color = Color.WHITE
    light_energy = 1.2




異なるshadow_mode による影の品質比較
左からUNFILTERED、PCF3、PCF5、PCF9です。PCFが高いほどソフトシャドウ(ぼけた影)になります。

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

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

パラメータ 説明
directional_shadow_blend_splits bool カスケード影の分割境界をスムーズにするか
directional_shadow_pancake_size float パンケーキシャドウのサイズ調整(高度)
volumetric_fog_gl_transmittance_bias float ボリュメトリックフォグの透過性(高度)
sky_mode SkyMode スカイキューブやレアルタイム環境との連携
light_angular_distance float 太陽のサイズを表現(度数法、太陽は約0.5度)

まとめ

DirectionalLight3Dは屋外シーンを照らす主照明として機能し、光の色・強度・影の設定で、時間帯の変化や緊張感のあるゲーム画面を演出できるノードです。

  • light_color と light_energy で光の見た目を完全に制御
  • light_shadow と shadow_mode で影の品質を調整し、パフォーマンスと見た目のバランスを取る
  • directional_shadow_split_count でカスケード影を設定することで、遠距離のオブジェクトも正確に影を投影

次回は、3D空間でプレイヤーキャラクターを動かすCharacterBody3Dについて解説します。




DirectionalLight3Dのシーン内配置例
DirectionalLight3Dはシーンツリーのルート直下に配置されることが多いです。位置は関係なく、回転(向き)のみが重要です。

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

コメント