Yazan : Şadi Evren ŞEKER

OpenGL kullanılarak perspektif değerlerinin 3 boyutlu uzayda uygulanması için aşağıdaki verilerin belirlenmesi gerekir:

  • kameranın konumu
  • kameranın açısı (Baktığı yön)
  • perspektif şekli ve katsayıları

Yukarıdaki maddelerden ilki opengl ortamında, glLookAt fonksiyonu ile programlanmaktadır.

glLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);

Yukarıdaki değerleri verilen fonksiyonun kullanımı aşağıdaki şekilde gösterilmşitir:

Buna göre eye (x,y,z) değerleri kameranın konumunu, at(x,y,z) değerleri kameranın baktığı noktayı ve son olarak up(x,y,z) değerleri de kameranın baktığı yönle nasıl bir açı yaptığını (bu eksen etrafında ne kadar döndürüldüğünü) belirlemek için kullanılan kerteriz noktalarıdır.

Yukarıdaki maddelerden sonuncusu olan perspektifin çizim ortamında uygulanması da aşağıdaki şekilde gösterilmiştir:

Yukarıdaki şekilde, solda duran bir kameranın, sağdaki bir çizim ortamını nasıl görüntülediği tasvir edilmiştir. Burada 6 adet değer perspektifin hesaplanması ve kamera görüntüsünün oluşturulmasında önemli rol oynar:

  • near (yakın perspektif ekranının uzaklığı)
  • far (uzak perspektif ekranının uzaklığı)
  • up ( üst sınır)
  • down (alt sınır)
  • left (sol sınır)
  • right (sağ sınır)

Yukarıda verilen bu değerlere göre bir çizim ortamının uzak ve yakın iki limit arasındaki perspektifini alıp bir kamera görüntüsü üzerine yansıtmak mümkün olabilir.

Bu işlem sırasında aşağıdaki matris (masfuf) kullanılır:

		   (					   )
		   |  __________			   |
		   |  right-left       0       A       0   |
		   |					   |
		   |	  0	  __________   B       0   |
		   |		  top-bottom		   |
		   |	  0	       0       C       D   |
		   |					   |
		   |	  0	       0       -1      0   |
		   (					   )

Yukarıdaki bu matirs perspektifi hesaplarken aşağıdaki komutu kullanmaktadır:

	  void glFrustum( GLdouble left,
			  GLdouble right,
			  GLdouble bottom,
			  GLdouble top,
			  GLdouble zNear,
			  GLdouble zFar	)

Dolayısıyla perspektifin uygulanması istenen bir çizim alanında glFrustum fonksiyonu yukarıdaki parameterelerle çağırılarak 3 boyutlu uzayda iki ekran (yakın ve uzak ekranlar (clipping window)) arasındaki perspektifi hesaplamaktadır.

Bu hesaplanma sırasında uygulanacak olan perspektif ise gluPerspective fonksiyonu ile aşağıdaki şekilde verilir:

gluPerspective (theta, aspect, dnear, dfar)

Bu fonksiyondaki theta perspektifin yaptığı dönüş açısını, aspect en/boy oranını, dnear ve dfar ise sırasıyla yakın ve uzak perspektif panellerine olan uzaklığı vermektedir.  gluPerspective ve glFrustum fonksiyonları aşağıdaki gibi beraber kullanılırlar:

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(60.0, 1.0, 1.5, 20.0);
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode (GL_MODELVIEW);

Yukarıdaki örnekte MatrixMode öncelikle projection’a ayarlanmmış ardından Birim matris ile şekil değiştirme matrisi atanmış ve ilgili perspektif değerleri çizim ortamına uygulanmıştır.

yukarıdaki kodda glFrustum fonksiyonuna verilen değerlere bakıldığında sol-sağ aralığı 1.0 ile -1.0 aralığında , üst-alt aralığı da 1.0 ile -1.0 aralığında olmaktadır. Dolayısıyla bir kare görüntü kameraya yansıtılacak ve şekillerin en/boy oranı 1’e 1 olarak görüntülecenektir. Ayrıca yakın düzlem 1.5 ve uzak düzlem 20 olarak verilmiştir. Bunun anlamı bu uzaklıklar arasında kalan şekiller gluPerspective fonksiyonunda verilen perspektif değerlerine göre yansıtılacaktır.

Yorumlar

  1. Şadi Evren ŞEKER Article Author

    Bilebildiğim kadarıyla bu şekilde hazır bir dönüşüm yok, en azından tek bir şekil dönüşümü ile (transformation) yapılması mümkün değil. Ancak bunun için özel bir kod yazabilirsiniz.
    Buradaki kritik nokta, bu resimlerin 3 boyutlu modelleme amacı olmaması. Yani genelde bilgisayar grafiklerindeki amaç, bilgisayar dünyasında, gerçek dünyada olabilecek şekilleri modellemek ve yanılsamalar üzerinden sanal bir dünya kurmaktır. Belki sanatsal amaçlarla bu resimlerdeki gibi çizimler isteniyor olabilir ancak bu amaç doğrudan bilgisayar grafiği çalışmalarına hitap etmiyor. Yine de özel bir transformasyon matrisi ile bu resimlerdekiler oluşturulabilir kanaatindeyim. Yapmanız gereken birden fazla kamera açısına göre (perspektif noktasına göre değil) resmin farklı çıktılarını elde etmek ve daha sonra bölgesel olarak resmi kesip bu resimleri birleştirmek olmalıdır.

    Benzer bir çalışma aşağıdaki şekilde bulunmaktadır:

    Şimdi bu yukarıdaki şekilde, ekran 4 kenar için 4 bölgeye bölünmüş, resmin her bölede ayrı bir perspektif değeri alınmış ve sonra köşegenlerde birleştirilmiştir denilebilir. Bu durumda köşegenlerin transform olmaması ve orjinal kalması ancak köşegenlerden uzaklaştıkça transformasyonun artmasını beklersiniz. Sonra köşegenlerde resmi birleştirdiğinizde parçalar hatasız olarak birbirine uyumlu hale gelir. Sizin yolladığınız resimler için sanırım en mantıklı yol bu ama farklı yollar da olabilir.

    Başarılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir