plazma - amatör bilgisayar kültürü

Grafik Efektler için Matematik 3

Bilgem 'Nightlord' Çakır

1. Matrisler

Vektörler üzerinde çalışırken çok elemanlı vektörleri ve dönüşümleri kullandığımız için bu kavramları ifade ederken kullandığımız bir matematiksel araçtır matrisler. Mesela aşağıda bir matris görüyorsunuz

Şekil 1.

Bu sudoku görünümlü şey aslında 3x3’lük bir matris. Matrisler m x n büyüklüğü ile sınıflandırılırlar. Burada m satır sayısı n ise sütun sayısıdır. Ve m ile n eşit olmak zorunda değildir. Örneğin;

Şekil 2.

Matrisler genelde büyük harflerle isimlendirilir. Bir matrisin m satır ve n sütünu içindeki her bir skaler’e matrisin “elemanları” denir. Matris elemanları genelde matrisi adlandıran büyük harfin küçük hali ve indexler ile isimlendirilir. Matris elemanları hangi satır ve sütunda olduklarına göre indexlenebilir. Örnegin ilk örnegimizdeki A matrisindeki bazı elemanlar:

a12 = 3

a31 = 6

a11 = 2

Bir matrisin ebadını tanımlayan bu “m x n” kavramına matrisin “tipi” diyelim.

Şu ana kadar detaylı şekilde inceleyegeldiğimiz vektörler de matris şeklinde yazılabilir. Örneğin (2, 6, 1) gibi bir 3 boyutlu vektör bir önceki örnekte görülen ortadaki “3 x 1” tipindeki C matrisi olarak yazılabilir.

2. Matris İşlemleri

Dayanın heyecanlı yerlere geliyoruz. Matrisler üzerinde toplama, çıkarma ve çarpma işlemlerini yapmak mümkündür (bölme demedim dikkat). Bunlar da 3D efektler yaparken hayati önem taşıyan işlemler olduklarından gelin hemen onlara da bakalım.

2.1. Matrisleri toplama ve çıkarma

İki matrisin toplanabilmesi veya çıkarılabilmesi için aynı tipte (yani aynı m x n ebadında) olmaları gereklidir. Aynı tipte olmayan matrisler arasında toplama veya çıkarma yapılamaz.

Aynı tipteki iki matrisi toplarken/çıkarırken yapmamız gereken tek şey iki matriste aynı satır ve sütuna denk gelen elemanları toplamak/çıkarmaktır.

Şekil 3.

2.2. Matrislerin Çarpılması

Matrislerde çarpma işlemi, toplama ve çıkarmaya göre biraz daha karışık ancak bir kere nasıl yapıldığını öğrendiğinizde problem olmayacak.

Öncelikle tıpkı toplama ve çıkarma işlemlerinde yaptığımız gibi, iki matrisin çarpılabilmesi için gereken ön koşulu tanıtalım. İki matrisin çarpılabilmesi için birinci matrisin sütun sayısı ile ikinci matrisin satır sayısı aynı olmalıdır. Başka bir deyişle m1 x n1 tipindeki bir matris ile m2 x n2 büyüklüğündeki ikinci bir matrisin çarpılabilmesi için n1 = m2 olması gerekir. Örneğin 3x2 lik bir matris ile 2x6 lık bir matris çarpılabilir. Ancak 2 x 1 lik bir matris ile 4 x 3 lük bir matris çarpılamaz. Aynı tipteki kare matrisler(2x2, 3x3, 4x4 ...) birbiri ile çarpılabilir.

Bu koşulun nedenini anlamak için gelin matris çarpma işleminin basamaklarına bakalım

Elimizde A ve B diye iki tane 2x2’lik matris olsun

Şekil 4.

Bu iki matrisin çarpımına da C matrisi adı verelim:

A x B = C

Bu iki matrisi çarpmak için yapmamız gereken:

  1. Birinci matrisin ilk satırını al

  2. İkinci matrisin ilk sütununu al

  3. Birinci matristen gelen a1x degerlerini, ikinci matristen gelen bx1 degerleri ile çarp ve sonuçları topla. Başka bir deyişle yukarıdaki örnekte: (a11 x b11) + (a12 x b21)

  4. Bu degeri sonuç matrisinde birinci satır birinci sütun sonucu olarak yaz

