Unity’de Yeşil Perde Yapımı (Green Screen)

Unity’de Yeşil Perde Yapımı (Green Screen)

11 Mart 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki dersimizde Unity‘de top havuzu yapmıştık.Yine bu dersimizde farklı bir proje gerçekleştireceğiz.Evet bu dersimizin konusu, yeşil perde (green screen) yapımı olacak.Projenin temel mantığı, başka bir yerde kamera ile çektiğimiz görüntüyü istediğimiz yere taşımak olacak.Böylece Unity ile green screen yapmış olacağız.Şimdi sözü fazla uzatmadan yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizi oluşturmaya başlayalım.

Evet bu projemizde kullanacağımız senaryoyu inceleyelim.Öncelikle bir araç modelimiz olacak.Bu model etrafına yerleştireceğimiz yeşil perdelere farklı bir görüntüyü yansıtarak, amacımıza ulaşacağız.Şimdi yeni bir Plane nesnesi oluşturarak sahnemizi hazırlamaya başlayalım.Daha sonra iki adet daha Plane nesnesi oluşturuyoruz.Bu nesneler ise, bizim kamera ile çekeceğimiz referans görüntüleri oluşturacak.Tabi bu iki Plane nesnesi birbirine dönük ve dik konumda olmalılar.Bunun için, bir tanesini x ekseninde “90” derece döndürürken, diğerini ise hem x ekseninde “90” derece döndürüyoruz hemde y ekseninde “180” derece döndürüyoruz.

Daha sonra istediğimiz bir görseli projemize dahil ediyoruz.Daha sonra bu görsel dosyamızı sürükleyerek, her iki Plane nesnemize ekliyoruz.Ben araba üzerine bir senaryo hazırladığım için, manzara üzerine bir görsel seçimi yaptım.Daha sonra bu Plane nesneleri için, iki adet yeni Camera oluşturuyoruz.Bu kameraları Scene penceresinden görsellere, tam karşılarından bakacak şekilde yerleştiriyoruz.Son olarak, bu Plane nesnelerimize iki yeni etiket oluşturarak ekliyoruz.

Unity-Yeşil-Perde-Yapımı-green-screen-and-3d-object-in-move-tutorial

Şimdi internetten bulabileceğiniz bir araç modelini projemize dahil edelim.Burada dikkat etmeniz gereken, seçtiğiniz modelin içinin de modellenmiş olmasıdır.Araba modelimizi sahnemize ekledikten sonra, ana kameramızın (camera.main) geleceği referans noktayı belirlememiz gerekiyor.Bunun içinde basit olarak bir Cube nesnesi oluşturuyoruz.Daha sonra bu Cube nesnesini, Scene penceresinden araç içine yerleştiriyoruz.

Ben ön koltukta olacak şekilde bir yerleşim belirledim.Sonra bu nesne için yeni bir etiket oluşturuyoruz.Bu nesnenin gereksiz bileşenlerini silebilirsiniz.Ancak sadece transform bilgilerini alacağımız için herhangi bir çakışma olmayacaktır.

Unity-Yeşil-Perde-Yapımı-green-screen-and-3d-object-in-move-tutorial

Evet şimdi yeşil perdelerimiz için yine internetten bulduğumuz modelleri projemize dahil ediyoruz.Bu modeller sadece görsel açıdan yardımcı oluyorlar.Eğer modellerle uğraşmak istemiyorsanız, direk proje için gerekli nesneler ile de oluşturmak mümkündür.

Yeşil perdelerimizi yerleştirdikten sonra, her iki model üzerine yeni bir Quad nesnesi oluşturuyoruz.Bu Quad nesnelerini, Scene penceresinden tam perde ölçülerinde ayarlıyoruz.Bunları yaptıktan sonra artık kamera ile çektiğimiz görüntüyü yeşil perdelerimize ekleyebiliriz.

Unity-Yeşil-Perde-Yapımı-green-screen-and-3d-object-in-move-tutorial

Bunun için ilk olarak, Project penceresinde iki adet Render Texture oluşturuyoruz.Daha sonra bu Render Texture dosyalarını, sahnemizde ki iki Camera nesnesinin Inspector penceresinde bulunan Target Texture bölümüne ekliyoruz.Her iki kameramıza aynı işlemleri yaptıktan sonra, sıra yeşil perdemize bu görüntüyü eklemeye geliyor.Bunu yapmak içinde her iki Quad nesnemizin üzerine, bu Render Texture dosyalarını sürükleyip bırakıyoruz.Artık istediğimiz görüntüyü yeşil perdemizin üzerine aktarabiliyoruz.

