UnityでRawImageを使ってARをする際の備忘録

・Canvasを使うと自動的にカメラの描画範囲にフィットする上、親子関係を作って相対位置を固定する必要がないのでPlaneにはっつけつより楽
・Kinect等と連携してDepthMappingなどをする際にはRenderingPipeLineに入らないといけない気がする

どこをいじったかいまいち覚えていないので全部載っけておく

CanvasのInspector
ARCanvas

RawImageのInspector
ARRawImage

Background.cs

<br />
using UnityEngine;<br />
using System.Collections;<br />
using UnityEngine.UI;</p>
<p>public class Background : MonoBehaviour {</p>
<p>    public WebCamTexture wtex;</p>
<p>    // Use this for initialization<br />
    void Start () {<br />
        if (WebCamTexture.devices.Length &lt;= 0)<br />
        {<br />
            Debug.LogError(&quot;Cannot find a camera. &quot;);<br />
            return;<br />
        }<br />
        this.wtex = new WebCamTexture();<br />
        wtex.Play();</p>
<p>        //tagでUIを表示するCameraを判断<br />
        Camera cam = GameObject.FindGameObjectWithTag(&quot;BattleCamera&quot;).GetComponent&lt;Camera&gt;();</p>
<p>        Canvas canvas = transform.parent.GetComponent&lt;Canvas&gt;();<br />
        canvas.renderMode = RenderMode.ScreenSpaceCamera;<br />
        canvas.planeDistance = cam.farClipPlane-0.01f;<br />
        canvas.worldCamera = cam;</p>
<p>        RawImage rawImage = GetComponent&lt;RawImage&gt;();<br />
        rawImage.texture = wtex;<br />
        //rawImage.SetNativeSize();</p>
<p>        RectTransform recTrans = GetComponent&lt;RectTransform&gt;();<br />
        //recTrans.anchoredPosition = new Vector2(0.5f, 0.5f);<br />
        float scale = ((wtex.width / wtex.height) &gt; cam.aspect) ? ((float)cam.pixelHeight/wtex.width) : ((float)cam.pixelWidth / wtex.height);<br />
        recTrans.sizeDelta = new Vector2(scale * wtex.width, scale*wtex.height);<br />
        recTrans.Rotate(new Vector3(0, 0, -90));</p>
<p>        wtex.Stop();<br />
    }</p>
<p>	// Update is called once per frame<br />
	void Update () {</p>
<p>    }<br />
}<br />

今回の実装はAndroidようだったので、取得したWebcamTextureを90°回転させている
CanvasのRenderCameraに、Canvasを表示させたいカメラを指定するのを忘れないように
UIのRectTransformはTransformに相当する
WebCamTexture.Play()をしないとテクスチャに反映されないため, wtex.widthやwtex.heightが機能しないのでさっさとPlay()しておくこと
今回はゲーム開始時にARモードをいきなり使うわけではないので, 一通りの設定が終わった後にStop()させている.
本当はこのセットアップは画面遷移時にやるべき.

以上.

Posted on