• [Unreal 게시판] 둘러 쌓인 4개의 monitor를 위한 multi view 구현하기2015.01.09 PM 01:21

게시물 주소 FONT글자 작게하기 글자 키우기

Question>

안녕하세요.
저는 언리얼엔진을 이제막 시작한 사람입니다.

인터넷에서 정보를 찾다가 뽀까뽀까님의 글을 보고 이렇게 질문을 남깁니다.

http://www.youtube.com/watch?v=b1SCT7EPaX4

링크의 동영상을 보시면 플레이어에 4대의 카메라를 설치후 각각의
다른 창 혹은 각기 다른 모니터에 출력을 하고 있습니다.

이렇게 내보낼수 있는 방법이 언리얼엔진쪽에서는 없는것 같아 이렇게 도움을 청하고자 합니다.

이렇게 구현할 수 있는 방법이 있을까요?


-------------------------------------------------------------

Answer>

link로 알려 주신 영상 잘 봤습니다.^^

간단히 요약하면, 모니터 4개를 앞, 뒤, 좌, 우 설치후,
각각의 서로 다른 시점으로 rendering하는 거네요.

참고로 아래는 제가 예전에 'multi view' 구현과 관련해서
설명한 link입니다.

http://cafe.naver.com/igc123/276
http://cafe.daum.net/igc123/K3VE/210

님이 이제 막 시작하신 분이라면,
위 link의 방법을 최대한 응용하셔서 해결하시는게 '쉬운 길'이라고 생각하고요.^^

하지만,
'고난의 길'을 가서라도 제대로 해결하고 싶으시다면..^^;;;;;
아래 절차대로 해 보시기 바랍니다.



1>
이걸 MS Windows 환경에서 구현한다면,
MS Windows의 경우 다중 monitor를 지원하니까,
VGA card를 같은 종류로 4개 설치하시고,
monitor도 4개 설치하셔서, 1대의 PC로 4대의 monitor를 자유롭게
다룰 수 있도록 환경을 구축합니다.
그리고,
원활한 설명을 위해 4개의 monitor의 해상도는 모두 800 * 600으로 가정하겠고요.^^;;;;;
첫번째 monitor는 가로 영역이 0 ~ 799,
두번째 monitor는 가로 영역이 800 ~ 1599,
세번째 monitor는 가로 영역이 1600 ~ 2399,
네번째 monitor는 가로 영역이 2400 ~ 3199 라고 가정하고,
모든 monitor의 세로 영역은 모두 0 ~ 599 라고 가정하겠습니다.


2>
이후, unreal engine 4에서 돌아가는 program을 짜시는데,
우선 아래와 같이 4개의 window를 만들어서 추가합니다.

TSharedRef windowMonitor1st = SNew( SWindow )
.Screenp-osition( FVector2D( 0, 0 ) )
.ClientSize( FVector2D( 800, 600 ) )
.Title( LOCTEXT("monitor_1st", "montor 1st") )
TSharedRef windowMonitor2nd = SNew( SWindow )
.Screenp-osition( FVector2D( 800, 0 ) )
.ClientSize( FVector2D( 800, 600 ) )
.Title( LOCTEXT("monitor_2nd", "montor 2nd") )
TSharedRef windowMonitor3rd = SNew( SWindow )
.Screenp-osition( FVector2D( 1600, 0 ) )
.ClientSize( FVector2D( 800, 600 ) )
.Title( LOCTEXT("monitor_3rd", "montor 3rd") );
TSharedRef windowMonitor4th = SNew( SWindow )
.Screenp-osition( FVector2D( 2400, 0 ) )
.ClientSize( FVector2D( 800, 600 ) )
.Title( LOCTEXT("monitor_4th", "montor 4th") );

FSlateApplication::Get().AddWindow( windowMonitor1st );
FSlateApplication::Get().AddWindow( windowMonitor2nd );
FSlateApplication::Get().AddWindow( windowMonitor3rd );
FSlateApplication::Get().AddWindow( windowMonitor4th );

생성할 때, 좌표를 넣었기 때문에
4개의 window는 생성후 바로 서로 다른 monitor에 배치됩니다.


3>
아래와 같이 overlay와 viewport를 만드셔서,
위에서 만든 window와 연결합니다.

TSharedRef overlay1st = SNew( SOverlay );
TSharedRef vp1st = SNew( SViewport )
.EnableGammaCorrection( true )
[
overlay1st
];
windowMonitor1st->SetContent( vp1st.ToSharedRef() );

TSharedRef overlay2nd = SNew( SOverlay );
TSharedRef vp2nd = SNew( SViewport )
.EnableGammaCorrection( true )
[
overlay2nd
];
windowMonitor2nd->SetContent( vp2nd.ToSharedRef() );

TSharedRef overlay3rd = SNew( SOverlay );
TSharedRef vp3rd = SNew( SViewport )
.EnableGammaCorrection( true )
[
overlay3rd
];
windowMonitor3rd->SetContent( vp3rd.ToSharedRef() );

TSharedRef overlay4th = SNew( SOverlay );
TSharedRef vp4th = SNew( SViewport )
.EnableGammaCorrection( true )
[
overlay4th
];
windowMonitor4th->SetContent( vp4th.ToSharedRef() );


4>
아래와 같이 game viewport client를 만드셔서,
위에서 만든 window와 overlay를 연결합니다.

UGameViewportClient gvc1st = ConstructObject( GEngine->GameViewportClientClass, this );
gvc1st->SetViewportOverlayWidget( windowMonitor1st, overlay1st );

UGameViewportClient gvc2nd = ConstructObject( GEngine->GameViewportClientClass, this );
gvc2nd->SetViewportOverlayWidget( windowMonitor2nd, overlay2nd );

UGameViewportClient gvc3rd = ConstructObject( GEngine->GameViewportClientClass, this );
gvc3rd->SetViewportOverlayWidget( windowMonitor3rd, overlay3rd );

UGameViewportClient gvc4th = ConstructObject( GEngine->GameViewportClientClass, this );
gvc4th->SetViewportOverlayWidget( windowMonitor4th, overlay4th );


5>
위의 과정까지 완료되면,
4개의 game viewport client로 4개의 monitor에 접근해서
처리할 수 있는 기반이 완료된 것이고요.
이제 camera 4개를 배치하셔서, 4개의 game viewport client
(위의 설명의 예에서 gvc1st, gvc2nd, gvc3rd, gvc4th)에
연결해서 rendering하시면 됩니다~ ^^



전에 link로 알려 드린 방법이나
위 방법 중에 하나를 선택하셔서 해결하시기 바랍니다.^^







Tag:
안기훈, Kee Hoon Ahn, 언리얼, Unreal, UDK, iPhone, iPad, app, 앱, iOS
댓글 : 0 개
친구글 비밀글 댓글 쓰기