tr-demoscene

the scene => coding => teori => Konuyu başlatan: anesthetic - 02.10.2005 02:41:22

Başlık: Temel Geometri
Gönderen: anesthetic - 02.10.2005 02:41:22
3D ile uğraşmak isteyenler için başlangıç niteliğinde bir tutorial hazırlayayım istedim. Normalde bunu Antika için düşünüyordum ama burada da bulunsun hem Antika'nın ilk sayısı çıkana kadar anca bitmiş olur sanırım. Gerçi konu ile ilgili Sensei'nin, benim de zamanında işime yarayan "1D Uzay" yazısı var ama biraz daha geniş tutacağım hadiseyi.

Bu bi 3D grafik tutorialı olmayacak. Bu işin sadece uzay kısmını irdeleyeceğim. Dolayısıyla içerisinde kod örnekleri sunmama gerek yok. Zaten mesela matris çarpımını filan hangi dilde yazdığınız önemli olmayacak (teorik açıdan).

Daha önce bi software 3D kütüphanesi yazmıştım ama çok çok çok dandik fill algoritmam yüzünden sadece çizgi ve noktalarla uğraştım. Sonra OpenGL'e başlayınca fazla üzerine gitmedim. Ama OpenGL bile kullanıyor olsanız bir süre sonre glRotatef yahut glTranslatef'i filan geride bırakmak isteyeceksiniz. Tamam matris nedir bilmeden bi iki şey döndürebiliyoruz. Ama misal çeşitli kısımları çeşitli matris işlemlerine maruz kalmış büyük bir obje grubunu tek array'de nasıl tutacaksınız? Yani objenin bi kısmını OpenGL'e matrislerle çarptırıp ekrana bastınız mesela. Ama hangi uzay koordinatlarına yahut hangi piksele basıldığını bilmek istemez miydiniz? Bunları ezberden değil de anlayarak yapmak için olaylar nasıl gelişiyor bilmeniz lazım.

Şimdilik şu konuları ele alıcam. Daha ilerisine gitmek için biraz daha çalışmam lazım :)

- Geometri
- Vektör ve Uzay
- Kartezyen Sistem
- Üçüncü Boyut ve Devamı
- Neden Matrisler?
- Vektör Matrisleri
- Uzay Matrisleri
- Öteleme (Translation)
- Döndürme (Rotation)
- Boyutlandırma (Scaling)
- Daha Acayip Çevrimler
- Kartezyen Kamera (LookAt)

Kendinizi sıfır hissediyor yahut temelleri pekiştirmek istiyorsanız baştan dalın direk. Eğer geometri bilginiz fena değilse ama "Bu işleri matrislerle yapıyolar olm dedi geçen arkadaş, şaşırdım." diyorsanız. 'Neden Matrisler?'den başlayın. Yok eğer ben anladım bu matrisleri ama bi türlü kamera yazamadım diyorsanız da... Nerden başlayacağınızı biliyorsunuz.

Daha sonra ek olarak kısaca bazı matris işlemleri OpenGL'de nasıl yapılıyor ondan bahsederim. Ama o kısma kadar ne için kullandığınızı göz ardı edicem.

Son bir not da: Tutoriallar içinde italik yaptığım yazıları atlayabilirsiniz. Bunlar konunun yüzeyinden biraz uzaklaşan ve çok da gerekli olmayan bir takım açıklamalar olacaktır.

İlk yazı olarak 'Geometri'ye başlayabiliriz. Konuyu azıcık bilseniz bile bu yazı çok basit gelecektir. Ama tutarlılık açısından en temel kavramları vermem gerek diye düşünüyorum. Bi de çok matematik olmuş diyorsanız anlarım, tutorialın tamamı matematik olacak. Programlaması size kalmış.

Yazılar hakkında öneri, düzeltme, eleştiri ne varsa söylemekten çekinmeyin. Sonuçta ben de bu işin gurusu değilim. Daha bir çok şeyi idrak etme aşamasındayım. Tutorialı yazmamın bi sebebi de bu aşamayı hızlandırmak zaten.
Başlık: Temel Geometri
Gönderen: anesthetic - 02.10.2005 02:43:10
GEOMETRİ

Geometri, Bir Diğer Gudik Matematik Dalı

Öncelikle geometri deyince ne aklımıza geliyo? Doğrular, üçgenler, küpler filan. Matematiğin temel görsel alanı diyebiliriz. Örneğin 3 sayısı bir değer ama 'üçgen' dediğimiz vakit bir şekili ifade ediyoruz. Geometri kulanarak üçgenin bazı özelliklerini inceliyoruz. Üçgenin iç açıları toplamı 180 derece gibi mesela. Benzer şekilde 3 sayısının özelliklerini de aritmetikte görüyoruz. 3 asaldır gibi.

Şimdi bildiğimiz gibi bu üç sayısı doğal sayılar kümesinin bir elemanı. Doğal sayıların tüm elemanları reel sayıların elemanları olduğu için 3 aynı zamanda reel sayılar kümesinin de bir elemanı. Yani 2, 3, 3 buçuk gibi sayıları birer eleman gibi düşünüyoruz. Bu elemanlar çeşitli kümelere ait, bu kümeler birbirlerinin alt-üst kümeleri vs vs. Misal 2 çift sayılar kümesinin elemanı. Çift sayılar kümesi de rasyonel sayılar kümesinin alt kümesi vs.. vs..

Bunlar aslında temelde oldukça hardcore mevzular (kümeler filan) ama ilk bakışta neden bahsedildiğini anlaması oldukça kolay ilkeler. Küme deyince şaşırıp kalmıyorsanız teknik bir çok konuyu anlama şansınız yüksek.

Şimdi geometrik cisimleri (Doğru, nokta, kare vb...) bunun gibi benzer bir sistematiğe sokalım.

Geometride Kümeler

Reel sayılar kümesi, doğal sayılar kümesi gibi kümelerin ortak özelliği nedir, sayı kümeleri olmaları. Bu sayı kümeleri birbirleri içine geçmişler; alt kümeler, üst kümeler, kesişimler vs. gidiyor böyle. Ama hepsinin elemanları o en küçük birim olan sayılar. Aritmetikte sayılardan başka elemanlar tanımlı değil. Onlar aritmetiğin biricik, ufacık çocukları.

Şimdi geometride de böyle bi sistem kurmuş dedelerimiz. Demişler ki geometride biricik elemanım benim 'nokta' olsun. Diğer tüm geometrik cisimler bu noktaları içeren kümeler olsun.

Şimdi niye böyle tanımlamışlar diye sormayın, anlaması basit olsun diye işte. Siz elemanları küp olarak da tanımlayabilirdiniz. Bu sayede cisimleriniz voxel grupları olurdu. Uzaklıklarınız Planck uzaklığı gibi paketli olurdu. Ama düzlem yahut doğru gibi kavramlar bu sistemin dışında kalırdı. Yahut noktayı küme olarak tanımlayıp elemanları kendiniz belirlerdiniz. Bu sayede geometrinin uğraşmadığı mikro uzayları kapsardınız. Nasıl tanımlandığı matematiksel kural değil. Bunların hepsi kurgulanmış sistemler, matematiğin kendisi ise sistem kurgulama ve bu sistemlerin tutarlılığıyla ilgilenir. (Belki de sistemleri eleman olarak ele alan kurgulanmış bir metasistemdir!) Yani analojiyle anlatırsak: Geometri, Cebir, Aritmetik filan çeşitli programlarsa, matematik bir programlama dilidir. Flexi belki beni dövebilir :) ama ben böyle düşünüyorum. Oha, konudan bu kadar uzaklaşamazdık!)

Nerde kalmıştık. Ha, nokta (eleman) ve cisimler (küme). Şimdi elimizde bi üçgen var mesela. Bu üçgen, içinde bissürü nokta adlı elemandan barındıran bir küme. Bu üçgenin bir üst kümesi ise üçgenin üzerinde durduğu düzlem. Aynı noktalar bu düzlemin de elemanı.

Eğer noktalar ve cisimler kavramı ile sayılar ve sayı kümeleri kavramı arasında birebir ilişki yerleştiyse şimdi başka bi kademeye geçebiliriz. Bu noktaları bi şekilde sayılar gibi etiketlemeliyiz, bunun için 'Vektör ve Uzay'ları kullanacağız.
Başlık: Temel Geometri
Gönderen: anesthetic - 02.10.2005 02:51:27
VEKTÖR VE UZAY

Pozisyon

Şimdi sayıların hepsi aritmetikte birer eleman. Bu elemanları birbirinden ayıran (2'yi 3'ten ayıran şey mesela) bu sayıların 'miktar'ları. Bu elemanların hangi kümelerde olduğunu ya da hangi kümelerde olmadığını belirleyen şey bu miktar hadisesi. Eğer sayılara ait miktarlar olmasaydı onları büyüktür, küçüktür gibi karşılaştıramazdık. Yahut "Bu sayı böyledir, o sayı şöyledir." gibi bir takım etiketler yapıştırıp onları kümelere sokamazdık. Hepsi birbirinin aynı olurdu.

Geometrideki noktaları da birbirinden ayıran şeyin adı 'pozisyon'. Yani cisimler içinde nerelerde bulundukları. Bu pozisyon hadisesi yukarı, aşağı, uzak, yakın, dış, iç gibi tamamen sindirmesi kolay şeylerdir. Misal bir topun yüzeyini bir 'top kümesi' olarak tanımladım diyelim. Topu da kapsayan 3 boyutlu bir uzayda (boyut nerden çıktı daha) topun içi ve dışı dediğim vakit oralarda bulunan noktaları ifade etmiş olurum. Topun içi kümesi ile topun dışı kümesinin birbirinden ayıran şey bu iki kümenin elemanlarının topa göre pozisyonlarıdır.

(Noktalara pozisyondan başka, miktar yahut yön gibi başka özellikler de eklenebilir, alanlarda olduğu gibi. Ama olayı basit tutmak için sadece pozisyondan bahsetmek yeterli. Kompleks sayılarda da mesela iki tane miktar bulunur, bu da onun gibi.)

Şimdi sayılarda her şey güzel. İnsan denen şahane canlı öyle iki sayı tanımlamış ki, diğer tüm sayıların miktarını bu iki sayı cinsinden yazabilmiş. Bu iki sayı 0 (hiçlik) ve 1 (teklik). Diğer tüm sayıların miktarı bu iki sayı cinsinden tanımlı.

Bu tanımı dille ifade etmesi zor çünkü rekursif bi tanım. Dilim şöyle dönüyor:
0'ın miktarı hiçliktir.
1'in miktarı tekliktir.
Bir sayının miktarı ile 0 arasındaki ilişkinin, 1 ile 0 arasındaki ilişkiye oranı; yine o sayının miktarıdır.


Geometrideki pozisyonun da böyle bir tanımı vardır. Sayılar için hiçlik ve teklik kavramları yetmişti. Ama noktalar için iki şeye ihtiyacımız var. Bir adet referans noktası ve biraz vektör. Geri kalan tüm noktaların pozisyonlarını bunların cinsinden tanımlayabiliriz. Bu şeylerle tanımlanan tüm noktalara da geometrik 'uzay' adını verdim gitti (şimdilik).

Şimdi 'biraz vektör' deyince çok karışık oldu. Daha vektör nedir ondan bahsetmedik. Biraz derken kastım burada tam sayı adetinde olsun (fractal kasmayalım).

En basit durum 0 adet vektör olacaktır. Bu durumda elimde sadece bir adet referans noktası var. Bu noktanın edebi ismi 'merkez (orijin)'. Geri kalan tüm noktaları bu merkeze göre tanımlayacağım.

Şimdi yaslanıp düşünün, böyle tanımlanabilecek sadece bir nokta olabilir. Size sadece bir kavram veriyorum, geriye kalan tüm kavramlar bundan çıkar diyorum. Felsefi olarak bu, geride başka kavram yok demektir. Halbuki sayılarda mesela hiçlik ve teklik diye iki kavram verdim. Bu iki kavramın ilişkisinden bissürü sayı üretebiliriz. Ama tek bi merkez verirsem başka bi şey çıkmaz ki ortaya, çünkü bahsedilecek bi ilişki yok!

İşte bu özel durumla tanımlanan tüm noktaların (sadece merkezin yani) kümesine '0D uzayı' adını veriyoruz. 0 sayısı 0 adet vektör kullanmamızdan ötürü geliyor. Kağıt üzerinde bu uzayı şöyle gösterebiliriz:
Kod: [Seç]
   .
  merkez
Ne kadar şirin di mi? Tek elemanlı bi uzay. Sahip olabileceğimiz en küçük uzaylardan biri. Ama çok önemli bi uzay çünkü içinde merkez var.

Şimdi bu kadarı tabi ki yeterli değil. Devamını nası getiricez? Buraya kadar hep aritmetik sistemindeki kavramları kullanarak geometrik kavramları inşa ettik, aynısını yapmaya devam edelim.

Analitik

Şimdi yeni bir uzay tanımlayalım. Bu uzayda da yine özel tanımlı merkez olsun. Sayılarda nasıl 0 hiçliği temsil ediyorsa, merkez de uzayda ortada olmayı, merkezliği temsil edecek. Şimdi bi özel nokta daha tanımlayalım. Bunun adına 'birim pozisyon' adını verelim. Birim pozisyonun merkezin neresinde olduğundan henüz bahsetmiyoruz. Birim pozisyon, yeni uzayımızın her yerinde olabilir. Henüz uzaklık, yön gibi kavramları tanımlamadık o yüzden neresi gönlünüzden geçiyorsa 'birim pozisyon'u orası belirleyin.

