UNITY’de Bir Webcam’e Erişerek Onun Görüntüsünü Objeye Texture Olarak Atamak

Yayınlandı: 01 Temmuz 2013 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Merhaba,

Bu örnekte UNITY‘de bir webcam‘e (ya da bir kameraya) erişip onun görüntüsünü oyun motoru içinde kullanmayı göstermeye çalıştım. Kodları comment‘leyerek neyin ne olduğunu kısaca açıkladım. Zaten tek bir script yeterli; o da oldukça kısa bir script.

Örneği indirmek için tıklayın: https://www.box.com/s/6t73o0ttl6vsv0t41o8u

Örneği web tarayıcınızda test etmek için tıklayın: http://ug.bcc.bilkent.edu.tr/~suleyman.kula/webcam/WebCam.html

NOT: Bu webcam olayı tüm cihazlarda (cep telefonları dahil) çalışıyor ancak eğer webcam kullanan bir Android uygulaması yaparsanız uygulama kurulmadan önce uygulamanın istediği izinler arasında “Hardware controls : take pictures and videos” da gözüküyor.

Örneğin kaynak kodu için yazının devamını okuyabilirsiniz…

#pragma strict

private var webcam : WebCamTexture;
private var mevcutWebcam : int; // Cihazda birden çok webcam varsa aralarında geçiş yapmak için kullanacağımız bir kod
private var webcamCihazlari : WebCamDevice[]; // Aygıttaki tüm webcam'leri depolayan bir değişken
private var anaRotasyon : Quaternion; // Kameranın ekrana yamuk yumuk açılarla yansımasını engellemek için bir değişken

function Start ()
{
	if( Application.platform == RuntimePlatform.OSXWebPlayer || Application.platform == RuntimePlatform.WindowsWebPlayer )
	{
		// UNITY yapımcıları webcam özelliğini WebPlayer olarak çalışan uygulamalarda açmadan önce kullanıcıdan izin almamızı lazım kılıyor. 
		// Bunun için eğer uygulama WebPlayer olarak çalışıyorsa aşağıdaki şekilde kullanıcıdan izin istiyorum. 
		// İzin vermezse scripti siliyorum...
		yield Application.RequestUserAuthorization( UserAuthorization.WebCam );
        
		if( !Application.HasUserAuthorization( UserAuthorization.WebCam ) )
        {
            Destroy( this );
        }
	}
	
	webcamCihazlari = WebCamTexture.devices;
	
	// Eğer cihazda en az 1 tane webcam varsa 0. indexteki webcam cihazını "webcam" değişkenine ata; eğer webcam yoksa hata mesajı ver
	if( webcamCihazlari.Length != 0 )
	{
		webcam = new WebCamTexture( webcamCihazlari[0].name );
		mevcutWebcam = 0;
	}
	else
	{
		Debug.LogError( "HATA! CİHAZDA WEBCAM BULUNAMADI!" );
		
		// Hata mesajının ardından bu scripti objeden silerek OnGUI fonksiyonunun hata vermesinin önüne geç
		Destroy( this );
	}
	
	// Objenin texture'sine (dış yüzey kaplaması) webcam'i ata
	renderer.material.mainTexture = webcam;
	
	// Webcam'den veri almaya başla (Webcam'i çalıştır)
	webcam.Play();
	
	anaRotasyon = transform.rotation;
}

function Update ()
{
	// Her kameranın kendine has bir çekim açısı olabilir. Bu kod objeyi kameranın çekim açısına göre otomatik olarak döndürüyor (benim de tam anlamadığım bir şekilde)
	transform.rotation = anaRotasyon * Quaternion.AngleAxis( webcam.videoRotationAngle, Vector3.up );
}

