Gönderen Konu: Temel Geometri  (Okunma sayısı 54932 defa)

Temel Geometri

« Yanıtla #15 : 29.10.2005 12:59:39 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
temel geometri'den başka acaba "idris geometri" yada "fadime geometri" diye bişi var mı? (kızmaca yok dayanamadım yaa...) :lol:

Temel Geometri

« Yanıtla #16 : 29.10.2005 15:56:59 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
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.

Temel Geometri

« Yanıtla #17 : 29.10.2005 21:44:32 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
hahahahaha :)

Temel Geometri

« Yanıtla #18 : 25.01.2006 01:35:33 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
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.

Temel Geometri

« Yanıtla #19 : 25.01.2006 15:20:58 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Bunları Plazma'da yayınlasan? :)

Temel Geometri

« Yanıtla #20 : 25.01.2006 15:34:36 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
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. :)

Temel Geometri

« Yanıtla #21 : 25.01.2006 15:42:40 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
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.

Temel Geometri

« Yanıtla #22 : 26.01.2006 04:43:09 »
Hızlı düğmeleri aç

chenmy1

İleti: 184

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://www.mosengine.inativa.com
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...
Algoritmik Geometri^S!P and MEE!ditor 64/4 kb intro tool.

Temel Geometri

« Yanıtla #23 : 11.03.2007 00:29:10 »
Hızlı düğmeleri aç

kasa-demo

İleti: 129

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
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