Unity-Yeşil-Perde-Yapımı-green-screen-and-3d-object-in-move-tutorial

Projemizde yapmamız gereken önemli işlemleri gerçekleştirdik.Ben ekstra olarak başka modeller, ışık, kaplamalar gibi projenin mekaniğini etkilemeyecek şeylerde kullandım.Şimdi kod yazmaya başlayalım.

Kodları yazmaya başlayalım.

Yeni bir C# Script dosyası oluşturuyoruz.Daha sonra bu script dosyamızı editör yardımı ile açalım ve kodlarımızı yazmaya başlayalım.

public Camera AnaKamera;
public Transform OturmaYeri;
public GameObject SagYesilPerde;
public GameObject SolYesilPerde;
private Renderer SagPerdeKaplama;
private Renderer SolPerdeKaplama;

İlk olarak değişkenlerimiz oluşturmakla başlıyoruz.İlk satırda, ana kameramızı kontrol temek için bir değişken oluşturuyoruz.İkinci satırda, bir Transform değişkeni oluşturuyoruz.Bu değişkende ana kameramızın geleceği, transform bilgilerini tutacağız.Üçüncü ve dördüncü satırlarda, GameObject değişkenleri oluşturuyoruz.Bu değişkenlerde, üzerinde görsellerin olduğu nesneleri kontrol edeceğiz.Beşinci ve altıncı satırlarda ise, Renderer değişkenleri oluşturuyoruz.Bu değişkenlerle ise, nesnelerimizin üzerinde bulunan görselleri kontrol edeceğiz.

public float kaydirmaHizi;
public float KameraninMinXSiniri; 
public float KameraninMaxXSiniri; 
public float KameraninMinYSiniri; 
public float KameraninMaxYSiniri; 
public float FareHassasiyeti; 
private float FareninXEkseni; 
private float FareninYEkseni;

Değişkenlerimizi oluşturmaya devam ediyoruz.Buradaki tüm değişkenleri float türünde oluşturuyoruz.İlk satırdaki değişken ile, görsellerimizin nesne üzerindeki kayma hızını belirliyoruz.İkinci ve beşinci satırlar arasında, araç içinde konumlanacak kameramızın minimum ve maksimum x ve minimum ve maksimum y sınırlarını belirliyoruz.Altıncı satırdaki değişkenimizde, faremizin hareket hızını belirliyoruz.Yedinci ve sekizinci satırlarda ise, faremizin x ve y eksenleri için bir değişken oluşturuyoruz.

Kameramızı yerine yerleştirelim.

AnaKamera = Camera.main;
OturmaYeri = GameObject.FindWithTag ("oturma_pozisyonu").transform;
AnaKamera.transform.SetParent (OturmaYeri);
AnaKamera.transform.position = OturmaYeri.position;
AnaKamera.transform.rotation = OturmaYeri.rotation;

Evet şimdi, start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda, değişkenimize ana kameramızı tanımlıyoruz.İkinci satırda değişkenimize, etiketi “oturma_pozisyonu” olan nesnemizin, transform özelliklerini tanımlıyoruz.Üçüncü satırda ana kameramızı, SetParent fonksiyonu yardımı ile referans nesnemizin çocuk nesnesi yapıyoruz.Dördüncü ve beşinci satırlarda ise, ana kameramızın position ve rotation değerlerini, ebeveyn nesnesinin değerlerine eşitliyoruz.

SolYesilPerde = GameObject.FindWithTag ("duvar1");
SolPerdeKaplama = SolYesilPerde.GetComponent<Renderer> ();
SagYesilPerde = GameObject.FindWithTag ("duvar2");
SagPerdeKaplama = SagYesilPerde.GetComponent<Renderer> ();

Yine start() fonksiyonumuzdan devam ediyoruz.İlk satırda değişkenimize, etiketi “duvar1” olan nesnemizi tanımlıyoruz.İkinci satırda değişkenimize, “SolYesilPerde” değişkeninde ekli olan nesnemizin, Renderer bileşenini tanımlıyoruz.Üçüncü ve dördüncü satırlarda ise benzer işlemleri tekrarlıyoruz.

kaydirmaHizi = 0.1f;
KameraninMinXSiniri = -5f; 
KameraninMaxXSiniri = 20f; 
KameraninMinYSiniri = -60f; 
KameraninMaxYSiniri = 60f; 
FareHassasiyeti = 5f; 
FareninXEkseni = 0f; 
FareninYEkseni = 0f; 
Cursor.lockState = CursorLockMode.Locked;

