Developer : ft-lab (Yutaka Yoshisaka).
06/15/2019 - 03/01/2022.
ここでは、デモシーンの"Runtime/blocks"を例に説明します。
「BeginCapture()」から「EndCapture()」でキャプチャを行う例です。
カメラに"Panorama180Render"のスクリプトをコンポーネントとして追加します。
このとき"Game View Mode"を"Default"にしておきます。
APIとしても"Game View Mode"を指定できるため、"Panorama View"のままでも問題ありません。
この指定により、実行時にPanorama180 Renderのためのカメラを作成しますがパノラマ作成の処理は行いません。
APIを使うことで、任意のタイミングでパノラマ処理を行うことになります。
新しいGameObjectを作成し、これにスクリプトを記載していくことになります。
Panorama180Renderのnamespace
Panorama180Renderクラスへアクセスしやすくするため、以下の指定でnamespaceを割り当てます。
using Panorama180Render = Panorama180Render.Panorama180Render;
カメラに割り当てたPanorama180Renderコンポーネントを取得
Start()内でメインカメラからPanorama180Renderクラスの参照を取得します。
取得した参照をm_panorama180Renderに格納しています。
private Panorama180Render m_panorama180Render = null;
void Start () {
if (Camera.main != null) {
GameObject g = Camera.main.gameObject;
if (g != null) {
m_panorama180Render = g.GetComponent
();
}
}
}
初期値を指定
Panorama180 Renderの初期値を変更します。
カメラに割り当てたPanorama180 RenderのUIにすでに値を指定済みで、
変更の必要がない場合は以下の指定は不要です。
// Set GameViewMode (Default view).
m_panorama180Render.SetGameViewMode(Panorama180Render.GameViewMode.Default);
// Set IPD(Interpupillary distance. unit m).
m_panorama180Render.SetIPD(0.064f);
// Set texture size as Cubemap (512/1024/2048/4096/8192).
m_panorama180Render.SetRenderTextureSize(1024);
// Post Processing On / Off.
m_panorama180Render.SetPostProcessing(true);
// Output resolution at Panorama180.
m_panorama180Render.SetOutputTextureSizeType(Panorama180Render.OutputTextureSizeType._1024);
// Output resolution at Panorama360.
m_panorama180Render.SetOutputTextureSizeType360(Panorama180Render.OutputTextureSizeType360._2048);
「SetGameViewMode(Panorama180Render.GameViewMode.Default)」でパノラマ画像をスクリーン前面に描画しない指定を行います。
「SetIPD(0.064f)」でIPDを指定します(単位 : m)。
「SetRenderTextureSize(1024)」でパノラマを作成する際のキューブマップとしての1面の解像度を指定します。
この値が大きすぎると時間がかかることになります。
「SetPostProcessing(true)」により、Post Processingがある場合にパノラマにも反映します(Built-in/URP時)。
「SetOutputTextureSizeType(Panorama180Render.OutputTextureSizeType._1024)」で出力するパノラマ画像のサイズを指定します。
この指定は、パノラマ180-3D時の解像度指定です。
「SetOutputTextureSizeType360(Panorama180Render.OutputTextureSizeType360._2048)」の指定は、
パノラマ360-3D時のパノラマ画像の解像度を指定します。
「BeginCapture()」から「EndCapture()」の間で「GetRenderTexture()」を呼ぶことでパノラマのカラーテクスチャ(RenderTexture)を取得します。
このRenderTextureはフレームごとに更新され、参照自身が変わることはありません。
キャプチャが開始されていない場合はnullが返されます。
Update()やOnGUI()などのフレームごとの更新で、以下のようにRenderTextureを取得できます。
// Get RenderTexture while capturing.
if (m_panorama180Render.IsCapture()) {
// Get RenderTexture.
RenderTexture rc = m_panorama180Render.GetRenderTexture();
}
「IsCapture()」はキャプチャを開始しているかどうかをbool値で取得します。
「GetRenderTexture()」でパノラマのRenderTextureを取得します。
「BeginCapture()」から「EndCapture()」の間で「GetRenderTexture()」を呼ぶ方法は、常にパノラマ画像を生成し続けるため負荷が高いです。
ここでは、デモシーンの"Runtime/blocks_sync_RenderTexture"を例に説明します。
コルーチンを使用して、1回パノラマ画像を作成して取得する流れです。
この場合はキャプチャ時の数フレームで負荷はかかりますがそれ以外ではPanorama180 Renderの処理は一切行わないため、VRでも扱いやすくなっています。
前述の「BeginCapture()」「EndCapture()」は使用しません。
Start()内でPanorama180Renderクラスの参照を取得するまでは、前述と同じ流れです。
初期値を指定
Panorama180 Renderの初期値を変更します。
// Set GameViewMode (Default view).
m_panorama180Render.SetGameViewMode(Panorama180Render.GameViewMode.Default);
// Set IPD(Interpupillary distance. unit m).
m_panorama180Render.SetIPD(0.064f);
// Camera near,far distance.
m_panorama180Render.SetCameraNearFarDistance(0.1f, 10.0f);
// Set texture size as Cubemap (512/1024/2048/4096/8192).
// The performance was not good on Oculus Quest2
// if it was more than 1024 in SetRenderTextureSize() and 1024(Output 2048 x 1024) in SetOutputTextureSizeType().
m_panorama180Render.SetRenderTextureSize(1024);
// Post Processing On / Off.
m_panorama180Render.SetPostProcessing(true);
// Output resolution at Panorama180.
m_panorama180Render.SetOutputTextureSizeType(Panorama180Render.OutputTextureSizeType._1024);
// Set Panorama180.
m_panorama180Render.SetPanoramaMode(Panorama180Render.PanoramaMode.Panorama180);
// Set depth texture type.
m_panorama180Render.SetDepthTextureType(Panorama180Render.OutputDepthTextureType.DepthDefault);
// Set depth texture linear.
m_panorama180Render.SetDepthLinearType(Panorama180Render.OutputDepthLinearType.Linear);
同じ項目の指定については省略します。
「SetCameraNearFarDistance(0.1f, 10.0f)」で近クリップ面までの距離、遠クリップ面までの距離を指定します(単位 : m)。
これは、Depthテクスチャの濃淡を調整するために指定しています。
「SetPanoramaMode(Panorama180Render.PanoramaMode.Panorama180)」でパノラマ180-3Dでのキャプチャを行います。
「SetDepthTextureType(Panorama180Render.OutputDepthTextureType.DepthDefault)」でパノラマのDepthテクスチャも作成します。
Depthテクスチャが不要な場合は「SetDepthTextureType(Panorama180Render.OutputDepthTextureType.None)」を指定します。
「SetDepthLinearType(Panorama180Render.OutputDepthLinearType.Linear)」でDepthテクスチャの値の補間方法を指定します。
Start()内では、パノラマのキャプチャ処理を開始しません。
1回分のキャプチャを行うコルーチンを記述
キャプチャ処理はコルーチンで行います。
IEnumerator GetPanoramaRenderTextureCo () {
if (m_panorama180Render == null) yield return null;
// Call coroutine.
var fc = m_panorama180Render.GetRenderTextureCo();
var curCoroutine = StartCoroutine(fc);
// Wait coroutine.
yield return curCoroutine;
// Get RenderTexture.
// The RenderTexture that can be obtained is temporary.
Panorama180Render.PanoramaTextureData rt = (Panorama180Render.PanoramaTextureData)fc.Current;
}
m_panorama180Renderがnullの場合は「yield return null」を呼んでコルーチンから抜けます。
「var fc = m_panorama180Render.GetRenderTextureCo();」でコルーチンの関数を取得し、
「var curCoroutine = StartCoroutine(fc);」でコルーチンを開始します。
「yield return curCoroutine;」はコルーチンの終了を待ちます。
コルーチンは、パノラマのカラーテクスチャと(指定があれば)DepthテクスチャをRenderTextureとして作成します。
パノラマ画像の作成が完了すれば、パノラマ作成処理は停止します。
この処理は数フレーム経過する場合があります。
「Panorama180Render.PanoramaTextureData rt = (Panorama180Render.PanoramaTextureData)fc.Current;」で結果のRenderTextureを取得します。
「rt.colorTexture」がカラーテクスチャになります(RenderTextureFormat.ARGB32)。
「rt.depthTexture」がDepthテクスチャになります(RenderTextureFormat.ARGBFloat)。
コルーチンを呼ぶ
このデモシーンの場合は、キーボードまたはゲームパッドのボタンが押されたら前述のコルーチンを呼び出しています。
StartCoroutine(GetPanoramaRenderTextureCo());
この流れにより、極力負荷をかけることなくパノラマ展開されたRenderTextureを取得してくることができます。
ランタイム用に以下の関数が用意されています。
大部分はEditor実行時と同じですが、ファイル保存などはランタイムでは使用できません。
int GetVersion ();
"Panorama180Render"のバージョンを取得します。
16進数の"0x1020"の場合は、ver.1.0.2になります。
void SetRenderTextureSize (int texSize);
キューブマップとしての1つの面でのテクスチャサイズを指定します。
引数名 | 内容 |
texSize | 512, 1024, 2048, 4096, 8192 |
int GetRenderTextureSize ();
キューブマップとしての1つの面でのテクスチャサイズを取得します。
512, 1024, 2048, 4096, 8192のいずれかになります。
void SetOutputAlignType (AlignType type);
出力時のパノラマ2つの配置の種類を指定します。
引数名 | 内容 |
type |
配置の種類。
AlignType.TopAndBottom ... 上下に配置
AlignType.SideBySide ... 左右に配置
|
AlignType GetOutputAlignType ();
出力時のパノラマ2つの配置の種類を取得します。
AlignType.TopAndBottomで上下に配置、AlignType.SideBySideで左右に配置になります。
void SetOutputTextureSizeType (OutputTextureSizeType sType);
パノラマ180-3D時、出力テクスチャサイズの種類を指定します。
引数名 | 内容 |
sType |
出力テクスチャサイズの種類。
OutputTextureSizeType._512 ... 512*2 x 512、または、512 x 512*2
OutputTextureSizeType._1024 ... 1024*2 x 1024、または、1024 x 1024*2
OutputTextureSizeType._2048 ... 2048*2 x 2048、または、2048 x 2048*2
OutputTextureSizeType._4096 ... 4096*2 x 4096、または、4096 x 4096*2
OutputTextureSizeType._4K ... 3840 x 2160 (Side by sideのみ)
OutputTextureSizeType._5_7K ... 5760 x 2880 (Side by sideのみ)
OutputTextureSizeType._8K ... 7680 x 4320 (Side by sideのみ)
OutputTextureSizeType._16K ... 15360 x 8640 (Side by sideのみ)
OutputTextureSizeType._16384 ... 16384 x 8192 (Side by sideのみ)
|
OutputTextureSizeType GetOutputTextureSizeType ();
パノラマ180-3D時、出力テクスチャサイズの種類を取得します。
これは最終的に出力される2眼のパノラマを配置したときのテクスチャのサイズになります。
OutputTextureSizeType._512, OutputTextureSizeType._1024, OutputTextureSizeType._2048, OutputTextureSizeType._4096,
OutputTextureSizeType._4K, OutputTextureSizeType._5_7K, OutputTextureSizeType._8K, OutputTextureSizeType._16K, OutputTextureSizeType._16384, のいずれかが返されます。
void SetPostProcessing (bool enableF);
Post ProcessingのOn/Offを指定します。
引数名 | 内容 |
enableF | trueでOn、falseでOff |
bool GetPostProcessing ();
Post ProcessingのOn/Offを取得します。
void SetDepthTextureType (OutputDepthTextureType type);
Depthを出力するときの種類を指定します。
引数名 | 内容 |
type |
Depthを出力するときの種類
OutputDepthTextureType.None ... 出力しない
OutputDepthTextureType.DepthDefault ... パノラマ画像と同じサイズ
OutputDepthTextureType.DepthOneHalf ... 1/2のサイズ
OutputDepthTextureType.DepthOneQuarter ... 1/4のサイズ
|
OutputDepthTextureType GetDepthTextureType ();
Depthを出力するときの種類を取得します。
OutputDepthTextureType.Noneは、Depthを出力しません。
OutputDepthTextureType.DepthDefaultは、パノラマ画像と同じサイズで出力します。
OutputDepthTextureType.DepthOneHalfは、パノラマ画像の1/2のサイズで出力します。
OutputDepthTextureType.DepthOneQuarterは、パノラマ画像の1/4のサイズで出力します。
void SetDepthLinearType (OutputDepthLinearType type);
Depth出力時の補間の種類を指定します。
引数名 | 内容 |
type |
Depthを出力するときの補間の種類
OutputDepthLinearType.Linear ... 線形
OutputDepthLinearType.NonLinear ... 非線形
|
OutputDepthLinearType GetDepthLinearType ();
Depth出力時の補間の種類を取得します。
OutputDepthLinearType.Linearは、線形になります。
OutputDepthLinearType.NonLinearは、非線形になります。
void SetCameraNearFarDistance (float nearP, float farP);
カメラのnear/far面の距離を指定します。
引数名 | 内容 |
nearP | 近クリップ面までの距離 |
farP | 遠クリップ面までの距離 |
void SetSynchronizeGazeDirection (bool b);
ver.1.1.0で追加された関数です。
パノラマ画像生成時に、Y軸回転に加えてXZ軸回転も反映するかを指定します。
引数名 | 内容 |
b | trueの場合はカメラのXYZ回転を反映 falseの場合はカメラのY回転のみを反映 |
bool IsSynchronizeGazeDirection ();
ver.1.1.0で追加された関数です。
パノラマ画像生成時に、trueの場合はカメラのXYZ回転を反映します。
falseの場合はカメラのY回転のみを反映します。
void SetIPD (float t);
2つの眼の間の距離(IPD : 瞳孔間距離)を指定します。
float GetIPD ();
2つの眼の間の距離(IPD : 瞳孔間距離)を取得します。
void SetSimulateVR180Camera (bool b);
パノラマ180-3D時に、VR180カメラのようなパノラマ処理を行うかどうか指定します。
引数名 | 内容 |
b |
trueの場合は、VR180カメラのようなパノラマ処理を行います。
falseの場合は、左右を向いた場合の視差も極力補間します。
|
bool IsSimulateVR180Camera ();
パノラマ180-3D時に、VR180カメラのようなパノラマ処理を行う場合はtrueを返します。
falseの場合は左右を向いた場合の視差も極力補間します。
void SetGameViewMode (GameViewMode vMode);
ver.2.0.0で追加された関数です。
"Game View Mode"の指定を行います。
引数名 | 内容 |
vMode |
GameViewMode.Default ... 標準表示
GameViewMode.PanoramaView ... パノラマ表示
|
GameViewMode GetGameViewMode ();
ver.2.0.0で追加された関数です。
"Game View Mode"の指定を取得します。
GameViewMode.Default/GameViewMode.PanoramaViewのいずれかが返されます。
void SetPanoramaMode (PanoramaMode pMode);
ver.2.0.0で追加された関数です。
"Panorama Mode"の指定(パノラマ180-3D、パノラマ360-3D)を行います。
引数名 | 内容 |
vMode |
PanoramaMode.Panorama180 ... パノラマ180-3D
PanoramaMode.Panorama360 ... パノラマ360-3D
|
PanoramaMode GetPanoramaMode ();
ver.2.0.0で追加された関数です。
"Panorama Mode"の指定(パノラマ180-3D、パノラマ360-3D)を取得します。
PanoramaMode.Panorama180/PanoramaMode.Panorama360のいずれかが返されます。
void SetOutputTextureSizeType360 (OutputTextureSizeType360 sType);
ver.2.0.0で追加された関数です。
パノラマ360-3D時、出力テクスチャサイズの種類を指定します。
引数名 | 内容 |
sType |
出力テクスチャサイズの種類。
OutputTextureSizeType360._512 ... 512 x 512
OutputTextureSizeType360._1024 ... 1024 x 1024
OutputTextureSizeType360._2048 ... 2048 x 2048
OutputTextureSizeType360._3072 ... 3072 x 3072
OutputTextureSizeType360._4096 ... 4096 x 4096
OutputTextureSizeType360._4K ... 3840 x 3840
OutputTextureSizeType360._5_7K ... 5760 × 5760
OutputTextureSizeType360._8K ... 7680 x 7680
OutputTextureSizeType360._16K ... 15360 x 15360
OutputTextureSizeType360._16384 ... 16384 x 16384
|
OutputTextureSizeType360 GetOutputTextureSizeType360 ();
ver.2.0.0で追加された関数です。
パノラマ360-3D時、出力テクスチャサイズの種類を取得します。
これは最終的に出力される2眼のパノラマを配置したときのテクスチャのサイズになります。
OutputTextureSizeType360._512, OutputTextureSizeType360._1024, OutputTextureSizeType360._2048,
OutputTextureSizeType360._3072, OutputTextureSizeType360._4096, OutputTextureSizeType360._4K,
OutputTextureSizeType360._5_7K, OutputTextureSizeType360._8K, OutputTextureSizeType360._16K,
OutputTextureSizeType360._16384
のいずれかが返されます。
void SetEyesType (EyesType eType);
ver.2.0.1で追加された関数です。
単眼かステレオか指定します。
引数名 | 内容 |
eType |
単眼/ステレオの種類。
EyesType.Stereo ... ステレオ (デフォルト)
EyesType.Mono ... 単眼
|
EyesType GetEyesType ();
ver.2.0.1で追加された関数です。
単眼かステレオか取得します。
EyesType.Stereo, EyesType.Mono のいずれかが返されます。
void BeginCapture ();
ver.2.0.0で追加された関数です。
パノラマのキャプチャ処理を開始します。
void EndCapture ();
ver.2.0.0で追加された関数です。
パノラマのキャプチャ処理を終了します。
bool IsCapture ();
ver.2.0.0で追加された関数です。
パノラマ処理中の場合(BeginCapture()からEndCapture()の間)はtrueを返します。
RenderTexture GetRenderTexture ();
ver.2.0.0で追加された関数です。
パノラマ処理中の場合(BeginCapture()からEndCapture()の間)、対象のRenderTextureを取得します。
IEnumerator GetRenderTextureCo (bool endCaptureF = true);
ver.2.0.0で追加された関数です。
パノラマの画像を取得します。これはコルーチンから呼び出します。
引数名 | 内容 |
endCaptureF |
trueの場合、キャプチャが完了したときにキャプチャ用のカメラを非表示にしてキャプチャ処理を行わないようにします。
falseの場合、キャプチャ処理はそのまま続行します。
|
結果のパノラマ画像は「Panorama180Render.PanoramaTextureData rt = (Panorama180Render.PanoramaTextureData)fc.Current;」としてコルーチンの戻り値として取得します。
「rt.colorTexture」がカラーテクスチャになります(RenderTextureFormat.ARGB32)。
「rt.depthTexture」がDepthテクスチャになります(RenderTextureFormat.ARGBFloat)。
使い方は「
使い方 : コルーチンを使用」を参照してください。