ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

UntiyでWebカメラを使う

UnityではWebCamTextureというWebカメラをテクスチャとして簡単に扱うことができるクラスが用意されています。WebCamTextureをゲームオブジェクトに関連付けることによって簡単にWebカメラの画像を扱うことができます。しかし、そのままでは意図しない表示になる可能性もあるため、いくつかのTipsを紹介します。

環境

 

  • Windows 8.1 Pro Update1
  • Unity Pro 4.5
  • Visual Studio 2013 Ultimate
  • UnityVS

プロジェクト

 

Webカメラの画像を表示する

最初にWebカメラの画像を表示してみましょう。

 

HierarchyビューにQuad(クワッド)を追加します。Quadは「GUIおよび情報表示」に向いています(ドキュメントより)。追加したQuadのサイズを調整します。今回は1920x1080のWebカメラ画像を表示させるので、X=1.92、Y=1.08にしています。

 

続いてQuadが光源の影響を受けないようにShaderに「Unlit/Texture」を設定したマテリアルを設定します。

 

最後に新しいスクリプトを作成し、WebCamBehaviourScriptと名付けます。

 

キャプチャ

 

スクリプトは次のように記述します。

using UnityEngine;

using System.Collections;

 

public class WebCamBehaviourScript : MonoBehaviour

{

public int Width = 1920;

public int Height = 1080;

public int FPS = 30;

 

// Use this for initialization

void Start()

{

var devices = WebCamTexture.devices;

if ( devices.Length == 0 ) {

Debug.LogError( "Webカメラが検出できませんでした。" );

return;

}

 

// WebCamテクスチャを作成する

var webcamTexture = new WebCamTexture( Width, Height, FPS );

renderer.material.mainTexture = webcamTexture;

webcamTexture.Play();

}

 

// Update is called once per frame

void Update()

{

 

}

}

Start()で接続されているWebカメラを探し、見つかればWebCamTextureを作成します。このときにカメラの解像度およびフレームレートを設定します。

解像度およびフレームレートはパラメーターとしてUnityエディター上で編集できるようになっています。

 

これを実行するとWebカメラの画像が表示されます。

 

キャプチャ

ミラーで表示する

ユーザーを映すようなアプリケーションの場合、鏡のように逆に表示したい場合があります。

 

このときはX軸に対してのScaleを反転させてあげます。Unityエディター上で反転でもいいですし、コードで変えてもよいでしょう。次にコードでScaleを反転させる例を示します。

if ( Mirror ) {

transform.localScale = new Vector3( -transform.localScale.x,

transform.localScale.y,

transform.localScale.z );

}

これで反転された映像が表示されます。

 

キャプチャ1

カメラの画像を縦にする

さらにデジタルサイネージなどに使う場合、Webカメラの画像を縦にしたい場合があります。

 

これはRotationをZ軸に対して90度または-90度回転させます。90度回転させると、向かって右側の画像が上に上がり、-90度回転すると左側が上に上がります。カメラの取り付け方によって選択できます。

 

こちらもコードで書いてみましょう。

// 縦にする

if ( RightUp ) {

var euler = transform.localRotation.eulerAngles;

transform.localRotation = Quaternion.Euler( euler.x, euler.y, euler.z + 90 );

}

else if ( LeftUp ) {

var euler = transform.localRotation.eulerAngles;

transform.localRotation = Quaternion.Euler( euler.x, euler.y, euler.z - 90 );

}

これでWebカメラの画像が回転しました。カメラを回転させた場合、実行ファイルの解像度を変更する必要がでてきます。その変更方法については別記事にて。

 

キャプチャ2