VR 공간 캡쳐 및 360도 파노라마 이미지 만들기
생성한 에셋들로 구성된 씬의 한 지점에서 캡처를 통해 360 이미지를 생성하고 VR환경으로 가져와 제작하려고 한다.
사용되는 기술은 스테레오 360 이미지 및 비디오 캡처로 구글의 옴니 방향 스테레오(ODS) 기술을 기반으로 만들어졌다.
자세한 내용은 아래 블로그를 참고하면 되겠다.
Stereo 360 Image and Video Capture | Unity Blog
레벨디자인된 씬에서 몇가지 설정을 진행하도록 하겠다.
먼저 Create - Render Texture로 렌더 텍스쳐를 2개 생성해 준다. 하나는 2DOut으로 이름을 변경해주고 Dimension : 2D / Size : 4096 x 2048로 설정해준다. 나머지 렌더 텍스쳐는 Mono Render로 이름 설정 후 Dimension : Cube / Size : 4096 x 4096으로 변경해주면 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HDRcapture : MonoBehaviour
{
public Camera mainCamera;
public RenderTexture RenderTextureMono;
public RenderTexture RenderTexture2DOut;
private void Update()
{
if(Input.GetMouseButtonDown(0))
{
VRCapture();
}
}
public void VRCapture()
{
// 눈 사이의 거리 6.4cm
mainCamera.stereoSeparation = 0.064f;
// facemask 63은 기본값으로 6개의 큐브맵 면을 모두 렌더링 한다는 의미
mainCamera.RenderToCubemap(RenderTextureMono, 63, Camera.MonoOrStereoscopicEye.Mono);
// 큐브맵을 equirect format으로 바꾼다.
RenderTextureMono.ConvertToEquirect(RenderTexture2DOut, Camera.MonoOrStereoscopicEye.Mono);
// 2D 텍스쳐 크기를 정하고,
Texture2D OutTexture = new Texture2D(RenderTexture2DOut.width, RenderTexture2DOut.height);
// RenderTexture.active 설정은 Graphics.SetRenderTarget을 호출하는 것과 동일함. 변경할때 사용.
RenderTexture.active = RenderTexture2DOut;
// 텍스쳐에 읽어온다.
OutTexture.ReadPixels(new Rect(0, 0, RenderTexture2DOut.width, RenderTexture2DOut.height), 0, 0);
// 변경 닫을때 null 입력한다고 생각하는 개념으로
RenderTexture.active = null;
// 텍스쳐의 값을 jpg 형태로 변경
byte[] bytes = OutTexture.EncodeToJPG();
// 저장 위치
string path = Application.dataPath + "/1001/Panorama.jpg";
// 파일 쓰기
System.IO.File.WriteAllBytes(path, bytes);
}
}
다음으로 하이라키 상에 Create empty를 생성하고 VRcapture라는 위의 스크립트를 작성해서 연결해준다. 그리고 각각의 소스들을 매핑해주면 된다. 임의로 폴더 생성(스크립트 내용과 맞추기 위해 1001 이름으로 폴더 생성했음)하고 플레이 모드 실행 후 왼쪽마우스를 클릭하면 360도 캡처된 이미지 파일이 생성되어 폴더에 저장된다.
저장된 이미지를 VR 환경 상으로 가져오면 완성된다. 해당 방법은 아래 블로그를 참고하면 된다.
https://seongju0007.tistory.com/98?category=879137
A 이미지를 보다가 B이미지로 전환하고 싶을 때는 다음 방법을 사용해 주면 된다. (Sphere에 Shader을 매핑한 경우)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChgTexture : MonoBehaviour
{
public Texture m_ChgImg;
Renderer myImg;
// Start is called before the first frame update
void Start()
{
myImg = GetComponent<Renderer>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
myImg.material.SetTexture("_MainTex", m_ChgImg);
}
}
}
위 스크립트를 Sphere에 연결하고, Chg Img에 전환하고 싶은 이미지 소스를 넣어주기만 하면 된다. 플레이 시 마우스 왼쪽 버튼을 클릭하면 처음 이미지에서 새로 추가한 이미지로 전환되는 것을 확인할 수 있다.
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
유니티 Animation 기능을 사용하여 카메라 이동 구현하기 (0) | 2021.10.07 |
---|---|
유니티 Animation 기능을 사용하여 시계 애니메이션 만들기 (0) | 2021.10.07 |
[VR 개발]HDR Panoramic 360 VR 이미지 만들기 (0) | 2021.09.30 |
[VR 개발] 메타 QUEST2를 사용하여 복셀(Voxel) 생성하는 게임 만들기 (0) | 2021.09.09 |
[VR 개발]유니티 VR환경 기본 세팅(OVRPlayerController, OVRCameraRig, LocalAvatar) (0) | 2021.09.03 |