Bu dört basamağı C’nin bütün elemanları için genelleyeceğiz. Bu genellemeyi yapmak için aynı basamakları şöyle yazalım:

C’nin “m’inci satırında n’inci sütununda olan elemanını” (cmn) hesaplamak için

  1. Birinci matrisin m’inci satırını al

  2. İkinci matrisin n’inci sütununu al

  3. Birinci matristen gelen amx degerlerini, ikinci matristen gelen bxm degerleri ile çarp ve sonuçları topla. Başka bir deyişle yukarıdaki örnekte: (am1 x b1n) + (am2 x b2n)

  4. Bu degeri sonuç matrisinde m’inci satır n’inci sütun sonucu olarak yaz

Bu kuralları örneğimize uygularsak:

Şekil 5.

İşte birinci matriste bir satırdan alınan değerler ile ikinci matriste bir sütundan alınan değerler bire bir çarpılıp sonuçlar toplandığı için (bir nevi vektörlerdeki “nokta çarpımı” işlemi gibi), bu bölümün başında verdiğimiz ön koşul var. Eğer m1 x n1 ve m2 x n2 tipindeki iki matriste n1 ve m2 eşit değilse bu işlem yapılamıyor.

Şimdi değişik boylarda birkaç matrisin nasıl çarpıldıklarını görmek için aşağıdaki örneklere bakın:

Şekil 6.

Şimdi birkaç sayısal örnek verelim:

Şekil 7.

3. Matrislerle ilgili bazı özellikler:

  1. Yukarıda ikinci örnekte görülen köşegen üstündeki elemanların 1 diger bütün elemanların 0 olduğu matrise “Birim Matrisi” denir. Birim matrisi çarpmada “etkisiz eleman”dır. Başka bir deyişle herhangi bir A matrisi Birim matris ile çarpılırsa sonuç gene A matrisi olacaktır.

  2. m x n tipinde bir matris ile n x k tipinde bir matris çarpıldığında sonuç m x k tipinde olacaktır.

  3. 2x2, 3x3, 4x4 gibi kare matrisler bilgisayar grafik aleminde en çok kullanılan matrislerdir.

  4. n boyutlu bir vektör de genelde n x 1 tipinde bir matris olarak yazılabilir.

  5. Matris çarpımında “değişme özelliği” yoktur. Yani AxB ile BxA eşit değildir. Hatta ikisinden biri tanımlı bile olmayabilir.

  6. Matris çarpımında “birleşme özelliği” vardır. Yani A x ( B x C ) = ( A x B ) x C

4. Vektörel dönüşümlerin matris olarak gösterilmesi

Şimdi matrisleri bir takım sayı öbekleri olmaktan çıkarıp bize faydalı hale getirme zamanı geldi. Matrisler hakkında bu kadar konuşmamızın nedeni bir önceki bölümde bahsettiğimiz vektör dönüşümlerini (yer değiştirme, dönme, ölçekleme gibi) matrisler haline getirebilmemiz. Nasıl mı? Mesela “dönme” dönüşümünü hatırlayalım.

Elimizde P(x1, y1) noktası var. Biz bu noktayı origin etrafında a açısı kadar döndürüp Q(x2, y2) noktasına ulaşmak istiyoruz. Formülümüzü şöyle hesaplamıştık:

x2 = (x1)cos(a) – (y1)sin(a)

y2 = (x1)sin(a) + (y1)cos(a)

Bu formülü matrisler cinsinden de yazabiliriz. Hatırlarsanız vektörlerin matris olarak yazılabileceğini söylemiştik. Dolayısıyla Q ve P vektörlerini matris olarak yazarsak.

Şekil 8.