Bu yeni uzayımızdaki merkez noktasına (0), birim pozisyona da (1) adını verelim. Parantez kullanmamızın sebebi sayılardan değil noktalardan bahsettiğimizi anlamak. Bundan başka tanımlayacağımız her sayı bu iki sayının tanımını kullanacak. (Yine aynı rekursif tanım)

Artık özel tanımlı iki noktamız var. Bu iki nokta arasındaki ilişkiden sonsuz tane daha nokta oluşturabiliriz! Ama o kadar noktaya tek tek isim mi vericez? Hayır bunun için 'analitik geometri' hadisesini kullanacağız. Bizden önce aritmetik denen güzide sistem kurulmuş, bundan faydalanarak noktaların pozisyonlarını sayıların miktarları ile adlandıracağız. Analitik geometri de basitçe söylersek, geometri ile aritmetik arasındaki bu ilişki. (Aslında analitik geometriye, cebirle geometri arasındaki ilişki demek daha doğru olur.)

Misal bi üçgen çizdik deftere. Bu Üçgen orda sadece geometrik bir cisimdir. Ama üçgenin köşelerine reel sayıları kullanarak isim verirsek geometrimiz biraz daha 'analitik'leşir.

Analitik olarak (3) dediğimizde mesela, (0) ve (1) noktalarına göre belirttiğimiz nokta, Aritmetikte 3'ün 0 ve 1'e göre bulunduğu nokta olacak. Aynı şekilde (2.5), (pi) noktalarını filan da tanımlayabiliriz. Eğer bu eşleştirmede sayılardan kullanacağımız en büyük küme reel sayılar kümesiyse bu uzaya '1D uzay' adını veriyoruz. (Kompleks sayıları karıştırma.)

Peki Ya Vektörler?

Şimdi bu uzaya 1D uzay demiştik. Dolayısıyla bu uzayın tanımında bir adet vektör kullanmamız gerek. Burda kullandığımız (0) ile (1) arasındaki ilişki [1] vektörü olsun. Bu ilişki de nedir? (1)'in (0)'a göre 'yön'ü ve (1)'in (0)'dan uzaklığıdır. Yani vektör dediğimiz şey iki kavram belirtmektedir yön ve uzaklık.

Bu sayede noktaların sahip olduğu pozisyon isimli özelliklerini, yön ve uzaklık olarak ikiye bölmüş oluruz. Yani bir noktanın (0)'a göre pozisyonuna aynı zamanda; (0)'a göre olan yönünde, (0)'a uzaklığı kadar ilerlersek de ulaşırız. Tabi burada yön ve uzaklık derken referans alacağımız şeyler (1)'in yönü ve uzaklığı yani [1] vektörüdür.

Şimdi, ne demiştik hatırlayalım. Noktaların pozisyonlarını tanımlamak için bir adet merkez noktasına ve bir kaç vektöre ihtiyacımız var. Burada 1D uzaydan bahsettiğimize göre bir adet vektörümüz olacak. O da [1] vektörü. ([1]'e aynı zamanda 'i' adı da verilir.)

Şimdi elimizdeki şeyler (0) ve i. Bu ikisi bana bir 1D uzay verir. Bu uzaydaki diğer tüm noktalar (0) ve i cinsinden tanımlanır. Misal (0)'dan i yönüne dönüp, i'nin boyunun 7 katı kadar ilerlesem (7) noktasına gelirim. Bu yüzden (7) noktası (0) dan i yönünde 7 adet i boyu kadar uzaktaki nokta olarak tanımlıdır. Yani :

(7) = (0) + 7i

Burada 7i bana bir başka (i den 7 kat daha uzun) bir vektör verecektir. O da [7] vektörüdür. Buradan yola çıkarak diyebiliriz ki:

(7) = (0) + [7]

Bu 1D uzayında (7) şöyle çizilebilir:
Kod: [Seç]
                            7i
            ----------------------------------->           [7]
<---------(0)--(1)---------------------------(7)------>   (1D uzayımız)
            ----->                                         [1]
              i
Şimdi uzay muzay dedik ama sayı doğrusu çizdik :). Ama uzayı tanımlarken bir tane vektör vardı dolayısıyla sadece tek yönde olabilir uzayımız, yani '1 boyutludur'.

Şimdi daha ileri gitmeden vektör ile nokta arasındaki ayrımı da vurgulayalım. Nokta bu tanımlı uzayda fiks bir koordinattır. Bu koordinat bir pozisyondur, yani yönü ve uzaklığı vardır. Ama vektör denen hadise sadece yön ve uzaklıktan oluşur. Yani [7] vektörünü alsak mesela (3) noktasına eklesek:

(3) + [7] = (10)

Sonuçta (7)'den farklı bir noktaya ulaşırız. Vektörlerin bir konumu yoktur onlar sadece bir yerleri gösterir sürekli.

Şöyle düşünün ileriyi gösteren bi Atatürk heykeli olsun. Bu heykeli alıp denize karşı koyun. Atatürk burada denizi mi gösteriyordur? Hayır, ileriyi gösteriyordur. Alın heykeli benim karşıma koyun. Atatürk beni mi gösteriyor? Hayır, yine ileriyi gösteriyor.

Yani vektörle ulaştığınız yer vektörü bağlamaz. O sadece yön ve uzaklıktır. Gösterdiği yer, nerden gösterdiğine bağlı olarak değişir. Daha rahat edecekseniz vektörler birer oktur da diyebiliriz.

"Şimdi vektörler uzayımızın neresinde? Eleman mı onlarda?" diyeceksiniz. Diyin, güzel soru olur.

Bu uzay kümelerini niçün oluşturmuştuk? Geometrik cisimleri tanımlayabilmek için. Peeeki, bu cisimler için vektörler bir anlam ifade eder mi? Hayır, cisimlerin tamamı noktalardan oluşur. Ama uzayı tanımlamak için vektörleri kullandık. Aslında nokta da kullanabilirdik ama vektörlerle diğer noktaları tanımlamak daha kolay. Burada hem vektör hem nokta olması işi karıştırıyor. O zaman uzaydan noktaları atıp her şeyi vektör yapalım. Noktalara da sıfırdan bakılan vektörler gözüyle bakalım. Yani (a) noktası (0) dan bakan [a] vektörü olsun. Böyle bir [a] vektörüne 'pozisyon vektörü' deriz. Pozisyon vektörü bir noktanın pozisyonunu belli eden hadisedir. Bu sayede 1D uzayını

Bu şekilde bir basis ile tanımlanıp, diğer vektörleri ve pozisyonları oluşturan uzay da 'vektör uzayı' oldu galiba. Bu uzayda [a] pozisyon vektörü bulunacaksa şu denklem kullanılabilir:

[a] = [a] = [a] = [a]

Ulan Bunların Hepsi Sayı Doğrusu, Yoksa Bizi mi Yiyorsun?

Şimdiiii... Artık yeterli alt yapımız varsa biraz daha ilginç meseleler konuşabiliriz. Benim elimde bir adet 1D Uzayı var,

Herhangi başka bir 1D uzayı daha oluştururken yine

Misal Erkan Ailesi olsun (Rufus değil!!). Bu ailenin bireyleri şunlar olsun.
Baba:  Ahmet Erkan
Anne:  Neriman Erkan
Oğlan: Tayfun Erkan

Bi de Günay ailesi olsun:
Baba:  Remzi Günay
Anne:  Yeliz Günay
Kız:   Esra Günay
Oğlan: Umut Günay

Yeliz Günay ile Ahmet Erkan kardeş olsun.

Şimdi ilişkiler şöyle olacak:
Ahmet, Tayfun'un babası.
Remzi, Esra'nın babası.
Ama Ahmet Esra'nın babası değil, dayısı olacak. Ya da uzunca, annesinin kardeşi.

Burada referansımız Esra ise Remzi baba, Ahmet dayı olacak. Halbuki referans Tayfun olsaydı, Ahmet baba olacaktı. Ama iki aileyi de anne, baba çocuklarla tanımladık. İki aile bireyi arasındaki ilişkiyi bilmek için birinin annesiyle birinin babası arasındaki ilişkiyi bilmem yetti.

Aynı şekilde iki uzay arasındaki ilişkiyi bilmek için de basisleri arasındaki ilişkiyi bilmem yeter. Örneğin referans basisim

Örneğin desem ki "Yeni uzaydaki merkezim

Şimdi bütün 1D uzaylar kendi bakış açılarından Aaaa! Dur Çok Karıştı!

Tamam biraz rahatlayın. Bir adet örnek çözelim, ne dersiniz?

Şimdi yine standart referans 1D uzayım var. İkinci bir uzayı [4] merkez ve [1] birim vektörü olarak tanımlıyorum. Bu uzayları karşılaştırmalı çizersek:
Kod: [Seç]
               Jale
<--(-2)--(-1)---(0)---(1)---(2)---(3)---(4)---(5)---(6)---(7)------>
Referans uzayım: [0],[1]

<--(-6)'-(-5)'-(-4)'-(-3)'-(-2)'-(-1)'--(0)'--(1)'--(2)'--(3)'----->
Yeni uzayım:     [4],[1]
                                        Celal
Yeni uzayımda merkez yani (0) noktası eski uzayımdaki (4) noktası olacak. İki uzayda da birim vektör [1] dolayısıyla yeni uzayın birim pozisyonu referans uzayında göre (4) + [1] = (5) noktası olacak. Ama bu nokta yeni uzayda (1)' adıyla anılmaya devam edecek. Örneğin yeni uzaydaki (-3)' noktası referansta (1) e denk gelecek.

Şöyle düşünün; referans uzayım koridor olsun (0) noktası da Jale'nin oda kapısı. Yeni bir uzay tanımlayıp merkezini yani (0)' noktasını Celal'in odası yaptım. Soruyorum, Celal'in odasının 3 birim gerisi, Jale'nin odasının neresindedir? (-3)' = (1) idi. Demek ki Jale'nin odasının bir birim sonrasındadır.

Yeni uzayımın basisi

(a)' = (a + o)

(-3)' = (-3 + 4)
(-3)' = (1)

Bir başka örnek daha çözelim. Yeni uzayımızın basisi
Kod: [Seç]
<--(-3)--(-2)--(-1)---(0)---(1)---(2)---(3)---(4)---(5)---(6)------>
Referans uzayım: [0],[1]

<--(-1)---------------(0)---------------(1)---------------(2)------>
Yeni uzayım:     [0],[3]
Eğer yeni uzayımın basisi

(a)' = (a * x)

eğer x negatif bir sayı ise uzayım referansın aksi yönüne bakacaktı. Örneğin

(-8)' = (-8 * -1)
(-8)' = (8)

olacaktır. Açık değilse çizip görün.

Peki hem merkez hem de yön vektörü gudikse ne olacak? Misal yeni uzayımın basisi [-3] merkez ve [1/2] yön vektörü ise:

Kod: [Seç]
<--(-3)--(-2)--(-1)---(0)---(1)---(2)---(3)----->
Referans uzayım: [0], [1]

<---(0)---(2)---(4)---(6)---(8)--(10)--(12)----->
Yeni uzayım:     [-3],[1/2]

Referansta -3 merkezinde konuçlanacak uzay, ama yeni uzayda bir birim referansta yarım birime denk gelecek.



(a)' = (a * x + o)

Ters Çevrimler

Şimdi bir referans uzayımız ve bir de referans uzayında basisi

(a) = ((a - o) / x)'

Yaptığımızın tersini yaptık yani. Örnek verirsek bi üstteki şekilde mesela referansataki (1) yeni uzayda nerde olacak?

o = -3
x = 1/2

(1) = ((1 + 3) * 2)'
(1) = (4 * 2)'
(1) = (8)'

Şekilden de görüldüğü gibi öyle.

Bi de referans basisimizin yeni uzaydaki hali ne olur onu hesaplayalım:
Bi kere [1] = [1/x]' haline gelir. Yani yeni uzayda bir birim referansta x birimse, referansta bir birim yeni uzayda 1/x birim olur.
Merkezi bulmak için üstteki formülü kullanıyoruz.
(0) = ((0 - o) / x)'
(0) = (-o / x)'


Yani referans basisimiz yeni uzayda [-o / x] merkez ve [1/x] yön vektörlerine denk geliyor.

Bi de fark etmediyseniz belirteyim. Normal vektör çevirirken basisler arasındaki yön vektörlerini kullanmak yeter (yani x ile çarpıp bölmek). Çünkü bu vektörlerin bir konumu yoktur, merkezden etkilenmezler. Halbuki pozisyon vektörleri çevrilirken pozisyonların çevrilmiş değerlerini alırlar. Onlar (0) noktasında konumlanıp pozisyon gösteren özel bir vektörlerdir. Örneğin Özet

İki uzayın basisleri:

[a]' = [a * x]
[a] = [a / x]'

Pozisyon çevrimleri:

(a)' = (a * x + o)
(a) = ((a - o) / x)'

Eksperimental

Peki ya x = 0 olsaydı? O zaman yeni uzayım 0D Uzayı olurdu ve tek bir noktası olurdu. O da referans uzayında (o) noktasına denk gelirdi. Referansta ise sadece (o) noktası bu yeni uzaya dahil olurdu. Bu uzaya ben 'sıkıştırma uzayı' diyorum. Niçün?

