みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

UnityのWebCamTextureを使ってみた

UnityのWebCamTextureを触ったのでメモ.

WebCamTexture (Reference)

使用方法は簡単で,以下のようなBoo スクリプトで動作します.devices = WebCamTexture.devices でカメラのデバイスリストを取得してから,wct = WebCamTexture(devices[index].name) として使用したいCameraのWebCamTextureを作成します.wct.Play()としてから,renderer.material.mainTextureにwctを指定すれば,このスクリプトがアタッチされたGameObjectのテクスチャがWebCameraの映像になります.簡単です.

Web Playerの場合は,WebCameraを使用してよいというユーザーの許可が必要なので,yield Application.RequestUserAuthorization(UserAuthorization.WebCam)をStart()にて実行すれば,許可を求める画面が表示されます,この画面は英語ですが,日本語にする方法は残念ながら不明です.また,def Start() as IEnumerator:と返り値の型を明記していますが,これはyieldを使用するには返り値が必要だからです.これがないと正常にyieldできません.IEnumeratorはSystem.Collections.IEnumeratorなので,これをimportする必要もあります.

import UnityEngine
import System.Collections

class myWebCamTexture (MonoBehaviour): 
    
    public gameobjects as (GameObject)
    
    private state as int # 0:no user authoraization 1:no camera available, 2:camera available
    private wct as WebCamTexture
    private devices as (WebCamDevice)
    private index as int = 0
    private message as string

    def Start () as IEnumerator :
        ifdef UNITY_WEBPLAYER:
            # reguest user authorization if web player.
            yield Application.RequestUserAuthorization(UserAuthorization.WebCam)
            if Application.HasUserAuthorization(UserAuthorization.WebCam):
                state=1
            else:
                message = "User authorization is required."
                return
        ifdef not UNITY_WEBPLAYER:
            state=1
        if state==1:
            message = "No camera is found."
            devices = WebCamTexture.devices
            if devices.Length > 0 :
                # look for front facing camera
                for h as int,i as WebCamDevice in enumerate(devices):
                    if i.isFrontFacing:
                        index = h
                        break
                # set camera and play
                wct = WebCamTexture(devices[index].name)
                wct.Play()
                # set webcamtexture to all gameobjects" material 
                for i in gameobjects:
                    i.renderer.material.mainTexture = wct
                #
                state=2
                message = [x.name for x in devices].Join("\n")
    
    def Update ():
        pass
        
    def OnGUI ():
        # change camera button
        if state==2:
            if devices.Length>=2:
                if GUI.Button(Rect(0, 0, Screen.width/4, Screen.height/8), "Change Camera"):
                    index++
                    if index==devices.Length:
                        index=0
                    wct.Stop()
                    wct.deviceName = devices[index].name
                    wct.Play()
        # message text area
        else :
            GUI.TextArea(Rect(0, 0, Screen.width/4, Screen.height/8),message , 200)

いくつかポイントがあります.

カメラを変更する場合は,以下のように,WebCamTextureを一度Stop()してから,deviceNameを指定し,再度Play()する必要があるみたいです.

wct.Stop()
wct.deviceName = WebCamTexture.devices[index].name
wct.Play()

また,前面カメラかどうかを取得するには,WebCamDevice.isFrontFacing を使えばよいです.このサンプルでは,前面カメラを優先的に最初に表示するように,以下のようにしています.

# look for front facing camera
for h as int,i as WebCamDevice in enumerate(devices):
    if i.isFrontFacing:
        index = h
        break

このスクリプトを使った,BlenderのMonkeyにカメラで取った顔を表示するサンプルを作ってみました.

こちら\

(2013.11.20 published)