şimdi formüle bir daha bakın. Formüldeki iki satırda yapılan işlemleri tek bir matris işlemi ile ifade etmek mümkün mü? Özellikle dikkatimizi çeken noktalar:

  1. eşitliklerin solunda x2 ve y2 birlikte Q vektörünü temsil eden matris olarak yazılabilir

  2. sağ tarafta da bir takım değerler x1 ve y1 ile çarpılıp sonuç toplanıyor (ya da çıkarılıyor ama o eksi işareti kolayca artıya çevrilebilir)

Öyleyse biz bu formülü aşağıdaki gibi yazabiliriz.

Şekil 9.

Q = Dönme(a) x P

İşte burada dönme dönüşümünü bir Matris halinde yazmış olduk. Matrisleri en çok bu amaçla kullanacağız. Yani dönüşümleri ifade etmek için.

Burada şunu sorabilirsiniz. Bir dönüşümü ha matrisle ifade etmişiz , ha önceki formüldeki satırları ayrı ayrı hesaplamışız ne farkeder? Bu çok mantıklı bir soru. Şu an için bir fark görmediniz; farkı açıklayabilmek için birazdan bileşik dönüşümlerden bahsedeceğiz.

Şimdi bir de “yer değiştirme” dönüşümünü hatırlayalım.

Elimizde P(x1, y1) noktası var ve biz bu noktanın D(dx, dy) vektörü kadar yer değiştirmesini istiyoruz. Boylece Q(x2, y2) noktasına ulaşacağız.

x2 = x1 + dx

y2 = y1 + dy

peki bunu nasıl matris olarak yazabiliriz? Tabi bunu

Q = P + D

Diye yazabiliriz elbette. Ancak bir önceki örnekte gördük ki dönme dönüşümünü bir noktaya uygularken dönüşüm matrisi ile noktayı temsil eden matrisi “çarptık”. Burada da istediğimiz yer değiştirme formülünü bir çarpım cinsinden ifade etmek.

Malesef bunu mevcut 2 boyutlu vektorler ile yapamıyoruz. Matematikçiler bu sorunu basit bir şekilde çözmüşler. Bakın ne yapmışlar.

Şekil 10.

Aslen iki boyutlu olan P ve Q vektörlerinin boyutunu bir artırıp oraya etkisiz eleman olan 1’i yerleştiriyoruz. Böylece 3x1’lik matrislerle artık 2 boyutlu vektörlerimizi temsil ediyoruz. O zaman dönüşümü temsil eden matrisimiz de deminki dönme dönüşümü örneğindeki gibi 2x2 olmak yerine 3x3 oluyor. Dikkat ederseniz dönüşüm matrisinin 11, 12, 21, ve 22 indexli elemanları birim matris gibiler ve sonuç vektöründeki toplama işlemlerine x1 ve y1 elemanlarının ulaşmasını sağlıyorlar. Matristeki dx ve dy elemanları ise çarpım esnasında P vektörünün 3. Elemanı olan 1 ile çarpılarak sonuc toplamalarındaki yerlerini alıyorlar.

Homojen dönüşümler

Ne yaptığımızı tekrar hatırlayalım

  1. vektörleri “nx1” tipinde matrisler olarak gösteriyoruz

  2. dönüşümleri “nxn” tipinde matrisler olarak gösteriyoruz.

  3. Bir dönüşümü bir vektöre uygulamak için iki matrisi çarpıyoruz.

Q = Dönüşüm x P

Şimdi bu dönüşümden sonuç olarak çıkan Q vektörüne bir başka dönüşüm daha uygulasak

R = Dönüşüm2 x Q = Dönüşüm2 x ( Dönüşüm x P )

Birleşme özelliğini kullanırsak:

R = (Dönüşüm2 x Dönüşüm) x P

Yani bunu genellersek şöyle diyebiliriz. Elimizde P noktası varsa ve biz bu noktaya n adet dönüşüm (D0, D1, D2, ... , Dn) uygulayacaksak

R = (Dn x Dn-1 x ... x D2 x D1) x P

İşlemini yapabiliriz.

Yalnız bu işlemi yapabilmemiz için gereken bir koşul var. Uygulanan bütün dönüşüm matrislerinin aynı boyda kare matrisler olması ve vektörün de o boya uygun satır sayısı içermesi. İşte bu yüzden kare matrisler en çok kullanılırlar.

