12.

UE5 で鏡を作る方法 (Planar Reflection / Scene Capture / SSR / マテリアル)

編集
この記事の要点
  • Unreal Engine 5 で鏡を作る選択肢は 4 系統
  • 1. Planar Reflection Actor: 一番手軽で高品質。平面鏡向き
  • 2. Reflection Capture (Sphere/Box): 周囲環境のキャプチャ。鏡というよりは光沢面用
  • 3. Scene Capture 2D + Render Target: 任意視点をテクスチャに描き、マテリアルで Plane に貼る (鏡の王道)
  • 4. Screen Space Reflections (SSR): PostProcess の SSR / Lumen Reflections に頼る
  • パフォーマンス順は SSR > Capture > Planar Reflection > Scene Capture 2D (右ほど重い)
  • マテリアルは Metallic = 1 / Roughness = 0 が鏡面の基本。汚れは Roughness テクスチャで

1. Planar Reflection Actor (推奨・最も手軽)

平面鏡向け。Place Actors → Visual Effects → Planar Reflection を配置し、鏡となる Plane の前面に重ねるだけで動作します。

1. Project Settings > Rendering > Reflections
   > "Support global clip plane for Planar Reflections" を ON
   (要再起動)

2. Place Actors > Visual Effects > Planar Reflection を Scene にドラッグ

3. 鏡面の Plane と同じ位置・大きさ・回転に合わせる

4. Planar Reflection の Details で
   - Normal Distortion Strength
   - Prefilter Roughness
   - Screen Percentage
   を調整 (品質と負荷のバランス)

メリット: 視点に追従し、奥行きが正しく見える本物の鏡。
デメリット: シーン全体を再描画するため重い。複数枚の鏡は避ける。

2. Reflection Capture (Sphere / Box)

厳密には鏡というより「金属面の周辺環境を写す Cubemap」です。Place Actors → Lights → Sphere Reflection Capture

  • 事前計算 (Capture Now) で球面の周りを撮影 → 鏡面マテリアルがそれを参照
  • 視点に追従しないため、本格的な姿見には不向き
  • ガラスのショーケースや磨かれた床、金属球などに最適

3. Scene Capture 2D + Render Target (王道)

もっとも自由度の高い方法。カメラを 1 つ別途用意し、その視点を Render Target に書き出して鏡 Plane のマテリアルに貼る

[手順]
1. Render Target Texture を作成
   Content Browser > Add > Materials & Textures > Render Target (例: RT_Mirror)
   解像度 1024x1024 / Format RTF_RGBA16f 推奨

2. Scene Capture 2D Actor を配置
   Details:
   - Texture Target = RT_Mirror
   - Capture Source = Final Color (LDR / HDR)
   - Capture Every Frame = true

3. プレイヤーの位置から鏡面に対して
   「対称な位置」に Scene Capture を配置するロジックを書く
   (Blueprint の Tick で計算)

4. 鏡 Plane の Material を作成
   - Base Color = RT_Mirror
   - Metallic = 1, Roughness = 0
   - UV を Screen Position から取得 (or Plane UV)

Blueprint で対称位置を計算する

[Tick イベント内]
  Player = Get Player Camera Manager
  Mirror = self (鏡 Plane)

  // 鏡の平面に対するプレイヤーの鏡像
  ToPlayer = Player.Location - Mirror.Location
  Distance = Dot Product (ToPlayer, Mirror.ForwardVector)
  MirroredLoc = Player.Location - 2 * Distance * Mirror.ForwardVector

  Scene Capture.SetWorldLocation(MirroredLoc)
  Scene Capture.SetWorldRotation(
    Mirror Reflection of Player.Rotation by Mirror.ForwardVector
  )

マテリアルで UV をスクリーン空間に

[Material グラフ]
  ScreenPosition --(ViewportUV)--> TextureSample(RT_Mirror)
                                      |
                                      v
                                  Base Color

  Metallic    = 1
  Roughness   = 0
  Specular    = 1

4. Screen Space Reflections / Lumen Reflections

PostProcess Volume の Screen Space Reflections (SSR)、または UE5 の Lumen Lumen Reflections を使う方法。設定だけで安価に光沢を出せます。

  • 画面外の情報は写らない (背中向きが消える)
  • 鏡というより「濡れた床」「磨いた金属」向き
  • マテリアルは Roughness を下げるだけで OK
Post Process Volume:
  Lumen Reflections > Quality = 4
  Screen Space Reflections > Intensity = 100
  Screen Space Reflections > Quality = 100

Material:
  Metallic  = 1
  Roughness = 0.05
  → 床として配置すると鏡面反射 (SSR) が乗る

方式比較

方式品質負荷視点追従向く用途
Planar Reflection★★★★平面の本格的な鏡
Reflection Capture★★低 (事前計算)金属面 / ガラス球
Scene Capture 2D★★★★★自由な鏡 / 監視カメラ
SSR / Lumen Reflections★★★床 / 磨いた壁

マテリアルのコツ

[完全な鏡]
  Metallic  = 1.0
  Roughness = 0.0
  Base Color = (白でも可。Reflection が支配的)

[少し曇った鏡 / 古い鏡]
  Roughness = 0.05 ~ 0.15
  Normal にうっすら歪みテクスチャ

[汚れ / 指紋]
  Roughness = Texture (汚れ部は 0.3 程度)
  Base Color に薄い茶色を Multiply

[割れた鏡]
  Normal Map に割れ模様
  Opacity (Masked) で割れ目を切り抜き

Forward Rendering 時の制約

VR タイトルなどで Forward Renderer を選んでいる場合、SSR が使えません。Planar Reflection か Scene Capture 2D を使う必要があります。

RendererSSRLumenPlanarScene Capture 2D
Deferred (既定)★ (UE5)
Forward (VR 向け)
Mobile★ (重い)

パフォーマンス Tips

  • Planar Reflection の Screen Percentage を 50 にすると半分の解像度で 2 倍速
  • Scene Capture 2D の Render Target は必要解像度の最小で (姿見なら 1024、遠景の鏡は 256)
  • Capture Every Frame を OFF にし、必要なときだけ CaptureScene() を呼ぶ
  • 鏡が画面に映らない時は Set Hidden In Game で無効化 (Visibility カリング)
  • 同じシーンに鏡を複数置かない。1 個ずつでも重い

FAQ

Q: 鏡に自分のキャラクターが映らない
A: ファーストパーソンの場合、プレイヤーキャラ自体が非表示になっている可能性。OwnerNoSee をオフに、または Scene Capture 専用の Skeletal Mesh を持たせます。

Q: Planar Reflection を ON にしたのに何も映らない
A: Project Settings の Support global clip plane for Planar Reflections を有効化しエディタ再起動が必要です。

Q: モバイルで鏡を作りたい
A: Reflection Capture (Cubemap) + 低解像度 Render Target が現実的。Planar / SSR はモバイルでは非推奨です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