(a') = (a * x + o)
(a') = (a * 0 + o)
(a') = (0 + o)
(a') = (o)

olacaktı. Yani yeni uzayda hangi noktayı alırsam alıyım referansta tek bir nokta demekti. Bu da tüm uzayın sıkıştırılması oluyor. 2D ve 3D de daha anlaşılır olur burası sanırım.

Son Bir Kaç Söz

Birinci boyutun üzerine çıkamadık ama geometrinin temeli ve çevrimlerin önemli bir kısmı bunlardan ibaret. Buraya kadar Sensei'nin 1D Uzay yazının benzerini işledik. Sonraki kısımda 'Kartezyen Sistem'i göreceğiz. Gerçi buraya kadar ki uzaylar da kartezyendi ama ikinci boyuta geçince kartezyen olmayan uzaylar da olabilir. Neyse ki onlar bu tutorialın konusu değil.
Başlık: Temel Geometri
Gönderen: spaztica - 02.10.2005 02:55:45
ellerine sağlık; epey zahmet etmişsin yazıyı girmek için. güzel bir yazı, bir ara print edeyip tuvalet için başucu kaynağı haline getireyim; malum, türk'ün aklının nerede çalıştığı...

şaka bir yana bu yazıları inşallah yakında forum yazısı olarak değil de article olarak ekleme avantajımız olacak. elimdeki sitenin kodunu bitirir bitirmez kodu tamamen bize ait olan bir yapımız olacak ve tabii ki bu gibi yazılar, siteye eklenecek ilk yazılarımız olacak.

çaban takdire değer; eminim bundan faydalananların hayır duaları eksik olmayacak... :o)
Başlık: Temel Geometri
Gönderen: anesthetic - 02.10.2005 02:58:55
Teşekkürler. Bugünlük bu kadar :) Kalanına sonra devam edeceğim. Sonra nasip olursa OpenGL'e giriş filan ne gelirse o vakit elimizden.
Başlık: Temel Geometri
Gönderen: skate - 02.10.2005 03:02:52
Baştan sona okudum, çok güzel yazmışsın anes. Ellerine sağlık. Ben de bu konuda Sensei / Realtime'ın yazdığı bir article'ın linkini veriim hemen. Türkçe kaynakların artması süper birşey...

http://www.akaydin.com/misc_files/1d.zip (http://www.akaydin.com/misc_files/1d.zip)
Başlık: Temel Geometri
Gönderen: anesthetic - 04.10.2005 23:28:34
KARTEZYEN SİSTEM

Bu bölümde genel olarak 2D uzay hakkında konuşacağız. 1D uzaydaki çevrim formüllerini deneyerek bulmuştuk. Bu sefer bunu bir raya oturtacağız. Yani "Bir uzayın, referans başka bir uzaydaki basisini biliyorsak; o uzaydaki tüm vektörlerin karşılıklarını referans uzayda bilebiliriz, hemi de böyle." diyebilir hale geleceğiz. Bunun için de başlıktaki sistemi kullanacağız.

Nedir Bu Kartezyen?

Efendim bu kelimeyi ilk kez duyuyorsanız korkmayın. Eğer bir önceki bölümü okuduysanız hiç bi zorluk yaşamayacaksınız. Önceki bölümde gördüklerimize bi daha bakalım.

Şimdi demiştik ki geometrik cisimler, elemanları noktalar olan kümelerdi. Bu noktaları ve dolayısıyla cisimleri tanımlayabilmek için, yani noktaları pozisyonlarına göre sınıflandırabilmek için, uzayları oluşturduk. Dedik ki, bir uzaydaki tüm noktaları bir merkez noktası ve bir kaç vektör yardımı ile adlandırabiliriz. Sonra vektör ve nokta kavramları içiçe geçmesin diye, noktaları 'pozisyon vektörü' olarak tanımladık. Pozisyon vektörleri sürekli merkezden sabit bir noktayı gösteren vektörlerdi. Bunun aksine yön vektörleri ise uzayda sadece bir yön belirtmekte ve özellikle tek bir noktayı göstermemektelerdi.

Sonra 0D uzayı tanımladık. Bu, tek noktadan (merkez) oluşan dolayısıyla isimlendirme ihtiyacı duymayan bir uzaydı.

Ardından 1D uzaya geçtik. 1D uzayı tanımlamak için bir adet pozisyon vektörü (merkez) ve bir adet yön vektörü kullandık (birim vektör). Sonra dedik ki bütün 1D uzaylarda bu merkez vektörü

Yön vektörleri ise [8] = 8i gibi daha kısa bir tanıma sahipti.

Niye pozisyon vektörlerini
  • ile toplayarak tanımlıyoruz? Dedik ki pozisyon vektörleri merkezden bi noktayı gösteren vektörler. Uzaylar arası çevrim yaparken, bu 'merkez' hadisesini olaya katmadığım için yanlış sonuçlar elde edebilirim.[/i]

    Şimdiii... Geldik ikinci boyuta. Bu cümleyi okuyunca her yeni boyutta baştan yazı gerekecek sanmayın. Çünkü uzay tanımlamayı artık bir standart içine sokacağız ve n. boyuttaki uzayı gözümüzle canlandıramazsak bile kağıtta şak şak belirtebileceğiz.

    Neyse, şimdi 1D uzay hadisesinde tüm pozisyonlarımız bir çizgi (yani doğru) üzerinde bulunuyordu. 2D uzayda bunu biraz daha aşıp bir düzlem haline getireceğiz. Yani 2D uzayımızdaki noktaları öyle bir sistemle tanımlayacağız ki, tanımlayabildiğimiz tüm noktalar, sağa sola yukarı aşağı sonsuza kadar giden bir cismi, yani düzlemi meydana getirecek.

    Bu 2D uzayı oluştururken, yine bir standart basisimiz olacak. Bu basisin ilk vektörü yine merkez noktası olacak. Bundan başka iki farklı vektör daha gerekiyor bize. Çünkü tek vektörle sadece bir doğru üzerinde gidebileceğiz.

    Bu vektörlerden ilki yine bir yön vektörü olacak. Lakin sonuncu vektör yön vektörü olmayabilir. Şimdi, kafanızı biraz kurcalayıp toparlayım hemen: Bu son vektörü 'radyal vektör' yapıp 'Polar Koordinat Sistem'le bir uzay oluşturabilirsiniz. Yahut uydurduğunuz başka bir vektör türüyle, uyduruk başka bir sistem meydana getirebilirsiniz. Ama neyse ki tüm bunlar bu tutorialın dışında. Bizim yapacağımız son vektörü de yön vektörü olarak tanımlamak.

    Yani uzayımızın basisi için bir pozisyon (merkez), iki adet de yön vektörü (birim vektörler) kullanacağız. Bunun adına da 'Kartezyen Sistem' adını vericez. Ve uzayın adı '2D Kartezyen Uzayı' olacak. N boyutlu uzay için de, bir tane pozisyon ve N tane yön vektörü gerekecek. Ona da 'ND Kartezyen Uzayı' diyeceğiz. Bu kadar basit işte.

    Bu kartezyen sistem 0, 1, 2, 3, 4, 5, 6... boyutlu tüm uzaylar için kullanılabilen bir sistem (ki 0D ve 1D için zorunlu) ve mucidi 'René Descartes' isimli Fransız matematikçi, filozof. Şu "Düşünüyorum, öyleyse varım." diyen adam. Ama şu an aramızda yok ne yazık ki.

    Şimdi "Ne lan bu? Bi yön vektörü daha eklemiş adam, zibidiye bak!" diyebilirsiniz, lakin Öklit geometrisinin bu şekilde bir sistematiğinden ilk bahseden kişidir. Lafınızı geri almazsanız sizi tenkit ederim.

    Şimdi çok rahatça farkedebileceğiniz gibi, 2D'de sayıları tek sayı ile ifade edemiyoruz. Çünkü her pozisyon merkeze eklenecek ve diğer iki yön vektörü cinsinden tanımlanacak. Dolayısıyla her iki vektörün şahsiyetinden 'ne kadarını' taşıdığını belli edecek iki sayıya ihtiyacımız var.

    2D uzayın merkez pozisyon vektörüne her zaman [0, 0] adını vereceğiz. İlk yön vektörüne ise, [1, 0] yahut i diyeceğiz. İkinci yön vektörü ise [0, 1] ya da j ismiyle ortamlarda çağrılacak. Herhangi bir başka yön vektörü [a, b] ise şöyle tanımlanacak:

    [a, b] = a[1, 0] + b[0, 1]
    ya da
    [a, b] = ai + bj

    Pozisyon vektörleri ise:

    [a, b] = [0, 0] + a[1, 0] + b[0, 1]
    ya da
    [a, b] = [0, 0] + ai + bj

    şeklinde ifade edilecek. Bu pozisyon vektörlerini merkezle toplama hadisesi aklınızdan çıkarsa matrislerde zorluk çekersiniz, bunu da belirteyim.

    Şimdi 2D uzayımızın basisi neydi hatırlayalım:
    [0, 0] pozisyon vektörü
    [1, 0] yön vektörü
    [0, 1] yön vektörü

    Biz bunu '2D Kartezyen Uzayı' için tanımladık. Ama bu yazıda '2D Uzay' deyince bundan bahsediyor olacağım.

    Bir de, kartezyen olmayan uzaylarda vektör isimleri yine aynı olacaktır ama tipleri farklı olacaktır. Örneğin '2D Polar Uzayı'nda üçüncü vektör '[0, 1] radyal vektörü' olacaktı.

    Buraya kadar hiç zor olmadı sanırım. Ama şimdi beyin kıvrımlarınızı biraz daha bükmeniz gerekecek.

    2D Uzayda Çevrimler

    2D uzayda çevrimleri eskisi gibi örneklerle görelim.

    Şimdi bir adet referans 2D uzayım olacak bu sefer de. Tüm uzayların basisleri kendilerine göre zaten aynı olduğu için bütün bu basisleri referans uzayımda tanımlayacağım. Örneğin bir başka yeni uzay kendi bakış açısından [0, 0]' pozisyon, [1, 0]' ve [0, 1]' yön basisine sahip olsa bile, referans uzayımdan atıyorum [4, 5] pozisyon, [2, -3] yön ve [1, 0] yön vektörü olarak görülebilecek.

    En basit örneğimiz yeni uzayın [a, b] merkez ve [1, 0] ile [0, 1] birim vektörlerine sahip olması. Bu duruma şöyle bakın; referans uzayımın düzlemi üzerinde [a, b] pozisyonu merkezi olacak sankim başka bir benzer uzay varmış gibi. Burada çizemiyorum kusura bakmayın. Ama aklınızda canlandırması o kadar da zor değil sanırım.

    Atıyorum, mesela yeni uzayımızın merkez noktası referans uzayda [4, -2] olsun. Bu durumda yeni uzayda [8, 2]' diye bi nokta (pozisyon) verdim. Bu nokta aslında referans uzayda [4, -2] + [8, 2], yani [12, 0] noktası olacak. Bu kanıya nası vardım peki?

    Şimdi bu nokta kendi uzayında şöyle tanımlı değil miydi?

    [8, 2]' = [0, 0]' + 8[1, 0]' + 2[0, 1]'

    Peki aynı formülü referans uzayında kullanırsam:

    [x, y] = [4, -2] + 8[1, 0] + 2[0, 1]
    [x, y] = [12, 0]

    Ne kadar basit değil mi? Burada yaptığım şey ne? Bir uzaydaki pozisyon vektörünün başka bir uzayda nasıl ifade edildiğini bulmak. Bu pozisyon vektörü nasıl tanımlıydı peki? Merkezi, artı birim vektörlerin pozisyon değerleriyle çarpımının toplamı. Bu merkez ve birim vektörlerin referans uzayında tanımlı hallerini yazarsam sonucum da referans uzayında çıkacaktır.

    Yahni... Bir uzayın referansımdaki basisini biliyor olmam, o uzayın tüm pozisyonlarını rahatça referansıma çevirebilmem demek. [8, 2]' noktası referansta aslında, yeni merkezimden, 8 tane yeni i vektörü ve 2 tane yeni j vektörü kadar uzaktaydı. Bu kadar basit.

    Bir başka örnek çözelim:

    Bir yeni uzayın basisi referans uzayımda şu vektörlere denk geliyor.
    [2, -1] pozisyon (o)
    [2, -2] yön (i)
    [0,  3] yön (j)

    Sorarım: Yeni uzaydaki [5, 1]' pozisyon vektörü referansımda nereye denk geliyor?

    Cevap:

    [5, 1]' = [x, y]
    [x, y] = [2, -1] + 5[2, -2] + 1[0, 3]
    [x, y] = [2 + 5 * 2 + 1 * 0, -1 + 5 * -2 + 1 * 3]
    [x, y] = [12, -8]

    Peki yine sorarım bu yeni uzaydaki [2, 3] yön vektörü referansta nereye geliyor?

    Cevap:
    [2, 3]' = 2[2, -2] + 3[0, 3]
    [2, 3]' = [2 * 2 + 3 * 0, 2 * -2 + 3 * 3]
    [2, 3]' = [4, 5]

    Yön vektörü çevirirken hesaba merkezi katmadık. Neden? Çünkü yön vektörü sadece yönlerle ilgilenir. Merkezle alakası yoktur.

    Bi de şöyle bir hadise aklınızı karıştırmış olabilir. Yeni uzayımızın birim vektörleri, referansımızda birbirlerine dik olmayabilir. Bunun sebebi zaten burda diklik miklik filan bahsetmedik. Uzaydaki vektörleri nasıl tanımlıyoruz nasıl adlandırıyoruz, bir uzaydaki bir vektör, bir diğerinde nasıl çağrılıyor, bunları gördük. Bu sistemleri kullanarak kurduğumuz geometrik yapı, örneğin bilgisayar monitöründe, bunlar dik olup olmayabilir. Bunun dışında her zaman [1, 0]'ı [0, 1]'e dik kabul edeceğiz. Yani i'yi j'ye. Ama bu vektörler çevrilip başka bir uzayda bakılırsa sanki dik değillermiş gibi gözükebilir.

    Şöyle örnek vereyim: Referans uzayım tepsinin dibindeki düzlemi ifade etsin, yeni uzayım ise baklavanın dibi olsun. Ama yeni uzayın basisini baklava dilimlerini görecek şekilde belirtiyim. Yani [3, 2]' bana 3. satır ve 2. sütundaki baklavayı versin. Böyle bir sistem tepsiden bakıldığında tabi ki diksel (ortogonal) olmayacaktır, ama baklava açısından eksenler diktir. Gibi...


    Neyse çevrimler bu kadar basit. Asıl mesela ters çevrimlerde...

    Ters Çevrimler

    Şimdi yeni uzayımız üzerindeki tüm vektörlerin referans karşılıklarını bulabiliyoruz? Peki tersinden naber? Referanstaki bir vektörün yeni uzayımızda nasıl gösterildiğini nerden bileceğiz?

    Tek mantık referans uzayın basisini yeni uzayda bilmek. Yeni uzayı referansta tanıyoruz, aynısını çevirmemiz lazım. Bu hiç de kolay bi şey değil. Fark ettiyseniz 1D uzayda bile acayip bi sonuç çıktı. Tamam şu kadarı basit: birinde a kadar ileri gitsem diğeri a kadar geri gider. Birini b kadar döndürsem, diğer basis -b kadar döner. Ama ya bunları birlikte yaparsam? Ya birim vektörlerim kaymışsa (dik değilse) ve boyutları değişmişse?

    Bunu yapmanın en kolay yolu galiba matris kullanmak :) ama şimdilik ona bulaşmadan deneyelim. Onun dışında ters basisleri almak zor iş o yüzden direk çevrim denklemlerinin tersini almaya çalışalım. Yine de denklemler kafanızı karıştırırsa çok fazla üzerine gitmeyin. Hatta direk Buraya Atlayın diyen yere atlarsanız çok şey kaybetmezsiniz.

    Şimdi normal çevrim şöyle idi:
    [a, b]' = [c, d]
    [a, b]' = [ox, oy] + a[xx, xy] + b[yx, yy]
    [a, b]' = [ox + a * xx + b * yx, oy + a * xy + b * yy]

    Buradan da:

    c = ox + a * xx + b * yx
    d = oy + a * xy + b * yy

    Burada [a, b]' yeni uzayda [c, d] ise referans uzayındaki karşılığım. Amacım a ve b'yi, c ve d cinsinden bulmak. İkinci denklemi yx/yy ile çarparak a'yı buluyorum.

    c           = ox           + a * xx           + b * yx
    d * (yx/yy) = oy * (yx/yy) + a * xy * (yx/yy) + b * yy * (yx/yy)
    d * (yx/yy) = oy * (yx/yy) + a * xy * (yx/yy) + b * yx

    Son bulduğum denklemi ilkinden çıkarırsam:
    c - d * (yx/yy) = ox - oy * (yx/yy) + a * (xx - xy * (yx/yy))
    c - d * (yx/yy) - ox - oy * (yx/yy) = a * (xx - xy * (yx/yy))
    a = [c - d * (yx/yy) - ox - oy * (yx/yy)] / (xx - xy * (yx/yy))
    a = [(c - ox) - (yx/yy) * (d + oy)] / [xx - xy * (yx/yy)]

    Buradan simetri mantığı (aynı şeyi b için yaparsak) ile de şu çıkar:

    b = [(d - oy) - (xy/xx) * (c - ox)] / [yy - yx * (xy/xx)]


    Buraya Atlayın

    İşte böyle saçma salak bi şey çıkması lazım ters çevrimlerin. Ama her boyutta böyle saçma şeylerle uğraşmayacağız. Bu denklemlerin genel bir formu var. O da zor, ama en azından mantığını öğreneceğiz. Tabi ki matrislerde.

    Eksperimental

    Yeni uzayımın basisin referanstaki karşılığında iki yön vektörü birbirlerine paralel oldu diyelim. Bu durumda yeni uzayımdaki tüm noktalar, referans uzayımda bu vektörlerin oluşturduğu doğru üzerinde olacaktır. Türkçe konuşursam; yeni uzayımın basisi referansta şöyle çıktı mesela:

    [0, 0] pozisyon
    [1, 2] yön
    [2, 4] yön

    Bu son iki vektörün tüm kombinasyonları tek doğru üzerinde olacaktır. Dolayısıyla ben, yeni uzayın tamamını, referans uzayımda 'sıkışmış' olarak göreceğim. Bu vektörlerden herhangi biri [0, 0] ise de aynısı olacak. İkisi birden olursa bu durumda uzayım tek bir noktaya sıkışacak. Yani yeni uzayımda hangi noktayı alırsam alıyım, referansta merkeze karşılık gelecek.

    Örneğin yeni uzayımın basisi referansta şöyle olsun:
    [5, 5] pozisyon
    [0, 0] yön
    [0, 0] yön

    Herhangi bir [a, b]' noktasının referanstaki karşılığı:
    [a, b] = [5, 5] + a[0, 0] + b[0, 0]
    [a, b] = [5, 5] olacaktır.

    İşte bu da böyle bir 2D sıkıştırma uzayıdır.

    E Artık Geç Şu Üçüncü Boyuta

    Eğer buraya kadar olan yerleri tastamam anladıysanız, 3. boyuta geçmenin o kadar da zor olmayacağını fark edeceksiniz. (Gerçi ben anlatabildiğime pek ihtimal vermiyorum, ama scener dediğin zeki olur zaten.) Fiziksel uzaya geçtiğimiz vakit yesyeni kavramlarla karşılaşıcaz. Mantık yine aynı olsa da, bu mantıkla daha fazla gidemeyeceğimizi fark edicez. Bütün bunların hepsi bi sonraki bölüm olan 'Üçüncü Boyut ve Devamı'nda.
Başlık: Temel Geometri
Gönderen: anesthetic - 14.10.2005 23:00:07
ÜÇÜNCÜ BOYUT VE DEVAMI

Bu bölümde asıl ilgi alanımız olan üç boyutlu uzayı göreceğiz. Aslında 1 ya da 2 boyutlu uzaylardan teorik olarak bir farkı yok bu 3D uzayın, ama gözümüze görüntüler sanki 3 boyuttaymış gibi göründüğü için yaptığımız demolarda da bu boyutu kullanıyoruz. Sebep ise 3 boyutlu bir cismin monitör üzerinde izdüşümünün, gözümüzde oluşan görüntüsüyle aynı olması.

Şimdi çok kısa bir hatırlatma yapalım. 2D bir referans uzayında, başka yeni bir 2D uzayın basisi şöyle olsun:

[ox, ox] pozisyon vektörü (orijin),
[xx, xy] yön vektörü (i),
[yx, yy] yön vektörü (j).

Bu yeni uzayımızdaki bir pozisyon vektörünün ([px, py]'), yani bir konumun, referans uzayında şöyle ifade edildiğini söylemiştik:

[px, py]' = [ox, oy] + px[xx, xy] + py[yx, yy]

Bir yön vektörü ([vx, vy]') ise, referans uzayına geçtiğinde şu değerlere sahip olacaktı.

[vx, vy]' = vx[xx, xy] + vy[yx, yy]

Yani yön vektörleri uzaydan uzaya geçerken orijinlerin nerede olduğu ile ilgilenmiyordu. Sadece yön çevrimleri yapılıyordu. Bi de burada dikkatlı okuyucunun (eheh) fark edeceği üzere her vektörde vektörün cinsini belirttik. Halbuki pozisyon ve yön vektörlerini ayırmak için bi notasyon kullansak ne süper olacak. İleride onu da yapacağız, az sabredin.

Üçüncü Boyut

Eğer uzayımız 1D ya da 2D değil de 3D olsaydı durum yine değişmeycekti. Eğer tutorialı buraya kadar takip ettiyseniz ben söylemeden aşağıdakileri çıkarabilirsiniz.

Her 3D kartezyen uzayımızın basisi kendi içinde şöyle ifade edilecek:

[0, 0, 0] pozisyon vektörü (o),
[1, 0, 0] yön vektörü (i),
[0, 1, 0] yön vektörü (j),
[0, 0, 1] yön vektörü (k),

Aynı uzay içindeki tüm pozisyon vektörleri de önceki yöntemlerle ifade edilecek. Örneğin [5, -2, 8] pozisyon vektörü dediğimde bu şu anlama gelecek:

[5, -2, 8] = [0, 0, 0] + 5[1, 0, 0] - 2[0, 1, 0] + 8[0, 0, 1]
[5, -2, 8] = orijin + 5i - 2j + 8k

Bunun yanı sıra bir [5, 2, 0] yön vektörü mesela şu açılıma sahip:

[5, 2, 0] = 5[1, 0, 0] + 2[0, 1, 0] + 0[0, 0, 1]
[5, 2, 0] = 5i + 2j + 0k

"Neden pozisyon vektörlerinde orijini dahil ettik? Zaten sonuca etki etmiyor." demeyin artık. Çünkü daha önce de belirttiğim gibi, bu vektörü başka bi uzayda gösterirken orijin, o uzaydaki koordinatlara göre olacak. O zaman da sonuca etki edecek. Yani orijinin üzerine vektör ekleme, tüm pozisyon vektörlerinin tanımında var. Bu hadise de sadece matematiksel bütünlük sağlamak için değil. İleride o orijin ekleme olayı belki de hayatımızı kurtaracak.

Ha bu arada; ikinci boyutta kullandığımız x ve y eksenlerine, artık z'yi de ekledik. Söylemeyi unuttum ama o kadar önemli değil.

Üçüncü Boyutta Çevirimler

Her zamanki gibi yine bir referans uzayım var ve tüm sonuçlarımı bu uzayın vektörleri cinsinden vereceğim. Bir de hep 'yeni' dediğim (niyeyse) başka bir uzay var. Bu yeni uzayın basisinin referans uzayımdaki karşılığını biliyorum. Amacım, yeni uzayımda koordinatları verilmiş bir pozisyon yahut yön vektörünü referans uzayımın koordinatlarına çevirmek.

Pozisyon vektörü çevirimi için:
[px, py, pz]' = [ox, oy, oz] + px[xx, xy, xz] + py[yx, yy, yz] + pz[zx, zy, zz]

Yön vektörü çevrimi için:
[vx, vy, vz]' = vx[xx, xy, xz] + vy[yx, yy, yz] + vz[zx, zy, zz]

Örneğin yeni uzayımın basisinin referans uzayımdaki hali şöyle olsun:

[4, 2, 0] orijin
[3, 1, 0] i
[0, 3, 2] j
[1, 1, 6] k

Yeni uzayımda bir adet [3, 2, 2]' pozisyon vektörü olsun. Bunun referanstaki karşılığı şöyle olacaktır:

[3, 2, 2]' = [4, 2, 0] + 3[3, 1, 0] + 2[0, 3, 2] + 2[1, 1, 6]
[3, 2, 2]' = [4, 2, 0] + [9, 3, 0] + [0, 6, 4] + [2, 2, 12]
[3, 2, 2]' = [4 + 9 + 0 + 2, 2 + 3 + 6 + 2, 0 + 0 + 4 + 12]
[3, 2, 2]' = [15, 13, 16]

Yeni uzayımda bir adet [1.5, 1, 0.5]' yön vektörünün karşılığı ise şöyledir:

[1.5, 1, 0.5]' = 1.5[3, 1, 0] + 1[0, 3, 2] + 0.5[1, 1, 6]
[1.5, 1, 0.5]' = [4.5, 1.5, 0] + [0, 3, 2] + [0.5, 0.5, 3]
[1.5, 1, 0.5]' = [4.5 + 0 + 0.5, 1.5 + 3 + 0.5, 0 + 2 + 3]
[1.5, 1, 0.5]' = [5, 5, 5]

Hiç bi yeni olayımız yok. Aynı yöntemleri kullanarak yaptık hepsini.

Ters Çevrimler

Ters çevirimde amacımız referans uzayındaki bir vektörün, basisi referans uzayında belli bir uzayda nasıl gösterildiğini bulmak. Ama hatırlarsanız geçen bölümde iki boyutta bile bunu yapmak için ne taklalar atmıştık; ki yine de referans uzayının, yeni uzaydaki basisini bulamadık. O yüzden bu kısmı şimdilik atlıyorum. Lakin unutmayın ki kendileri gayet de önemli bir konu, çünkü kamera yaparken bunları kullanacağız.

3D Uzayda Birtakım Başka Olaylar

3D uzayımızın diğer 1D ve 2D uzayda bulunmayan bir özelliği mevcut. Ona geçmeden önce biraz vektörlerle uğraşalım.

Bir vektörle bir sayıyı çarpmayı, yani vektörün bir katını bulmayı anlatmadım ama her yerde kullandım. Zaten çok acayip bi şey değil. Bir vektörün a katı şöyle olacak:

a[x, y, z] = [ax, ay, az]

Aynı zamanda iki vektörün toplamı (ya da farkı) da bu yazılarda anlatılmadı. O da şöyle olacaktı.

[x1, y1, z1] + [x2, y2, z2] = [x1 + x2, y1 + y2, z1 + z2]

Bu iki işlemi çevrimlerde sürekli kullandık ama tanımlarını yapmamıştık. Zaten çok da önemli değil, direk nasıl yapılacakları belli.

Ama vektörlerle nasıl yapılacağı direk belli olmayan bir işlem var, o da çarpma. Şimdi ilk akla gelen çarpma yöntemi şöyle:

[x1, y1, z1] * [x2, y2, z2] = [x1 * x2, y1 * y2, z1 * z2]

Gayet güzel bir teknik lakin bu işlemde sonuçta elde ettiğimiz vektör bize genelde hiç bi şey sağlamıyor. Onun yerine sonucu pratikte işe yarayan iki çarpım tekniği var. Bunları sırayla görelim.

Skalar Çarpım

'Skalar çarpım' şöyle gösteriliyor:

[x1, y1, z1] . [x2, y2, z2] = x1 * x2 + y1 * y2 + z1 * z2

Yani karşılıklı elemanları çarpıp, bu çarpımların toplamını alıyoruz. Bu işleme, nokta ile gösterildiği için aynı zamanda 'dot product' da der gavurlar. Skalar çarpımda iki vektörü çarparak vektör olmayan (skalar) bir değer buluyoruz.

Şimdi bu çarpımın bize sağladıklarını öğrenelim.

Eğer bir vektörü kendisi ile skalar çarparsak şöyle olur:

[x, y, z] . [x, y, z] = x² + y² + z²

Bir vektörün uzunluğu ise 'Pisagor Teoremi' ile şöyle tanımlıdır:

[x, y, z] vektörünün uzunluğu r ise,
r = karekök (x² + y² + z²)

Demek ki;

r² = [x, y, z] . [x, y, z]

Yani bir vektörün kendisi ile skalar çarpımı, uzunluğunun karesini verir.

Skalar çarpım sadece 3D için değil tüm kartezyen uzaylar için tanımlı. Örneğin çeşitli uzaylarda şöyle:

1D uzay:
[x1] . [x2] = x1 * x2


2D uzay:
[x1, y1] . [x2, y2] = x1 * x2 + y1 * y2
[x, y] . [x, y] = r² = x² + y²

5D uzay:
[ax1, ax2, ax3, ax4, ax5] . [bx1, bx2, bx3, bx4, bx5]
   = ax1 * bx1 + ax2 * bx2 + ax3 * bx3 + ax4 * bx4 + ax5 * bx5

[x1, x2, x3, x4, x5] . [x1, x2, x3, x4, x5]
   = r² = x1² + x2² + x3² + x4² + x5²

Skalar çarpımın bir güzel özelliği de şöyle:
[x1, y1] vektörünün uzunluğu r1 yani karekök (x1² + y1²) olsun.
[x2, y2] vektörünün uzunluğu ise r2 olsun. Bu durumda şu olur:

[x1, y1] . [x2, y2] = x1 * x2 + y2 * y2 = r1 * r2 * cos(theta)

Theta diye seslendiğimiz şey bu iki vektörün yönleri arasındaki açıdır. Yani a ve b adlı iki vektörün arasındaki açıyı istiyorsak şu denklemi kullanırız.

theta = acos(a.b / (ra * rb))
ra = karekök(a.a) ve rb = karekök(b.B) olduğu içün:
theta = acos(a.B) / karekök(a.a * b.B)

Bu açıyı her boyutta bulabiliriz, hatta kolaylık açısından 1D uzayda bakalım.

[x1] . [x2] = x1 * x2 = r1 * r2 * cos(theta)
r1 = x1 ve r2 = x2 olduğu için
x1 * x2 = x1 * x2 * cos(theta)
cos(theta) = 1

Yani 1D uzaydaki herhangi iki vektör arasındaki açı ya 0 ya da 180 derece olacak.

Skalar çarpımla başka neler yapabiliriz? Bunlar bilinmesi gerekli şeyler değil isteyen atlayabilir.

Eğer bir vektörü kendi uzunluğuna bölersek, 1 uzunluğunda ve aynı yöne bakan bir vektör elde ederiz:

a / ra = a / karekök(a.a)

Bir vektörün başka bir vektör üzerindeki izdüşümünün uzunluğu ise kendi uzunluğu * cos(theta)'dır. Yani a vektörünü b vektörü üzerine yansıtırsak ortaya çıkan vektörün uzunluğu şudur:

ra * cos(theta) = karekök(a.a) * cos(theta)
ra * cos(theta) = (ra * rb * cos(theta)) / rb
ra * cos(theta) = (a.B) / rb

Şimdi, bu izdüşüm vektörü b ile aynı yönde olacak (kağıda çizip görün). Yani b yönündeki birim vektörü izdüşüm vektörünün uzunluğuyla çarparsak, izdüşüm vektörünü buluruz.

b yönündeki birim vektör b / rb idi.

izd-ab = (b / rb) * (a.b / rb)
izd-ab = (b * a.B) / rb²
izd-ab = (b * a.B) / b.b

Aynı mantıkla b vektörünün a üzerindeki izdüşümü şöyle olur:

izd-ba = (a * a.B) / a.a

Buradaki bölüm işleminin üst kısmı bir vektör çarpı bir skalar, yani bir vektör. Bir skalara bölersem bunu, sonuç yine vektördür. Bu izdüşüm vektörünü kartezyen kamera olayında kullanacağız. Ama orada da optional olacak. Aynı zamanda bu izdüşüm hadisesi çok rahatça anlaşılabilecek üzere gölgelendirmede kullanılıyor. Ama o konuya bu tutorialda yer veremeyeceğim. (Ben de bilmiyom lan daha!)


Skalar çarpım hazmedildiyse bir sonrakine geçelim...

Vektör Çarpım

Şimdi skalar çarpımı bi şekilde işimize yaradığı için özel bi şekilde tanımladık. Şimdi iki vektör arasında öyle bi çarpma işlemi tanımlayalım ki, sonuç hem vektör olsun hem de işimize yarasın.

3 boyutta bildiğimiz gibi 3 farklı yöne gidebiliriz. Ve tüm yönlere gidebilmek için en az 3 vektöre ihtiyaç var. O zaman vektör çarpımımız iki vektörü çarptığı zaman, sonuç bu iki vektöre de dik olsun. Bu sayede iki vektörün gidemediği yerlere gidebilecek bir vektör elde edelim. Yani vektör çarpım sonucundaki yönü belirledik.

Bu vektörün bir de uzunluğu olacak. Skalar çarpımda vektör uzunluğu bana iki vektör arasındaki açının kosinüsünü veriyordu. Vektör çarpım sonucu da, bana aynı açının sinüsünü versin de bi işe yarasın.

|a × b| = ra * rb * sin(theta)

Yani diyor ki, a ve b nin vektör çarpımının uzunluğu, bu vektörlerin uzunlukları ile, aralarındaki açının sinüsünün çarpımıdır. Vektör çarpımını '×' ile gösteriyoruz ve bazen 'cross product' diyoruz.

Şimdi yönü hakkında konuşalım. İki vektöre de dik olan yönü verecek. Eğer böyle bir yön tekse 3D uzaydayız (yani 3 tane dik yön vardır) demektir. Bu yüzden vektör çarpım sadece ve sadece 3D uzayda tanımlıdır. Bu da 3D uzayın yazının başında bahsettiğim özelliği idi.

Sonucun yönünü nasıl bulacağız. Şimdi sağ elinizi tabanca pozisyonuna getirin. Baş parmak havada, işaret parmağı ve orta parmak ileriyi gösteriyor. Şimdi orta parmağınızı sola doğru (avuç içine) hareket ettirin. Baş parmağınız hala bu iki parmağa dik kalacaktır. 'İşaret parmağı × orta parmak = baş parmak' olur. Buna 'sağ el kuralı' adını vermişler. Eğer ilk vektörünüz işaret, ikincisi orta parmak yönündeyse, vektör çarpımınız baş parmak yönünde olacaktır. Eğer ters yönde yaparsanız işlemi, ters yönde bir vektör çıkar. Yani:
a × b = -(b × a)

Ne işe yarayacak bu derseniz, mesela işaret ve orta parmağınız, bir yüzeyin bir noktasındaki teğet yüzeyi temsil ediyor olsun, ya da basitçe işaret ve orta parmağınızla bir üçgen oluşturdunuz. Burada baş parmağınız bu üçgene dik olacaktır. Eğer başparmağınızı kendi uzunluğuna bölerseniz, sonuç bu yüzeyin ya da üçgenin normalidir. Bu normal denen birim vektör o yüzeyin o kısmının ne kadar aydınlatılması gerektiği hakkında şahane bilgiler verir.

Vektör çarpım hakkında yeterli teorik bilgimiz olduğuna göre tanımına gelelim. İki vektörün vektör çarpımı şöyle gösterilir:

[x1, y1, z1] × [x2, y2, z2]
   = [y1 * z2 - z1 * y2, z1 * x2 - x1 * z2, x1 * y2 - y1 * x2]

Eğer bu formülü ilk kez görüyorsanız muhtemelen hakkında iyi şeyler düşünmeyeceksiniz. Formülün nasıl çıkarıldığı gibi abuk bi konuya da girmiyorum. Ezberlemenize gerek yok, gerektikçe burdan geçirebilirsiniz. Ama ezberlemek isterseniz de kolay bi yol mevcut (ki ben onu kullanıyorum). Eğer biliyosanız Buraya Atlayın diyen yere atlayın.

Çarpım şöyle olsun:

a × b = c

Kural 1: c'nin x değeri, a ve b'nin y ve z değerlerine bağlı.
Kural 2: c'nin y değeri, a ve b'nin z ve x değerlerine bağlı.
Kural 3: c'nin z değeri, a ve b'nin x ve y değerlerine bağlı.

Bu üç kuralın, c'nin a ve b'ye dik olmasını sağladığını söyleyebiliriz. c nin her elemanı, a ve b'de diğer elemanlara bağlı olacak.

Kural 4:
...ax, ay, az, ax...
...bx, by, bz, bx...

Yani diyor ki (demiyor bendiyorum) çarpımlar tabloda çapraz yapılacak. Yani:
a x b =
   [
     ay * bz - az * by,    // yz ve zy çapraz
     az * bx - ax * bz,    // zx ve xz çapraz
     ax * by - ay * bx     // xy ve yx çapraz
   ]

Kural 5: Çarpımlar arasında eksiler olacak.
Kural 6: Çapraz çarpımlarda, bir önce gelen eleman başlıcak.
Mesela ilkinde y, z'den önce o başladı. İkincide z, x'ten önce (kural 4'e bak) ve üçüncüde de x, y den önce.

Kural 7: a[hede] * b[hodo] - a[hodo] * b[hede] şeklinde bi çaprazlama olacak.

Ehehe fazla kural oldu, ama cidden çok kolay. Şunları hatırlayın:
x elemanı için yazıcam. Bi sonraki y, Demek ki ay * bz - az * by
y elemanı için yazıcam. Bi sonraki z, Demek ki az * bx - ax * bz
z elemanı için yazıcam. Bi sonraki x, Demek ki ax * by - ay * bx


Buraya Atlayın

Vektör çarpım bilmek çevrimlerinizi değiştirmeyecek ama olaya hakimiyetinizi artıracak. Işıklandırma yapacaksanız da zaten kullanmak zorundasınız. OpenGL filan normal bulma özelliği sunuyor, ama performans için kendi normallerinizi kendiniz bulmak isteyeceksiniz (her framede baştan hesaplamamak için mesela).

3D hakkında söylenecek başka bi şey yok. Vektör çarpım hariç tüm kartezyen uzayların özelliklerini taşıyor. Öyleyse artık devamına geçebiliriz...

Daha Fazlası

İnat edip buraya kadar okuduysanız 4, 5 ve daha fazla boyutlar sizin gözünüzü korkutuyor olmamalı. Tüm çevrim formülleri aynı. Hatta matrislere geçince ters çevrimlerin de aynı olduğunu göreceğiz. 3 boyutu monitöre aktarırken perspektif kullanmıyorsak, x ve y değerlerini aynen alıyoruz ve z değerini atıyoruz. 4 ya da 5 boyutlu olsa cisim, yine aynısını yapacağız. Ama sonuçta ortaya çıkan şey çok rahat idrak edilir olmayacak. Aynı zamanda 3D haricinde istediğimiz kadar perspektif tanımlarız ama gözümüzdekinden olmadığı için yine monitörde o ilüzyonu alamayacağız.

Yazının geri kalanı matrislerle ilgili olacak. Onlarda da 3D'den öteye gitmeyeceğiz, ama bilin ki aynı olaylar bi çok alanda çok boyutlarda yapılabiliyor. Bunların geometrik anlamları bile var. Misal vektör alanları yahut tensorler gibi ucubik isimli konular söz konusu olunca çevrimlerin 6 boyutlu matrislerle filan yapılması gerekebiliyor.

O zaman, "Pozisyon, uzay, vektör gibi geometrik kavramları yaladım yuttum, teorik altyapım da az çok oturdu." diyen herkesi bir sonraki yazı olan 'Neden Matrisler?'e davet edelim.
Başlık: Temel Geometri
Gönderen: skate - 15.10.2005 04:55:30
anes, genel olarak bildiğim konular olduğu için yalnızca göz attım ancak her zaman elimin altında bulundurmak üzere de tutorial arşivime ekledim elbetteki, ellerine sağlık. bir hayli uğraşmışsın belli ki. teşekkürler ve tebrikler...
Başlık: Temel Geometri
Gönderen: nightlord - 15.10.2005 12:12:38
selam anesthetic

sonunda bugun butun tutoriallerini derinlemesine okuma sansim oldu. ellerine saglik.

genelde alisilanin aksine kumeler, uzay geometri, analitik geometri ve yer yer felsefe hatti uzerinden konulari anlatmissin. benim icin okumasi cok lezzetli olmakla beraber pedagojik acidan konuyu bilmeyenlere bazi zorluklar dogurabileceginden endiseleniyorum. 0D uzay 1D uzay gibi kavramlar ve uzaylar arasi cevrimler ozellikle text ortaminda bu konulari bilmeyenlere cok zor gelebilir. buna karsin hayli fazla numerik ornek verip cozuyorsun bu da anlasilmayi kolaylastiracaktir. Benim nacizane onerim bu tutorialde daha fazla cizim kullanman yonunde. kimi insanlarin gorsel algilari sozel algilarindan guclu oluyor. bu yuzden cevrim islemleri izdusumler gibi konulari sekil uzerinden cok daha rahat anlayabilirler.

ikinci bir yorumum da cross product formulunu hatirlama kural silsilesi ile ilgili. hatirlamak icin gercekten bu kurallar dizisin kullanman cok ilginc ve lezzetli geldi bana. ben determinant almaya benzeyen

i j k
a b c
d e f

olayini tercih ederim sahsen ama belki de matrisleri ve determinanti henuz anlatmadigin icin bunu anlatmadin. o konulara gelince buna da tekrar deginmeni oneririm.

yazinin genelinde benim bilgim dahilinde goze batan bi yanlislik goremedim. sadece ilk bolumdeki aritmetik geometri vs programsa matematik programlama dilidir benzetmesi hayli tartismaya acik bi tespit :)

cok detayli bi calisma gercekten tebrik ederim. bundan sonra cikan bolumleri de ilgiyle takip edecegim. ve elimden geldigince proofread etmeye devam.

ve diger arkadaslar gordugunuz gibi tutorialler yazarlara gore cok farkli yaklasimlardan yazilabiliyor. okuyucular icin bu farkli perspektifler ne kadar cesitlenir ve cogalirsa bir tutorialden anlamadiklarini digerinden anlama sansi artiyor. bu yuzden yazabilecek biseyleri olan herkesi tutorial yazmaya davet ediyorum

sevgiler saygilar
Başlık: Temel Geometri
Gönderen: skate - 15.10.2005 12:55:57
Nightlord: Walla biliyorsundur Sensei'nin de 1d uzay diye tutorialı var. Tahmin ediyorum "temelden girelim" diye bu şekilde yazıyorlar. Bence vektörleri anlatmak için güzel de bir yol. Ancak daha fazla şekil olması gerektiğine katılıyorum.
Başlık: Temel Geometri
Gönderen: anesthetic - 15.10.2005 14:39:05
başta ben de düşündüm doc ya da htm şeklinde şekillerle mi hazırlayayım diye. sonra ilk önce resimler yokmuş gibi bitirip, resim kullanılmayan mediumlarda işe yaramasını sağlamak istedim. Sonra destekleyici olarak aralara figürler ve grafikler eklemeyi planladım. En son aşamada bu hale getiririm ve octalfoam'da daha da iyi gözükür.

anlatım tarzına gelince de işte dediğim gibi şekillerden soyutlamak için yazıyı elimden geldiğince cebirleştirdim. bu sayede matris kullanımı çok daha rahat anlaşılacaktır diye düşünüyorum. biliyorum birçok kişi anlatım tarzı yüzünden yazıları takip edemeyecek. bir de görsel anlatıma yer veren bi tutorial olsa aynı konuyla ne kadar güzel olur, birini takip edemeyen diğerine geçer.

yazıları kontrol ettiğiniz için de ayrıca teşekkür ediyorum. 2-3 kere okuyup post ediyorum ama ondan sonra bile aradan kaçanlar olabiliyor.
Başlık: Temel Geometri
Gönderen: Decipher - 28.10.2005 17:14:38
cidden süper bir tutor merak ettiğim bir çok şeyi buldum içinde süperdi cidden aynı zamanda print alıp tutor duvarıma yapıştırdım :D
Başlık: Temel Geometri
Gönderen: anesthetic - 28.10.2005 21:04:14
teşekkürler.

matrix chapterları çok yakında "3 chapter birden" formatında geliyor!! (şu ödevler bi bitse)
Başlık: Temel Geometri
Gönderen: eirik - 29.10.2005 10:33:16
hacIm o degil de bir matrisin ozdegerleri ve ozvektorunu degi$tirerek resmin $eklini degi$tirebiliyormu$sun elementer satir yada sutun i$lemleri araciligiyle, ozdeger ozvektor (eigenvalue, eigenvector) olaylarInI deginmedin sen sanIrIm da akLInda bulunsun dedim. $ekil degi$tirmeden kastim ornegin resmi dikdortgenden paralel kenar yapmak gibi. $u psp de vektorel bi katman ekledikten sonra merkezin yanIndaki noktayi cekerek yapmak gibi $eyler.
Başlık: Temel Geometri
Gönderen: vigo - 29.10.2005 12:59:39
temel geometri'den başka acaba "idris geometri" yada "fadime geometri" diye bişi var mı? (kızmaca yok dayanamadım yaa...) :lol:
Başlık: Temel Geometri
Gönderen: anesthetic - 29.10.2005 15:56:59
erik: matristeki vektörler birbirine dik değilse dediğin gibi matris kullanıldığında vektörleri eğecek. örneğin 1,0,0  0,1,0  0,0,1 uzayını düşün, burdaki 0'lardan birini başka bi değer yapsam bu üç vektör birbirine dik olmayacak. sonuçta bu uzayda bir küp belirttiğimde, referans uzayında paralel kenar prizması gözükecek.

ama o kısımlara daha hiç bulaşmadım, matrislerle temel çevrimlere gelince (translate, rotate...) ancak diklik filan onlardan bahsedicem. daha acayip çevrimler kısmında matrisin determinantını bozup bahsettiğin olayları yapmayı anlatıcam. yukarda anlattığım çevrimler ise (tersleri hariç) olabilecek tüm uzaylar için geçerli.

vigo: olmaz mı, onlar bi aile zaten. ailenin kökü taaa öklit geometriye kadar gidiyor.  :P matrixte bir bozulma gözlendiği için trabzona yerleşmişler zamanında.
Başlık: Temel Geometri
Gönderen: vigo - 29.10.2005 21:44:32
hahahahaha :)
Başlık: Temel Geometri
Gönderen: anesthetic - 25.01.2006 01:35:33
NEDEN MATRİSLER?

Uzun bir aradan sonra tutoriala kaldığımız yerden devam ediyoruz. Bu noktadan önce genel olarak uzay, vektör, pozisyon, yön kavramlarını inceledik. Sonra bir uzaydaki bir vektörün diğer bir uzayda nasıl gösterildiğini hesaplamayı öğrendik. Ardından 3d uzayda işimize yarayacak bir kaç vektör işlemi gördük.

Aslında tutorialın başlığı olan 'Temel Geometri' denen hadisenin tamamını gördük. Yukardaki formülleri ezberleyerek yahut çıkarım yollarını hatırlayarak bir 3D motorunun uzay ve vektörlerle olan kısmını yazabilirsiniz. Ama bu bölümden sonra göreceğimiz şeyleri kullanmadan işin içinden biraz zor çıkılır.

İşin temelinde uzaylar arası vektör çevrim formülleri yer alıyor. Formüllere bir göz atarak neden bu işin sizi zorlayacağını anlayalım.

A uzayında v yön vektörü [x,y,z] şeklinde tanımlı olsun. A uzayının kendisi ise kendi içinde şu vektörlerle tanımlı:

[0,0,0] pozisyon vektörü: merkez
[1,0,0] yön vektörü: x vektörü (i)
[0,1,0] yön vektörü: y vektörü (j)
[0,0,1] yön vektörü: z vektörü (k)

Bütün uzaylar kendi içlerinde böyle tanımlıydı zaten. Mesela bu A uzayı B uzayında şu durumda bulunsun (A uzayında tanımlı vektörleri [a,b,c], B uzayında tanımlı vektörleri [d,e,f]' şeklinde göstereceğiz) :

[px,py,pz]' pozisyon vektörü: merkez
[xx,xy,xz]' yön vektörü: x vektörü (i')
[yx,yy,yz]' yön vektörü: y vektörü (j')
[zx,zy,zz]' yön vektörü: z vektörü (k')