Start() fonksiyonumuzdan devam ediyoruz.İlk satırda, değişkenimize bir değer tanımlıyoruz.Bu değişken, görsellerimizin kayma hızını ayarlıyor.İkinci ve beşinci satırlar arasında bulunan değişkenlere ise, deneme yanılma yolu ile belirlediğimiz değerleri tanımlıyoruz.Bu değerler ile, ana kameramızın x ve y eksenindeki sınırlarını belirliyoruz.

Altıncı satırda fare hızımız için oluşturduğumuz değişkene bir değer veriyoruz.Yedinci ve sekizinci satırlardaki değişkenlerin değerlerini sıfıra eşitliyoruz.Çünkü bu değişkenlerin değerleri faremizin ilgili eksenlerine göre değişiklik gösterecektir.Son satırda ise, faremizin imlecini kilitliyoruz.

Kullandığımız görseli harekete geçirelim.

float kaydir = Time.time * kaydirmaHizi;
SagPerdeKaplama.material.SetTextureOffset("_MainTex", new Vector2(-kaydir, 0));
SolPerdeKaplama.material.SetTextureOffset("_MainTex", new Vector2(kaydir, 0));

Evet bu kodları update() fonksiyomuzun içerisine yazıyoruz.İlk satırda, yeni bir float türünde değişken oluşturuyoruz.Bu değişkenimize, “kaydirmaHizi” değişkeni ile Time.time fonksiyonunu çarparak eşitliyoruz.Böylece belirli bir kare hızı elde ediyoruz.İkinci satırda, “SagPerdeKaplama” Renderer değişkeninde tanımlı olan nesnemizin, SetTextureOffset özelliğine erişiyoruz.

Burada, “_MainTex” yani ana kaplamamıza x eksenindeki yeni değerini veriyoruz.Üçüncü satırda da diğer duvarımız için, aynı işlemi gerçekleştiriyoruz.Burada dikkat etmeniz gereken, duvarlarımız birbirlerine baktıkları için aynı yönde hareket etmeleri gerekecektir.Bu durumda da, bir duvarımızın x eksenindeki hareketini ters yönde gerçekleştirmemiz gerekiyor.Bunu yapmak için, değişkenimizin başına eksi “-” işaretini ekliyoruz.

FareninYEkseni += Input.GetAxis ("Mouse X") * FareHassasiyeti * Time.deltaTime; 
FareninXEkseni += Input.GetAxis ("Mouse Y") * FareHassasiyeti * Time.deltaTime; 
FareninXEkseni = Mathf.Clamp (FareninXEkseni, KameraninMinXSiniri, KameraninMaxXSiniri); 
FareninYEkseni = Mathf.Clamp (FareninYEkseni, KameraninMinYSiniri, KameraninMaxYSiniri); 
AnaKamera.transform.localRotation = Quaternion.Euler (-FareninXEkseni, FareninYEkseni, 0);

Update() fonksiyonumuzdan devam ediyoruz.Bu kodlar ile, araç içindeki kameramızı faremiz ile kontrol edebileceğiz.Bu kodları daha önceki projelerde detaylı olarak anlattığım için, şimdi yüzeysel geçeceğim.İlk ve ikinci satırlarda faremizin x ve y eksenindeki değerleri, “FareHassasiyeti” değişkeni ve Time.deltaTime fonksiyonu ile çarparak ilgili değişkene eşitliyoruz.

Böylece yumuşak bir kamera hareketi elde ediyoruz.Üçüncü ve dördüncü satırlarda ise faremizin x ve y eksenleri için oluşturduğumuz değişkenlere, Mathf.Clamp fonksiyonunu kullanarak sınırlamalar ekliyoruz.Aldığı parametreler, farenin o anki ekseni, alacağı minimum değeri ve maksimum değeri şeklinde oluyor.

Son satırda ise ana kamera değişkenimizin, rotation değerlerini değiştiriyoruz.Bunu yaparken, Quaternion fonksiyonundan yararlanıyoruz.Parantez içerisinde, farenin x eksenindeki değerinin bulunduğu değişkeni ve farenin y eksenindeki değerinin bulunduğu değişkeni yazıyoruz.Z ekseni ile işimizin olmadı içinde sıfır “0” yazıyoruz.Evet script dosyamız hazır duruma geldi.

Evet şimdi oluşturmuş olduğumuz C# Script dosyamızı eklemek için boş bir nesne oluşturuyoruz.Daha sonra bu boş nesnemizin üzerine script dosyamızı sürükleyerek bırakıyoruz.Artık projemizi test etmeye hazırız.Bir sonraki yazıda görüşmek üzere…

Unity-Yeşil-Perde-Yapımı-green-screen-and-3d-object-in-move-tutorial