function OnGUI ()
{
	// Webcam'i duraklatmak/devam ettirmek ya da durdurmak için ekranın sol üstüne butonlar ekle
	if( webcam.isPlaying )
	{
		if( GUI.Button( new Rect( 10, 10, 100, 50 ), "DURAKLAT" ) )
			webcam.Pause();
			
		if( GUI.Button( new Rect( 10, 70, 100, 50 ), "DURDUR" ) )
			webcam.Stop();
	}
	else
	{
		if( GUI.Button( new Rect( 10, 10, 100, 50 ), "OYNAT" ) )
			webcam.Play();
	}
	
	// Görüntüyü ters çevirmek için butonlar ekle (fantazi işte)
	if( GUI.Button( new Rect( 10, 150, 100, 50 ), "DİKEY ÇEVİR" ) )
		transform.root.localScale.y *= -1;
		
	if( GUI.Button( new Rect( 10, 210, 100, 50 ), "YATAY ÇEVİR" ) )
		transform.root.localScale.x *= -1;
		
	// Eğer varsa başka kameralara geçmek için buton ekle
	if( GUI.Button( new Rect( 120, 10, 100, 50 ), "KAMERA DEĞİŞ" ) )
	{
		if( webcamCihazlari.Length != 1 )
		{
			webcam.Stop();
			mevcutWebcam = ( mevcutWebcam + 1 ) % webcamCihazlari.Length;
			webcam = new WebCamTexture( webcamCihazlari[ mevcutWebcam ].name );
			renderer.material.mainTexture = webcam;
			webcam.Play();
		}
	}
	
	// Eğer cihazda ön kamera varsa ilk ön kameraya geçiş yapmayı sağlar
	if( GUI.Button( new Rect( 230, 10, 120, 50 ), "ÖN KAMERA" ) )
	{
		for( var i = 0; i < webcamCihazlari.Length; i++ )
		{
			var wc : WebCamDevice = webcamCihazlari[i];
			
			// Eğer wc (seçili webcam) öne bakıyorsa mevcut kamerayı buna ayarla
			if( wc.isFrontFacing )
			{
				webcam.Stop();
				mevcutWebcam = i;
				webcam = new WebCamTexture( wc.name );
				renderer.material.mainTexture = webcam;
				webcam.Play();
				
				return;
			}
		}
	}
	
	// Eğer cihazda arka kamera varsa ilk arka kameraya geçiş yapmayı sağlar
	if( GUI.Button( new Rect( 360, 10, 120, 50 ), "ARKA KAMERA" ) )
	{
		for( var j = 0; j < webcamCihazlari.Length; j++ )
		{
			var wc2 : WebCamDevice = webcamCihazlari[j];
			
			// Eğer wc2 (seçili webcam) arkaya bakıyorsa mevcut kamerayı buna ayarla
			if( !wc2.isFrontFacing )
			{
				webcam.Stop();
				mevcutWebcam = j;
				webcam = new WebCamTexture( wc2.name );
				renderer.material.mainTexture = webcam;
				webcam.Play();
				
				return;
			}
		}
	}
}
yorum
  1. günay dedi ki:

    teşekkürler

  2. semih dedi ki:

    Video kaydı nasıl yapabilirim

  3. semih dedi ki:

    Unity de bu kodu atıp hem görüntü alıp hemde android cihaza nasıl görüntüyü kaydedebilirim

    • yasirkula dedi ki:

      Unity’de video kayıt için hazır bir fonksiyon olduğunu sanmıyorum ancak belki asset store’da bu iş için plugin’ler vardır. Görüntüden kastınız ekranın resmini çekmek idiyse Application.CaptureScreenshot fonksiyonu işinizi görebilir.

  4. Kimex dedi ki:

    Merhaba ben netteki bir resmi oyuna yukleyip arka fon veya bir buton resmi olarak kullanmayı düşünüyorum . Bunu nasıl yapabilirim ? Unity nin sitesinden baktım ama http://docs.unity3d.com/ScriptReference/WWW.html olmadı

  5. İsmail Güven dedi ki:

    İyi çalışmalar Yasir Bey. Bu kodun C# versiyonunu verebilme şansınız var mı. Birde çektiğimiz fotoğrafı kaydetme kodunuda verebilirmisiniz ?

    • yasirkula dedi ki:
      using UnityEngine;
      using System.Collections;
      
      public class Webcam : MonoBehaviour
      {
      	private WebCamTexture webcam;
      	private int mevcutWebcam; // Cihazda birden çok webcam varsa aralarında geçiş yapmak için kullanacağımız bir kod
      	private WebCamDevice[] webcamCihazlari; // Aygıttaki tüm webcam'leri depolayan bir değişken
      	private Quaternion anaRotasyon; // Kameranın ekrana yamuk yumuk açılarla yansımasını engellemek için bir değişken
      	 
      	IEnumerator Start ()
      	{
      		if( Application.platform == RuntimePlatform.OSXWebPlayer || Application.platform == RuntimePlatform.WindowsWebPlayer )
      		{
      			// UNITY yapımcıları webcam özelliğini WebPlayer olarak çalışan uygulamalarda açmadan önce kullanıcıdan izin almamızı lazım kılıyor. 
      			// Bunun için eğer uygulama WebPlayer olarak çalışıyorsa aşağıdaki şekilde kullanıcıdan izin istiyorum. 
      			// İzin vermezse scripti siliyorum...
      			yield return Application.RequestUserAuthorization( UserAuthorization.WebCam );
      			 
      			if( !Application.HasUserAuthorization( UserAuthorization.WebCam ) )
      			{
      				Destroy( this );
      			}
      		}
      		 
      		webcamCihazlari = WebCamTexture.devices;
      		 
      		// Eğer cihazda en az 1 tane webcam varsa 0. indexteki webcam cihazını "webcam" değişkenine ata; eğer webcam yoksa hata mesajı ver
      		if( webcamCihazlari.Length != 0 )
      		{
      			webcam = new WebCamTexture( webcamCihazlari[0].name );
      			mevcutWebcam = 0;
      		}
      		else
      		{
      			Debug.LogError( "HATA! CİHAZDA WEBCAM BULUNAMADI!" );
      			 
      			// Hata mesajının ardından bu scripti objeden silerek OnGUI fonksiyonunun hata vermesinin önüne geç
      			Destroy( this );
      		}
      		 
      		// Objenin texture'sine (dış yüzey kaplaması) webcam'i ata
      		renderer.material.mainTexture = webcam;
      		 
      		// Webcam'den veri almaya başla (Webcam'i çalıştır)
      		webcam.Play();
      		 
      		anaRotasyon = transform.rotation;
      	}
      	 
      	void Update ()
      	{
      		// Her kameranın kendine has bir çekim açısı olabilir. Bu kod objeyi kameranın çekim açısına göre otomatik olarak döndürüyor (benim de tam anlamadığım bir şekilde)
      		transform.rotation = anaRotasyon * Quaternion.AngleAxis( webcam.videoRotationAngle, Vector3.up );
      	}
      	 
      	void OnGUI ()
      	{
      		// Webcam'i duraklatmak/devam ettirmek ya da durdurmak için ekranın sol üstüne butonlar ekle
      		if( webcam.isPlaying )
      		{
      			if( GUI.Button( new Rect( 10, 10, 100, 50 ), "DURAKLAT" ) )
      				webcam.Pause();
      				 
      			if( GUI.Button( new Rect( 10, 70, 100, 50 ), "DURDUR" ) )
      				webcam.Stop();
      		}
      		else
      		{
      			if( GUI.Button( new Rect( 10, 10, 100, 50 ), "OYNAT" ) )
      				webcam.Play();
      		}
      		 
      		// Görüntüyü ters çevirmek için butonlar ekle (fantazi işte)
      		if( GUI.Button( new Rect( 10, 150, 100, 50 ), "DİKEY ÇEVİR" ) )
      		{
      			Vector3 scale = transform.root.localScale;
      			scale.y *= -1;
      			transform.root.localScale = scale;
      		}
      			 
      		if( GUI.Button( new Rect( 10, 210, 100, 50 ), "YATAY ÇEVİR" ) )
      		{
      			Vector3 scale = transform.root.localScale;
      			scale.x *= -1;
      			transform.root.localScale = scale;
      		}
      			 
      		// Eğer varsa başka kameralara geçmek için buton ekle
      		if( GUI.Button( new Rect( 120, 10, 100, 50 ), "KAMERA DEĞİŞ" ) )
      		{
      			if( webcamCihazlari.Length != 1 )
      			{
      				webcam.Stop();
      				mevcutWebcam = ( mevcutWebcam + 1 ) % webcamCihazlari.Length;
      				webcam = new WebCamTexture( webcamCihazlari[ mevcutWebcam ].name );
      				renderer.material.mainTexture = webcam;
      				webcam.Play();
      			}
      		}
      		 
      		// Eğer cihazda ön kamera varsa ilk ön kameraya geçiş yapmayı sağlar
      		if( GUI.Button( new Rect( 230, 10, 120, 50 ), "ÖN KAMERA" ) )
      		{
      			for( int i = 0; i < webcamCihazlari.Length; i++ )
      			{
      				WebCamDevice wc = webcamCihazlari[i];
      				 
      				// Eğer wc (seçili webcam) öne bakıyorsa mevcut kamerayı buna ayarla
      				if( wc.isFrontFacing )
      				{
      					webcam.Stop();
      					mevcutWebcam = i;
      					webcam = new WebCamTexture( wc.name );
      					renderer.material.mainTexture = webcam;
      					webcam.Play();
      					 
      					return;
      				}
      			}
      		}
      		 
      		// Eğer cihazda arka kamera varsa ilk arka kameraya geçiş yapmayı sağlar
      		if( GUI.Button( new Rect( 360, 10, 120, 50 ), "ARKA KAMERA" ) )
      		{
      			for( int j = 0; j < webcamCihazlari.Length; j++ )
      			{
      				WebCamDevice wc2 = webcamCihazlari[j];
      				 
      				// Eğer wc2 (seçili webcam) arkaya bakıyorsa mevcut kamerayı buna ayarla
      				if( !wc2.isFrontFacing )
      				{
      					webcam.Stop();
      					mevcutWebcam = j;
      					webcam = new WebCamTexture( wc2.name );
      					renderer.material.mainTexture = webcam;
      					webcam.Play();
      					 
      					return;
      				}
      			}
      		}
      	}
      }
      

      Nasıl resim kaydedileceğini bilmiyorum, onun için “unity save webcam to device” şeklinde arama yapabilirsiniz.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s