Böyle bir durumda v vektörünün B uzayındaki tanımı olan v' vektörü şu formüllerle çıkıyordu:

v' = x[xx,xy,xz] + y[yx,yy,yz] + z[zx,zy,zz]

Eğer v' bir pozisyon vektörü olsaydı bu toplama [px,py,pz] vektörünü de ekleyecektik, bir başka deyişle A'nın merkezi kadar ilerleyecektik. Eğer v' vektörünün tamamını değil de bir elemanını (x, y ya da z) istersek, formül her bir eleman için şöyle olacaktı:

v' . i = x * xx + y * yx + z * zx (+ px)
v' . j = x * xy + y * yy + z * zy (+ py)
v' . k = x * xz + y * yz + z * zz (+ pz)

Not: v' . i, v' vektörünün ilk elemanı anlamına gelir. ([x, y, z] . [1, 0, 0] = x) Diğerleri de benzer ifadelerdir.

Bunlar A uzayının B uzayındaki tanımını biliyorsak kullanabileceğimiz formüllerdi. Eğer tersi bir durum söz konusu ise, yani sadece B uzayını A uzayında biliyorsak ve A uzayında tanımlı bir vektörü B uzayına taşıyacaksak, ters çevrim formülleri gerekli idi. 1D ve 2D'de bu formüllerin ne kadar karışık olduğunu gördük; 3D de ise çıkarmaya bile çalışmadık. Halbuki bu ters çevirim formülleri bize kamera yapımında gerekli olacak. Bu yüzden ters çevrim formüllerini de çevrim formülleri gibi bir sistematiğe bağlamamız gerekiyor.

