はじめに
3Dシーンで太陽や月の光を表現するには、どんなライトを使えばいいのでしょう?その答えがDirectionalLight3Dです。この記事では、無限遠から平行に光を照射するライトの基本から、影の設定まで解説します。
この記事を読むことで、屋外シーンの照明設計、影の表現、そして複数ライトの組み合わせが身につきます。

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

もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 型 | 説明 |
|---|---|---|
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について解説します。

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


コメント