LoginSignup
5

More than 3 years have passed since last update.

UE4 SceneCaptureとRenderTargetのテスト(別カメラの絵を投影してみる)

Posted at

概要

UnrealEngine の SceneCapture と RenderTarget を使って別カメラの映像を投影するテストです。

環境

Windows10
Visual Studio 2017
UnrealEngine 4.24

参考

以下を参考にさせて頂きました、ありがとうございます。

【UE4】映像をレンダーテクスチャーで投影する方法
UE4 別カメラで描画した映像をTexture化して使う(Scene Capture 2D、Render Target)
【UE4】Scene Capture 2Dで別視点から見たものを写す

関連ソース

"Engine\Source\Runtime\Engine\Classes\Engine\SceneCapture2D.h"
"Engine\Source\Runtime\Engine\Classes\Components\SceneCaptureComponent2D.h"
"Engine\Source\Runtime\Engine\Classes\Engine\TextureRenderTarget2D.h"

別視点の映像を投影させる1

レンダーターゲットをレベル上の板アクターに反映させてみます。

レンダーターゲットとマテリアル準備

コンテンツ右クリックから「描画ターゲット」を選択して作成します。

create_rendertarget.jpg

できたレンダーターゲットを右クリックし、マテリアルを作成します。

create_material.jpg

出来たマテリアルはテクスチャを張っただけの以下のような感じになります。

material00.jpg

映像を反映させるアクターを作成

レベルに投影させるスクリーンとして Planeを作成し置きます。

create_plane00.jpg

この Planeのマテリアル設定に先ほどレンダーターゲットから作成したマテリアルを設定します。

plane_material.jpg

シーンキャプチャの用意

シーンキャプチャ2Dをレベルに配置し、トランスフォームを調整します。
create_scenecapture.jpg

生成したシーンキャプチャの [Scene Capture] -> [Texture Target] に先ほど作成したレンダーターゲットテスクチャを設定します。

あるいはレベルブループリント等でスポーンする方法でも可。
create_scenecaptureBP.jpg

結果

静止画だとわかりにくいですが、キャラクタ上空から移した映像が Plane に反映されています。

result1.jpg

画像の解像度が荒い場合などはレンダーターゲットの SizeX SizeY のパラメータを調整すると良いです。(大きすぎると描画負荷がかかります)

別視点の映像を投影させる2

レンダーターゲットを EditorUtilityWidget などのUMGに反映させてみます。

マテリアルの準備

先ほどと同様にマテリアルを準備しますが、UI用なので [Material] -> [Material Domain] が User Intarface になります。

create_materialUI.jpg

テクスチャはレンダーターゲットを指定します。

UMGの準備

EditorUtilityWidget を作成します。(通常のUMGでも可)

create_EUW.jpg

中身は Image があるだけです。
[Appearance] -> [Brush] -> [Image] に先ほど用意したマテリアルを指定します。

EUW_Detail.jpg

結果

エディタを実行し、EditorUtilityWidget を右クリック -> [Run Editor Utility Widget]を実行すると別ウィンドウにてレンダーターゲットでの絵が反映されます。

result2.jpg

C++でシーンキャプチャアクターをスポーンする

シーンキャプチャをC++でスポーンします。通常のアクターのスポーンと引数が少し違うだけで同じように処理できます。

準備

シーンキャプチャアクターを用意します。
create_a_scenecapture.jpg

こんなアイコンになります。
scenecapture_icon.jpg

対象のレンダーターゲットが固定の場合、予めテクスチャターゲットに設定しておくと楽です。
scenecapture_textarget.jpg

シーンキャプチャアクターをスポーンする

キャラクターの BeginPlay にてシーンキャプチャアクターをスポーンしてみます。
以下コード例

.cpp
#include "Engine/SceneCapture2D.h"
#include "Components/SceneCaptureComponent2D.h"
#include "Engine/TextureRenderTarget2D.h"

void AMyProjectCharacter::BeginPlay()
{
    Super::BeginPlay();

    // シーンキャプチャアクターのパス
    FString _Path = TEXT("/Game/MySceneCapture2D.MySceneCapture2D_C");
    TSubclassOf<class ASceneCapture2D> _Class = TSoftClassPtr<ASceneCapture2D>(FSoftObjectPath(*_Path)).LoadSynchronous();

    // トランスフォームパラメータ
    FTransform _Transform = FTransform();
    _Transform.SetLocation(FVector(-940.0f, 170.0f, 760.0f));
    _Transform.SetRotation(FRotator(-80.0f, 0.0f, 0.0f).Quaternion());
    // シーンキャプチャアクターをスポーンする
    ASceneCapture2D* SceneCap = GetWorld()->SpawnActor<ASceneCapture2D>(_Class, _Transform);

    // シーンキャプチャアクターのターゲットを設定する
    if(SceneCap){
        // レンダーターゲットのパス
        _Path = TEXT("/Game/NewTextureRenderTarget2D");
        auto _Tex = Cast<UTextureRenderTarget2D>(StaticLoadObject(UTextureRenderTarget2D::StaticClass(), NULL, *_Path ));

        SceneCap->GetCaptureComponent2D()->TextureTarget = _Tex;

    }
}

結果は一緒です。

レンダーターゲットの表示対象の切り替え

レンダーターゲットでのアクターの表示対象切り替えをテストします。

準備

ボックスとスフィアのスタティックメッシュアクターを置きます。

add_actor.jpg

判別用にそれぞれアクタータグ Sphere Boxを設定しておきます。
staticactor_detail.png

レンダーターゲットで特定アクターを表示しない処理

シーンキャプチャ2Dに対し、以下のような処理を追加します。

add_proc_scenecapture.jpg

タグ Boxを持っているアクターを Hidden Actors に追加します。

ゲーム中で特定アクターを表示しない処理

サードパーソンキャラクターのBPに対し、以下のような処理を追加します。

add_proc_thirdpersonchara.jpg

タグ Sphere を持っているアクターに対し、New Owner No See フラグを立てておきます。

結果

エディタ上ではボックスとスフィアが置かれています。
result3_editor.jpg

実行するとエディタ上ではボックスは見えて、スフィアが見えません。
レンダーターゲット上ではボックスは見えませんが、スフィアが見えます。
result3_play.jpg

レンダーターゲットの設定次第でいろいろできると思います。

まとめ

シーンキャプチャとレンダーターゲットの基本的な使い方をテストしてみた結果、いろいろできそうな感じでした。ただ適当に使うと描画負荷の問題がでそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5