Bu önümüzdeki zorluklardan sadece biri. Bir başka zorluk ise art arda yapılan çevirimler. Mesela A uzayının B uzayındaki tanımını ve B uzayının C uzayındaki tanımını biliyor olalım. A uzayında bildiğimiz bir vektörün C uzayındaki tanımını istiyorsak, önce o vektörü B uzayına geçirip yeni bir vektör elde edeceğiz. Sonra da bu yeni vektörü C uzayına geçirip aradığımız vektörü elde edeceğiz. Bu kadar basit. Ama asıl zorluk art arda 10, 100 belki 1000 tane uzay olduğunda kendini gösterecek.

Bunun çözümünü olaya pratik açıdan bakarak bulabiliriz. Ekrana sürekli çevrimlerden geçen bir 3D cismi çizdiğimizde, o cismin tüm vektörleri aynı çevirime maruz kalacak. Mesela, hepsini A uzayından C uzayına geçirmemiz gerekecek. Eğer arada B uzayına çevirmek yerine, A uzayının C uzayındaki tanımını bulursak bütün vektörleri tek bir çevrime sokma şansımız olur. Yani:

A -> B -> C (yanlış)
A -> C (doğru)

Bu sayede işlemlerimiz iki kat hızlanacak. Peki A uzayının C uzayındaki tanımını nasıl bulacağız? Çok basit. A uzayının B uzayındaki tanımındaki tüm vektörlere (3 yön, 1 pozisyon) B -> C çevrimi uygularsak elde ettiğimiz vektörler A -> C çevrimi için kullanılabilir hale gelecek.

