題名がわけ分かりませんね。

どう表現したらいいんだろ。

Oculusの歪んだサイドバイサイド映像と、Oculusの仮想空間の中で見たそのままのイメージ、それぞれをスクリーンショットとして保存するスクリプト。です!

 

前の記事「OculusRiftで普通のスクリーンショットを撮るスクリプト OculusScreenshotCamera.cs」の内容を少し変えて、

ついでなのでよくあるサイドバイサイドの画像も保存できるようにしました。

エディタ上で手軽にスクショが撮れるので開発中のものを見せたいときに使えるかな、なんて。

エディタ上

 

エディタ上で実行しながら、「Z」キーを押すとサイドバイサイド画像を保存。

サイドバイサイド画像

 

「X」キーを押すと歪み補正や色収差補正のかかってないOculusRiftの視野で見たイメージのままの画像が書き出されます。

OculusScreenshotCameraで撮った画像

 

Oculusの視野内に表示されるファインダーは「C」キーで表示非表示を切り替えられます。

WASDキーを移動とかに使っている場合キーがかぶるので、キーバインドを変更しました。

 

使い方などは前の記事を参考にしてください。

 

OculusScreenshotCamera.cs

using UnityEngine;
using System.Collections;
using System.IO;

public class OculusScreenshotCamera : MonoBehaviour
{
	public float verticalFOV = 38f;//縦方向の画角。必要に応じて変更してください。
	private Camera screenshotCamera;
	private RenderTexture renderTexture;
	private GameObject cameraViewObj;

	void Start ()
	{
		// スクリーンショット用のRenderTextureを生成
		renderTexture = new RenderTexture (1920, 1080, 16, RenderTextureFormat.ARGB32);

		// スクリーンショット用のカメラを生成
		screenshotCamera = gameObject.AddComponent<Camera> ();
		screenshotCamera.aspect = 1.778f;
		screenshotCamera.fieldOfView = verticalFOV;
		screenshotCamera.nearClipPlane = 0.1f;
		screenshotCamera.farClipPlane = 100.0f;//スケールの大きなシーンで使用する場合は数値を大きくしてください。
		screenshotCamera.targetTexture = renderTexture;

		// 確認用のカメラビューオブジェクトを生成
		cameraViewObj = GameObject.CreatePrimitive (PrimitiveType.Quad);
		cameraViewObj.name = "ScreenshotCameraWindow";
		cameraViewObj.transform.parent = transform;
		cameraViewObj.GetComponent<Renderer> ().material = new Material (Shader.Find ("Unlit/Texture"));
		cameraViewObj.GetComponent<Renderer> ().material.mainTexture = renderTexture;
		// 白枠オブジェクト
		GameObject outline = GameObject.CreatePrimitive (PrimitiveType.Quad);
		outline.transform.parent = cameraViewObj.transform;
		outline.transform.localPosition = new Vector3 (0, 0, 0.005f);
		outline.transform.localScale = new Vector3 (1.05f, 1.05f, 1.05f);
		outline.GetComponent<Renderer> ().material = new Material (Shader.Find ("Unlit/Color"));

		// 視野の下あたりに移動
		cameraViewObj.transform.localEulerAngles = new Vector3 (30f, 0, 0);
		cameraViewObj.transform.localPosition = new Vector3 (0, -0.25f, 0.3f);
		cameraViewObj.transform.localScale = new Vector3 (0.1422f, 0.08f, 1f);

		// 起動時は非表示にする場合はコメントアウトを外してください
		//cameraViewObj.SetActive (false);
	}

	void Update ()
	{
		// 「C」キーで確認用のカメラビューの表示非表示切り替え
		if (Input.GetKeyDown (KeyCode.C)) {
			if (cameraViewObj.activeInHierarchy) {
				cameraViewObj.SetActive (false);
			} else {
				cameraViewObj.SetActive (true);
			}
		}
		// 「X」キーでスクリーンショットを保存
		if (Input.GetKeyDown (KeyCode.X)) {
			TakeScreenShot ();
		}
		// 「Z」キーでサイドバイサイド画像を保存
		if (Input.GetKeyDown (KeyCode.Z)) {
			StartCoroutine (TakeScreenShotSBS ());
		}
	}

	// 補正なしスクリーンショット保存
	void TakeScreenShot ()
	{
		// RenderTextureから直接エンコード出来ないので、Texture2DにコピーしてからEncodeToPNGする
		Texture2D captureImage = new Texture2D (1920, 1080, TextureFormat.RGB24, false);
		RenderTexture.active = renderTexture;
		captureImage.ReadPixels (new Rect (0, 0, 1920, 1080), 0, 0);
		RenderTexture.active = null;

		byte[] bytes = captureImage.EncodeToPNG ();//Jpeg保存する場合は、EncodeToJPGに変更してください。
		System.DateTime now = System.DateTime.Now;
		string filename = "OculusScreenshotCamera-" + now.ToString ("yyyyMMdd-HHmmss");
		File.WriteAllBytes (Application.persistentDataPath + "/" + filename + ".png", bytes);
		Debug.Log ("== OculusScreenshotCamera ==  saved image in : " + Application.persistentDataPath + "/" + filename + ".png");
	}

	// サイドバイサイド画像保存
	IEnumerator TakeScreenShotSBS(){
		yield return new WaitForEndOfFrame();
		Texture2D captureImage = new Texture2D (Screen.width, Screen.height, TextureFormat.RGB24, false);
		captureImage.ReadPixels (new Rect (0, 0, Screen.width, Screen.height), 0, 0, false);
		byte[] bytes = captureImage.EncodeToPNG ();//Jpeg保存する場合は、EncodeToJPGに変更してください。
		System.DateTime now = System.DateTime.Now;
		string filename = "OculusScreenshotCameraSBS-" + now.ToString ("yyyyMMdd-HHmmss");
		File.WriteAllBytes (Application.persistentDataPath + "/" + filename + ".png", bytes);
		Debug.Log ("== OculusScreenshotCamera(SideBySide) ==  saved image in : " + Application.persistentDataPath + "/" + filename + ".png");
	}

}