Demin baktığımız iki dönüşüm örneğinde “yer değiştirme” dönüşümü için vektörlere bir fazla eleman eklememiz gerekmişti. Diğer bütün kullanacağımız dönüşümlerde de aynı boyda matris kullanmamız gerektiği için onları da bir büyüteceğiz. Yani 2 boyutlu noktalar için:

  1. 3x1’lik vektörler (son elemanı 1 olan)

  2. 3x3’lük dönüşümler

3 boyutlu noktalar için ise:

  1. 4x1’lik vektörler

  2. 4x4’lük dönüşümler

Kullanılır.

Bu şekilde birbiriyle çarpılabilen ve uç uca eklenebilen dönüşümlere “homojen” dönüşümler deniyor.

Şimdi son olarak 3 temel dönüşümün 2 boyutlu vektörlerle kullanılırken aldığı 3x3’lük matris formlarına bir kez daha bakalım.

Şekil 11.

5. Dönüşümlerin uygulanış sırası

Dönüşümlerde sıralama önem taşır. Çünkü aynı dönüşümler farklı sırayla uygulandığında farklı sonuçlar verirler (hatırlayın, matris çarpımında değişme özelliği yoktur demiştik)

Bileşik dönüşümleri genellediğimiz formüle tekrar bakarsak.

R = (Dn x ... x D2 x D1) x P

Bu işlemi iki türlü yorumlayabiliriz:

  1. Burada P’ye en yakın olan dönüşüm yani D1 ilk olarak P ye uygulanıyor. Bu dönüşümden sonra çıkan sonuca D2 uygulanıyor vs.

  2. İkinci yol ise dönüşümleri “koordinat sistemine uygulanıyor” olarak düşünmektir. Yani normal koordinat sisteminden başlarsak, önce Dn ile yeni bir koordinat sistemine ulaşıyoruz, sonra o sisteme D2 uygulanıyor vs.

Koordinat sistemine dönüşüm uygulamak demek koordinat sistemini tanımlayan eksen birim vektörlerini (mesela iki boyutlu uzay için (1, 0) ve (0, 1)) alıp dönüşümlerle iki yeni eksen elde etmek demektir. Bu iki eksen yeni bir koordinat sistemi tanımlar.

Değişik kişiler bu iki yorum arasından farklı seçimler yapabilir. Siz hangisini seçerseniz seçin, sıralamanın önemli olduğunu unutmayın.

6. Neden bütün bu matrislerle uğraşıyoruz

Artık bu soruyu cevaplayabiliriz. Hatırlarsanız amacımız pekçok nokta ile modellenmiş bir objeyi almak (bir oyundaki asker veya bir demodaki küpler) ve bir dönüşüm uygulayıp, yeni noktaların konumunu hesaplamaktı. Obje’deki nokta sayısı yüzbinlerce olabilir. Biz n tane dönüşümü yüzbin tane noktaya uygulamak ve sonuçta yüzbin yeni noktayı hesaplamak istiyoruz.

Bunu da hızlı yapmak istiyoruz. Çünkü bunu hızlı yapamazsak frame rate’imiz düşecek.

İşte matrisler ve vektörler bize bunu en hızlı yapmanın yolunu sağlıyor. Biz eger matrisleri kullanmıyor olsaydık, her dönüşümü tek tek bütün noktalara uygulayacak ve her dönüşümden çıkan sonuca bir sonraki dönüşümü uygulayacaktık. Eger bir dönüşümü bir noktaya uygulama için geçen zaman t ise, bir dönüşümü yüzbin noktaya uygulamak yaklaşık 100000 t alacaktı. Bu işlemi 5 dönüşüm için tekrarlayınca 500000 t olacaktı.

Oysa matrisler (ve homojen dönüşümler) sayesinde önce matrisleri birbiri ile (doğru sırada) çarpıp dönüşüm matrisini tek bir matrise indirgeyebiliyoruz. Sonra da bu matrisi 100000 nokta ile çarpınca yaklaşık 100000t zamanda pekçok dönüşümü uygulayabiliyoruz.

plazma - (2006 - 2011)