Karıştıysa baştan alayım: A uzayının B uzayında tanımı, B uzayında 4 tane vektör (A'nın B uzayındaki basisi) demek. Bu vektörleri C uzayına geçirirsem A uzayının C uzayında tanımını elde ederim.

Peki bunun neresi zorluk diye sorarsanız, o kadar çevirim formülünü tek tek işlemek, formül içine formül sokmak, bu formüllerde vektörler yön vektörü müydü, pozisyon vektörü müydü diye kontrol etmek bir yerden sonra işleri arap saçına çevirecektir.

Peki bu işlemleri kolaylaştırmanın bir yolu var mı?

Tabi ki.

Bizim uğraştığımız denklemlerin, yani çevrim formüllerinin güzel bir özelliği var, o da lineer olmaları. Yani formüllerin hiç birinde vektörlerin ya da elemanların karesini küpünü filan kullanmıyoruz. Yaptığımız işlemler tamamen lineer işlemler.

Tabi bazı bilgili okurlar burada pozisyon vektörlerinin çevrimlerinin sonundaki toplama işleminden dem vurup lineerliğin bozulduğunu söyleyebilir. Daha sonra o kısmı da kılıfına uyduracağımızı belirtelim.

Ve de atalarımız bizden önce lineer denklemler üzerindeki işlemleri kolaylaştıran, onların daha kolay görünmesini, düzenlenmesini, çözülmesini vs. sağlayan bir takım sistemler geliştirmiş ve bunların hepsini 'Lineer Cebir' adı altında toplamışlar. Lineer Cebir'de; denklemleri, denklem kümelerini, katsayıları, bilinenleri, bilinmeyenleri, kısaca her şeyi 'matris' adı verilen elemanlar yapmışlar ve denklem çözümlerini, lineer işlemleri, formülleri, içiçe formülleri her bi şeyi matrisler üzerinden özel işlemlerle tanımlamışlar.

Neden matrisler sorusu burada iki önemli yanıt buluyor. Birincisi, geometride sürekli uğraşacağımız lineer denklemlerin, yılların birikimi sonucu oluşan Lineer Cebir sayesinde artık matris notasyonu ile gösterilmeleri; ikincisi ise, birazdan hepimizin göreceği üzere matrislerin programlamaya oldukça elverişli olmaları, hatta bildiğimiz arraylerden farksız olmaları.

Çevirimlerde matrisleri kullanmak bize şu katkıları da sağlayacak:
1) Sadece vektörlerin uzaylar arası çevrimi değil, uzayların da uzaylar arası çevrimi kolaylaşacak.
2) Yön vektörü, pozisyon vektörü ayrımından nihayet kurtulacağız ve çevrimler için tek bir formülümüz olacak. Hatta konuya yeniyseniz biraz şaşırtıcı olacak ama bu formül yukarıdaki kadar karışık olmayacak, sadece tek bir çarpma işleminden oluşacak.
3) Ve nihayetinde ters çevrim formülleri çok basit bir hale gelecek. (Basit olacak ama kolay olmayacak.)

O zaman bu matrislere ve nasıl kullanıldıklarına bir giriş yapalım.

Matrisler

Matris denen şey iki boyutlu sınırlı bir seridir. Yani içindeki elemanların matristeki pozisyonu iki sayı ile gösterilir. Bu elemanlar her şey olabilir ama biz kolaylık olsun diye onları sayı kabul edeceğiz. Mesela aşağıdaki şey bir matristir.
Kod: [Seç]
    [4 5 7]
A = [0 2 1]
Bu matrise A ismini verdik. A matrisinin 6 elemanı vardır. Bu elemanlar üç sütun ve iki satır içerisinde kendilerine yer bulmuşlardır. Bir başka değişle iki satır ve üç sütuna sahip bir tablodur. Örneğin '5' elemanı ikinci sütun, birinci satırdadır.

Bir matristeki sütun ve satır sayıları herhangi bir pozitif tamsayı olabilir. Sıfır satır ya da sütunlu matrisler olabilir mi bilmiyorum ama pratik açıdan bir önemi yok zaten.

Bi de bu matrisleri gösterirken genelde iki tane köşeli parantez kullanılır ama burada iki köşeli parantezi üstüste koydum, kafalar karışmasın.

Neyse, bu matrislerin satır ve sütun sayısı istediğimiz gibi olabiliyorsa, şunların her biri ayrı ayrı birer matristir.
Kod: [Seç]
    [4]      [5]      [7]
k = [0], l = [2], m = [1]
Demek ki yukarıda gösterdiğim 3x2'lik (genelde sütun önce gelir) bir sayı matrisi olan A'yı, 3x1'lik matris matrisi olarak kabul edebilirim. Bu, tercihi bir bakış açısı olmakla birlikte, geometri konusunda işimize yarayacak bir ayrıntıdır. Bu bakış açısıyla aynı A'yı şu şekilde de gösterebilirim:

A = [k l m]

Aynı bakış açısıyla her matrisin kendisini içeren bir 1x1'lik matris olduğu söylenebilir. (A = [A] gibi) Bu biraz mantıksız gelse de (ve belki yanlış olsa da) işleri epeyce kolaylaştıran bir bakış açısıdır. Bunun örneklerini birazdan göreceğiz.

Matrisler üzerindeki tanımlı en basit işlemler toplama ve çıkarmadır. İki matrisin toplamı ya da farkı demek, bütün elemanlarının tek tek toplam ya da farkından oluşan başka bir matris demektir. Örneğin:
Kod: [Seç]
[4 5]   [0 2]   [4 3]
[2 0] - [1 0] = [1 0]
[7 1]   [4 0]   [3 1]
Kolayca görüleceği üzere iki matris üzerinde toplama ya da çıkarma yapmak için hem satır hem de sütun sayılarının bire bir aynı olması gerekiyor.

Toplama işlemi için bir adet de etkisiz elemanımız var. O da tüm elemanları sıfır olan matris, yani sıfır matrisi.
Kod: [Seç]
[0 0]
[0 0]
[0 0]
Ama sadece bir tane değil bir sürü sıfır matrisi var. Özel birini belirtirken şu sütun ve şu satır sayısına sahip sıfır matrisi deriz. Tabi her biri o sütun ve satır sayısına sahip matrisler üzerindeki toplama işleminin etkisiz elemanı.

Şimdi matris matrisleri bakış açısının toplama ya da çıkarmada sorun çıkarmadığını görelim.
Kod: [Seç]
k = [2 9], l = [4 2], m = [2 0], n = [1 1]

[2 9]   [2 0]   [k]   [m]   [k+m]   [4 9]
[4 2] + [1 1] = [l] + [n] = [l+n] = [5 3]
Hmm biraz fazla bariz. Neyse yine beklemeye devam edin siz.

Matrisler üzerindeki bir diğer işlem (ve de en önemlisi) çarpma işlemi. Ben olsam çarpma işlemini tıpkı toplama ve çıkarma gibi elemanların tek tek çarpımından ibaret yapardım. Ama adamlar düşünmüş ve daha komplike ama çok daha fazla işe yarayan bir çarpma işlemi düşünmüşler. Bu işlemi de bir örnekle görüp sonra açıklamasını verelim.
Kod: [Seç]
        [0 2]
[3 4 1] [1 9] = [8 44]
         [4 2]
Biliyorum sonuç çoktan gökten düşmüş gibi duruyor. Ama bi de tek tek inceleyelim. Öncelikle sonucun ilk satır ve ilk sütununu, yani 8'i nasıl bulduk? Soldaki matrisin ilk satırı ve sağdaki matrisin ilk sütunu dışındaki elemanları görmezden gelirsek şöyle bir görüntü oluşur.
Kod: [Seç]
        [0 _]
[3 4 1] [1 _] = [8 _]
         [4 _]
Burda soldaki satır ile sağdaki sütun arasında şunu yaparsak:
3*0 + 4*1 + 1*4 = 0 + 4 + 4 = 8

Aynı işlemi 44'ü bulmak için yapalım:
Kod: [Seç]
        [_ 2]
[3 4 1] [_ 9] = [_ 44]
         [_ 2]
3*2 + 4*9 + 1*2 = 6 + 36 + 2 = 44

Peki ne yaptık hemen söyleyeyim.

Öncelikle sonucun boylarını nasıl bulduk? Soldaki matrisin satır sayısını (1) ve sağdaki matrisin sütun sayısını (2) kullandık. Bu her zaman böyledir. Tersi şekilde olsaydı da bi şey farketmezdi, o zaman lineer cebirin diğer kısımları ona göre şekillenirdi. 3x1 bir matrisi, 2x3 bir matrisle çarparsam sonuç 2x1 bir matris olur. Genelleme yaparsam NxM bir matrisi KxL bir matrisle çarparsam, sonuç MxK boyunda bir matris olur.

Peki boyda karar kıldık, peki matrisin içini nasıl dolduracağım? Yukarıda dediğim gibi, sonucun i. sütununda ve j. satırında bulunan elemanı bulmak için; sol matrisin j. satırını ve sağ matrisin i. sütununu kullanacağım. Sonra bu satır ve sütundaki her karşılıklı elemanı çarpıp tüm çarpımları toplayacağım. Sol matrisin satırları ve sağ matrisin sütunları önemli benim için. Sonucun boyuna da etki eden bu ikisinin sayıları zaten.

Amaaaa!

Burda bir kısıtlama var karşımızda, Örneği sol matris NxM boyunda olsun, sağ matris de KxL boyunda. Sol matristeki her satırda N tane (sütun sayısı kadar) eleman var. Sağ matristeki her sütunda da L tane (satır sayısı kadar) eleman var. Benim bunları karşılıklı çarpıp toplamı alabilmem için N=L olmalı. Yani:

"Sol matrisin sütun sayısı sağ matrisin satır sayısına eşit olmalı!"

Kod: [Seç]
<--3--> [0 2] ^
[3 4 1] [1 9] 3 = [8 44]
         [4 2] v
Ama bu sayı sonucun boyuna etki etmiyor.

Bu arada çarpma işleminde genelde işaret kullanılmıyor. Yani A ve B matrislerinin çarpımı AB şeklinde gösteriliyor. Bir de AB çarpımı boy kurallarına uyarken BA çarpımı uymayabilir. (NxM)(KxL) çarpımı N=L iken anlamlıyken, (KxL)(NxM) çarpımı ise M=K iken anlamlıdır.

Çarpma işleminde kafası karışanlar için yavaş yavaş bir daha gidelim. Örneğin iki matrisimiz şöyle olsun:
Kod: [Seç]
    [a b c]      [j k]
A = [d e f], B = [l m]
     [g h i]      [n o]
Öncelikle nasıl çarpma yapacağımıza bakalım. A'nın sütun sayısı (3), B'nin satır sayısına (3) eşit olduğu için AB işlemi mümkündür. Halbuki B'nin sütun sayısı (2), A'nın satır sayısına (3) eşit olmadığından BA işlemi mümkün değildir.

O zaman AB işlemi de şöyle olsun:
Kod: [Seç]
     [a b c] [j k]   [p q]
AB = [d e f] [l m] = [r s]
      [g h i] [n o]   [t u]
Bu çarpımda:
Kod: [Seç]
p = aj + bl + cn
q = ak + bm + co
r = dj + el + fn
s = dk + em + fo
t = gj + hl + in
u = gk + hm + io
Bu çarpımları elinizle (ya da tercihen mousela) yaparsanız olayın özünü şap diye kavrarsınız sanıyorum ki.

Şimdi bir adet gereksiz atraksiyon yapacağım ama gerekli olduğu yerleri anlamak için bunu inceleyin derim.

Şimdi bir kaç tane daha matris tanımlayayım:
Kod: [Seç]
    [a b]      [c]
C = [d e], D = [f], E = [g h], F = [i]

     [j k]
G = [l m], H = [n o]
Bu durumda şöyle bir ilginçlik elde ettik:
Kod: [Seç]
    [C D]      [G]       [i]
A = [E F], B = [H], AB = [J]
Yani:
I = CG + DH
J = EG + FH

İlk ifadeyi açması biraz uzun olacak o yüzden ikinciyi açalım:
Kod: [Seç]
          [j k]
J = [g h] [l m] + [i] [n o] =

J = [gj+hl gk+hm] + [in io] = [gj+hl+in gk+hm+io]

J = [t u]
Yani AB çarpımının alt kısmı. Benim açmadığım ifadeyi de açarsanız şu çıkacak:
Kod: [Seç]
    [p q]
I = [r s]
Demek ki matris matrisleri görüşü bazen hayatımızı kolaylaştırabilirmiş. Tabi burda çok abuk boyutlarda matrisler seçtim ve çarpılabilmeleri için biraz dikkatli davrandım. Ama 4x4 iki matrisi çarpmak yerine, bu matrislerin her birini 2x2'lik matrisler matrisi haline getirip kendi aralarında bu küçük matrisleri çarpabilirsiniz. Ve daha da güzeli kare matrislerden soldakini satır matrisler matrisi, sağdakini sütun matrisler matrisi yaparsanız bu tutorialın ana konuları çerçevesinde işleriniz çok kolaylaşabilir. Bundan ileride bahsedeceğiz.

Matris mevzusunu burada kesiyorum ama matrislerle ilgili başka olayları konunun içerisinde vereceğim. (Evet bunlar sadece temeldi.) Eğer matris nedir ne değildir tam anlamıyla kavradıysanız, üstüne matris işlemlerini (özellikle çarpmayı) bu şekilde anlatmama rağmen kaptıysanız sizi bir sonraki bölüm olan 'Vektör Matrisleri'ne bekliyorum.
Başlık: Temel Geometri
Gönderen: skate - 25.01.2006 15:20:58
Bunları Plazma'da yayınlasan? :)
Başlık: Temel Geometri
Gönderen: anesthetic - 25.01.2006 15:34:36
Alıntı
Originally posted by skate@Jan 25 2006, 01:20 PM
Bunları Plazma'da yayınlasan? :)
[post=4674]Quoted post[/post]
[/b]

Plazma'ya tutorialın başı bile girmedi daha ben de dayanamadım devamını getiriyordum. Editörlerin tercihi ilk olarak plazmada yayınlanması ise plazmaya başka tutoriallar bulurum nasıl olsa. :)
Başlık: Temel Geometri
Gönderen: anesthetic - 25.01.2006 15:42:40
VEKTÖR MATRıSLERı

Artık bu matris hadisesini geometride nasıl kullandığımızı öğrenme zamanı geldi. Vektörlerimizi bir matris haline getireceğiz. 3D vektörlerde bu iş için 1x3'lük bir sütun matris ya da 3x1'lik satır matris yeterli gibi. Bu boy değişimi bize sadece sağdan çarpma ya da soldan çarpma gibi farklılıklar sağlayacak. Teori yine aynı kalacak. Ama biz geleneğe uyup 1x3'lük sütun matrisleri kullanalım. Örneğin [a,b,c] vektörünü şu şekilde matris olarak göstereceğiz:
Kod: [Seç]
[a]
[b]
[c]
Tabi her seferinde böyle sütunlar yazmak zor olduğundan vektörleri [a,b,c] olarak göstermeye devam edeceğiz. O yüzden notasyonla ilgili bir uyarı yapalım da sonra işler karışmasın.
Kod: [Seç]
[a]
[b] = [a,b,c] != [a b c]
[c]
Yani dikey yazdığım şey her zaman bir sütun matris. Yatay yazdığımda ise, elemanları virgülle ayırıyorsam bir vektör, dolayısıyla bir sütun matristen; boşlukla ayırıyorsam bir satır matristen bahsediyor olacağım.

Bu noktada transpose (Türkçe'si ne bilmiyorum) matris olayından bahsedelim. Bir matrisin satır ve sütunlarının yer değiştirmiş haline o matrisin transpose'u denir. Örneğin
Kod: [Seç]
[a]            [2 3]T
[b] = [a b c]T  [2 0 1] = [0 1]
[c]       [3 1 5]  [1 5]
Transpose işareti matrisin sol üst köşesinde bir 'T' harfidir. Ama ben bunu zaman zaman matrisin yanına da koyabilirim. ([a,b,c]T = [a b c] gibi.) Matrisi ismiyle kullanırken de, A'nın transpose'u anlamına gelen T(A) kullanacağım.

Transpose her ne kadar matrisin 90 derece sağa yatmışı gibi görünsede aslen değildir. Yukarıdaki örneğe dikkatlice bakarsanız ne demek istediğim anlaşılır sanırım. Ayrıca bir matrisin transpose'unun transpose'u kendisidir.

Transpose olayını bildiğimiz bir konuda kullanalım şimdi.

ıki vektörün skalar çarpımı neydi:
[a,b,c] . [d,e,f] = ad + be + cf

Bunu matris halinde şöyle gösterebiliriz:
Kod: [Seç]
    [d]
[a b c] [e] = [ad + be + cf]
     [f]
Yani u ve v iki vektör olmak üzere; "u.v = T(u)v". ılk vektörün transpose'unu alıp ikinci vektörle çarparsak, içinde iki vektörün skalar çarpımının bulunduğu 1x1'lik bir matris elde ederiz.

Neyse transpose mevzusunu burada bırakıyorum. şimdi konunun özüne dalıyorum.

Matrislerle Yön ve Pozisyon Vektörleri

Tüm tutorial boyunca en kafamızı ağrıtan olay bu yön ve pozisyon vektörlerinin birbirinden ayrılması idi. Tamam bazılarınız diyebilir ya sadece yön ya da sadece pozisyon vektörleri kullanalım diye. Genelde de bir demoda, oyunda, simülasyonda vs. sadece pozisyon vektörlerini kullanacağız (nesnelerin pozisyonları olarak). Ama tanımladığımız uzayların hepsinde 3 adet yön vektörü bulunmak zorunda. Bu vektörleri ne yapalım, çöpe mi atalım? Ayrıca yön vektörlerini de kapsayan bir motor yazacaksak yine işler karışır. O yüzden bu işi bir sistematiğe bağlama zamanı geldi.

Yapacağımız çıkarımlar yine çevrim formüllerine dayanacak. A uzayında tanımlı v=[x,y,z] vektörü olsun. A uzayının B uzayında tanımı ise şöyle:
[px,py,pz]' pozisyon (merkez)
[xx,xy,xz]' yön (i)
[yx,yy,yz]' yön (j)
[zx,zy,zz]' yön (k)

Bu durumda v vektörünün B uzayında karşılığı olan v' şöyle olacaktı:

v yön vektörü ise:
v' . i = x*xx + y*yx + z*zx + 0*px
v' . j = x*xy + y*yy + z*zy + 0*py
v' . k = x*xz + y*yz + z*zz + 0*pz

v yön pozisyon vektörü ise:
v' . i = x*xx + y*yx + z*zx + 1*px
v' . j = x*xy + y*yy + z*zy + 1*py
v' . k = x*xz + y*yz + z*zz + 1*pz

Merkezin toplanması hadisesini bu sefer daha ilginç bir şekilde yazdım. Yön vektörlerinde katsayılar x,y,z,0 iken, pozisyon vektörlerinde x,y,z,1 oldu.

O zaman burada bir cinlik yapma zamanı geldi. Programda nasıl olsa her vektörün yön vektörü mü pozisyon vektörü mü olduğunu tutacağımıza göre, bu bilgiyi neden vektörün içinde yeni bir eleman olarak tutmayalım? Yani v bir yön vektörü ise onu [x,y,z,0] olarak, v bir pozisyon vektörüyse onu [x,y,z,1] olarak gösterelim.

Bu taktiğin ne gibi avantajları var peki? Bi kere işin teori kısmından epey bir yük gidecek. Hem yön hem de pozisyon vektörlerinde çalışan daha basit bir sistemimiz olacak. Pratik açıdan da yön ve pozisyon vektörlerinin ayrımını sağlayan koşul ifadelerinden kurtulacağız ve programımız daha da hızlanacak. Tabi bu nosyonu kullanmayıp amaca özel sistemler geliştirebilirsiniz. Ama ilk aşamada kusursuz çalışan bu yöntemi kullanmakta fayda var.

Neyse dağıldık yine. Bu durumda vektörleri 1x4'lük matrisler olarak ifade edeceğim. 2D için 1x3 olacaktı mesela ama o durum hiçbir zaman konumuza girmeyecek.

Skalar çarpımda matris notasyonu diye bir şey olmayacak artık ama skalar çarpım kodu yazarken ilk 3 elemanı kullanmak hala elimizde. Zaten birazdan çok fazla şey kaybetmediğimizi göreceğiz. Vektörel çarpımda matris notasyonunun ise pratik bir değeri olacağını sanmıyorum.

Peki vektörlerde dördüncü elemanı olarak 0 ya da 1 dışında bir sayı kullanırsak ne olur? O zaman, açıkça görüleceği üzere, uzay çevrimlerinde kaynak uzayın merkezi değil, merkezinin 0 ya da 1'den farklı bir katı kullanılır. Örneğin bu değeri 0 ve 1 arasında oynatarak vektörleri yön ve pozisyon arası getirip götürebilir ve ilginç bir efekt bulduğumuzu sanabiliriz. Lakin bu, vektörleri iki uzayın merkezi arasında getirip götürmekten başka bir fayda sağlamayacaktır.

Aslında bu son elemanın faydalarını şu ana kadar gördüklerimizi aşmayan bir örnekle anlatayım.

Örneğin elimizdeki bir karenin köşelerinin koordinatları şöyle olsun:
[0,1,0,1]
[0,1,1,1]
[1,1,0,1]
[1,1,1,1]

Kolayca anlaşılacağı gibi bu kare y=1 düzlemi üzerinde. Bu karenin ön yüzeyi yukarı doğru bakıyor olsun. O zaman [0,1,0,0] şeklinde bir normal vektörümüz olur. Bu normal vektörü karenin ön yüzünün nereye baktığını gösteriyor. Bu vektörü kullanarak kare üzerine gelen bir ışığın hangi açıyla geldiğini bulabiliriz (skalar çarpımın verdiği sonuçları hatırlayın) ama konumuz bu değil. Sadece bu vektörün yönünün önemli olduğunu, uzaydaki konumunun ise hiç bir işe yaramadığını bilmeliyiz. Yani bu normal kare üstünde olsa da, merkezde olsa da, [2,6,0,1] pozisyonunda olsa da karenin baktığı yönü veriyor.

Karenin koordinatları pozisyon vektörleriydi. Normali ise bir yön vektörü. şimdi vektörler arası yaptığımız işlemleri bir de mantıken inceleyelim.

Bir yön vektörünü bir yön vektörüyle topladığımızda, örneğin normali kendisiyle topladığımızda sonuç yine bir yön vektörü olacak ([0,1,0,0]+[0,1,0,0]=[0,2,0,0]). Bunda şaşılacak bir şey yok zira iki yön vektörünün toplamı art arda o yönlerde vektörlerin uzunlukları kadar ilerlemek demek. 4 kere sağa sonra 2 kere sola dediğimizde aslında 2 kere sağa demek istediğimizi herkes anlıyor. Aynı şekilde yön vektöründen yön vektörü çıkarmak da çok abes gelmeyecektir.

Peki bir pozisyon vektörünü bir yön vektörüyle toplayalım, örneğin karenin bir köşesine normalini ekleyelim:
[0,1,0,1]+[0,1,0,0]=[0,2,0,1]
Sonuçta bir noktaya varmamız gerekiyor ve bingo! ışlemimiz de bir pozisyon vektörü verdi. Yani bir pozisyon vektörüne bir yön vektörü eklediğimizde, aslında yaptığımız şey o pozisyondan o yönde ilerlemek (yön derken yön + uzunluk kastettiğimizi taa tutorialın başında demiş olmalıyız. :) Demediysek de o anlamda kullanıyoruz.) Bir pozisyon vektöründen bir yön vektörü çıkardığımızda ise aslında ters yönde ilerlemiş olacağız

Ama bir yön vektöründen bir pozisyon vektörü çıkarırsak...
[0,1,0,0]-[0,1,0,1]=[0,0,0,-1] ???
Oradaki -1 ne anlama geliyor? Tamamen tutarsız bir işlem yaptığımız anlamına geliyor. Yani bir yön vektöründen bir pozisyonun çıkması gayet anlamsız bir olay. Ben şahsen kafamda bu işlemi canlandıracak temeller bulamıyorum. Peki bu bir sorun mu? Hayır değil. -1 ile gösterilen ve her zaman bir pozisyon vektörünün bir yön vektöründen farkı olan başka bir vektör türü tanımlayabilirsiniz. Peki bu bir işe yarar mı? Belki. Peki kullanacak mıyız? Hayır. Bu tutorialda geometrik anlamı olmayan hiçbir şey yapmayacağız. ısteyen kendi başına deneysel takılabilir tabi. :)

Bir başka saçma işlem ise iki pozisyon vektörünü toplamak. ıki konumun toplamı bana hiç bir şey ifade etmiyor. Ama bu işlemi kullanarak daha ilginç bir şey yapabiliriz, o da iki ya da daha fazla konumun orta noktasını bulmak.

Örneğin karenin merkezini bulmak istiyoruz. Dört noktayı toplayıp dörde bölersek:
([0,1,0,1]+[0,1,1,1]+[1,1,0,1]+[1,1,1,1])/4 = [2,4,2,4]/4 = [0.5,1,0.5,1]
Sonuç kesinlikle tutarlı. Halbuki ara işlemde ortaya çıkan [2,4,2,4] anlamsız bir vektördü. Böyle işlemler yapmayacaksanız son elemanı tek bir bitte tutmak mantıklı olabilir ama. Bu tür işlemler için o elemanı da diğerleri gibi görmemiz gerekiyor.

Son elemanın faidelerinden bir tanesi de bir pozisyon vektöründen bir başka pozisyon vektörünün çıkarılması. Örnek olarak ilk köşeden diğerini çıkaralım:
[0,1,0,1]-[0,1,1,1]=[0,0,-1,0]
Sonucumuz bir yön vektörü. Bu vektör de ilk köşe ile ikinci köşe arasındaki kenarın uzaydaki rotasyonunu veriyor. Ya da bir başka bakış açısıyla, ilk köşeden bu yön kadar ilerlersek ikinci köşeye ulaşırız. Tamamen makul bir işlem.

Son olarak da skalar çarpımdan bahsedelim. Skalar çarpım fark ettiğiniz gibi pozisyon vektörlerine uygulanamıyor. Peki skalar çarpım bize ne veriyordu? ıki vektör arasındaki açının kosinüsünü. Peki bu kavram tamamen yönlerle alakalı değil mi? Yani uzayda iki pozisyon düşünün; bu pozisyonlar arasında bir açı mı var ki kosinüsü olsun? Ancak üç pozisyon olursa bir açı elde ederiz ve bu açıyı da köşelerin birbirinden çıkarılmasıyla bulunan kenar vektörleri sayesinde bulabiliriz. Bu kenar vektörleri de yukarıda gördüğümüz gibi birer yön vektörü olmaktalar.

Büyük ihtimalle pozisyon vektörleri ile çalışacaksınız demiştim. O yüzden özel sistemler geliştirip dördüncü elemanın dertlerinden kurtulabilirsiniz. Ama ısrarlı biri demo yapımında mutlaka normalleri de yönetmek isteyecektir. Bu nedenle 4 elemanlı vektörlere alışmak sizin için elzem olacaktır. Nedenini sonraki bölüm olan 'Uzay Matrisleri'nde çok çok daha belirgin şekilde göreceğiz.
Başlık: Temel Geometri
Gönderen: chenmy1 - 26.01.2006 04:43:09
Ben benim yaptigim plazma versiyonuna copy&paste yapiyorum burayi kusura bakmayin artik seyler icin deneme maksatli olur hem ..

Hedefim Kodlamadan PLAZMA sayilari cikarmak ve su an kodlamadan ekliyorum menuye bunlari ahahaha.

yayinliycam bekleyin...
Başlık: Temel Geometri
Gönderen: kasa-demo - 11.03.2007 00:29:10
okumadan çamur atmaya kalkarsam
uzun olmuş
tutorial için teşekkürler

biraz bakınca
matematikten geometriden iyice uzak kalmışım o sonuç çıkıyor