Tarih: Sat Aug 28, 2004 3:23 am Mesaj konusu: 3d rotate dönüşüm açılımı
arkadaşlar rotate komutu örneğin glRotatef(45,0,1,0)
bu kod nesneyi çeviriyor
nesnenemizin bağl. noktalarıda
glVertex(0,0,0)
glVertex(0,0,10)
glVertex(10,0,10)
glVertex(10,0,0)
diye bi düzlem tanımlayalım bu düzlemde rotate komutunu işlettiğimizde nesnenin bağlantı noktaları değişiyor
bu rotatede kullanışlan formülün açılöış şeklini bilen varmı nasıl bir sistem kullanılıyor.
mesela x ve z de döndürmek için
noktax[0]=noktax[0]*cos(alfa)+noktaz[0]*cos[alfa]
...
...
...
noktaz[0]=noktax[0]*cos(alfa)-noktaz[0]*cos[alfa]bu şekilde devam ediyor.
ama daha sonra tekrar başka bir yönde ör x ve y de döndermek istediğimzde kodlar tamamen değişiyor bu sefer x ve y ile birlikte z dediğişiyor.Kısacası bu rotatef kodun açılımımnı bilen varmı...
glRotatef'in yaptigi o anki aktif matrisi ( texture, projection, modelview ) baska bir rotasyon matrisi ile carpmak. Sonradan bu matrisler'de senin vertexlerinle carpilicak, yani senin butun glRotatef komutlarin kumulatif olarak bir matris de toplaniyo, yani direk olarak vertex ile carpilmiyo.
Illa da vertex ile carpmak seklinde dusunmek istiyosan soyle diyebiliriz:
Kod:
genel: glRotatef(angle, x, y, z);
x etrafinda: glRotatef(angle, 1, 0, 0);
y etrafinda: glRotatef(angle, 0, 1, 0);
z etrafinda: glRotatef(angle, 0, 0, 1);
Genel formul pek kullanilmaz cunku "intuitive"(?) degildir. Onun yerine ozel durumlar olan eksenler etrafinda dondurme kullanilir. Eger 2D dondurmeyi hatirlarsan:
bir nesneye önce
rotatef(45,0,0,1)
sonra
rotatef(35,0,1,0)
uygulamakla
önce
rotatef(35,0,1,0)
sonra
rotatef(45,0,0,1)
uygulamak arasında farklar var ve asıl sorun bu oluyo zaten
nesneyi ilk z de dönderidiğimizde
z değişmiyor
yeni x[0]=x[0]*cos(a)-y[0]*sin(a)
oluyo vs.. bunu bulduruyorum ama bundan sonra tekrar bir y ekseni
etrafında dönderdiğimde dönme noktasını merkez noktasını 0,0,0 yapıyorum herzaman tabiki..
ve ikinci döndermeden sonra nesnenin bir noktasının x i de y side z side yerdeğiştiriyor.
ve
hani kamera collisionlarda kullanılan ax+by+cz+d doğrusunu buldurup iki noktanın birbine olan uzaklığı sqrt(a*a+b*b+c*c) formülünde olduğu gibi ikinci döndermeden sonra 3 boyutta bir den haraket gerçekleşiyor.
şu anki kullandığım sistemde nesneyi önce z de dönderiyorum arkasından y de dönderiyorum ki ikinci dönüşten sonra 3 eksen birden yer değişştirmesin ama önce z de arkadan y de dönderdiğimde bir noktanın x i y si ve z si üçü birden değişiyor bunun formülü gerekiyor bana
yani tek tek x de z de yada y de döndermenin formüllerini biliyorum
aynı anda birden fazla eksende dönderdiğimizde herşey değişiyor
bu sefer yeni kodun örn
x[0]=(x[0]*cos(0)-y[0]*sin(a)) buna birde z[0] ı bir açı değeri ile çarpıp eklemek gerekiyor.çünkü ikinci dönüşte noktanın tüm değerleri yer değiştiriyor.
bu kadar. Dikkat edersen ikinci carpimlarda P1 kullaniliyor, P degil.
Su noktada biraz lineer cebir ve trigonometri calismani oneririm. Cunku bu operasyonlar aslinda matrix vector carpimindan ibarettir. Eger ilk rotasyon matrisine M1 ikincisine M2 dersek ( M1=z etrafinda 45, M2=y etrafinda 35):
Kod:
P2 = M2*M1*P
olur
M3 = M2*M1 dersek
P2 = M3*P
olur.
Bunun faydasi ne peki? Bunun faydasi su: M3 yi onceden hesaplarsan objenin her vertexi icin iki matris carpimi yerine bir matris carpimi yapman yeterli olacaktir.
değil zaten yazdıkların tamamen doğru evet ama benim sorunum şu
once
rotatef(35,0,1,0)
sonra
rotatef(45,0,0,1)
bunun açılımını verirsen sevinir ve sorumun yanıtını almış olurum.
Bu ikinci şekilde sonuç doğru çıkmıyor çünkü koda z ninde bişekilde eklenmesi gerekiyor z yide koda eklemeden sonuç doğru çıkmaz..
Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Mon Aug 30, 2004 1:49 pm Mesaj konusu:
İki döşümün yapılmasında, sıranın önemi yoktur, nesnenin bulunacağı son nokta her zaman aynıdır!
Önce 45 derece Z ekreninde dördükten sonra 35 derece Y ekseninde döndürmeyle, 35 derece Y ekseninde döndürme ile 45 derece Z ekseninde döndürme aynı sonucu verir! Yanı işlem sırası önemli değil! Sanırım senin kodlamanda sorun var? Tüm kodu buraya yapıştırman sorunun çözümünü hızlandıracaktır.
Şüphelerim:
1. glLoadIdentity();
2. glPushMatrix(); ve glPopMatrix();
3. Nesnenin merkez (origin) noktası tam ortada değil
akyalcingames:
Hocam ben sana sorunun cevabini "al budur koy koduna aynen kullan" seklinde vermem, vermek de istemiyorum. Olayi ogrenmene yardim etmeye calisiyorum.
Ypacagin is surdaki ilk denklemlerdeki p1 leri alip ikinci deklemlerdeki p1lerin yerine koymak. Artik ilk dondurmeyi diger sekilde yapmak istiyosan onu da ayarlarsin.
MD-C:
Alıntı:
İki döşümün yapılmasında, sıranın önemi yoktur, nesnenin bulunacağı son nokta her zaman aynıdır!
Buyuk hata! Hemen bir ornek veriyim. Noktamiz (1,0,0) olsun. Once y etrafinda 90 derece dondurelim, sonra z etrafinda 45 derece dondurelim. Elde edecegimiz nokta (0,0,1) olacaktir. Simdi tersini yapalim. Once z etrafinda 45 derece dondurelim(0.7,0.7,0) sonra y etrafinda 90 derece dondurelim. Sonuc: (0,0.7,0.7). ( Dikkat edersen ayni zamanda bu bir "gimbal lock" ornegi oldu ilk dondurme icin )
Genel olarak matrisler icin
M2*M1 != M1*M2
[/quote]
Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Mon Aug 30, 2004 6:15 pm Mesaj konusu:
leblebi doğru söylüyorsun, bende örneğinde farkettim! Sanırım vektörlerle karıştırdım! o halde tek çözüm kalıyor; kodunu da yazdığım gibi genel dönüşüm matrix'i kullanmak! böylece X, Y ve Z dönüşümleri aynı anda yapılacak
ben bunu zaten yapmıştım bu formül elimde mevcut bunda benimde hiç bir problemim yoktu ben başından beri ilk dönüşüm
glRotatef(45,0,1,0);
ikincisi
glRotatef(35,0,0,1);
in cevabını arıyorum ama
bunda üç vektör birden yer değiştirdiğinde bocaladım
aslında herhalde z değerini cos(alfa) ile yada sin(alfa) ile çarpıp eklemek yerine 1-cos(alfa) yada 1-sin(alfa) ile çarpıp ilave etmek gerekiyor.
herneyse
MD-C-->
Nesnenin merkezi orjin 0,0,0 nesneyi yani kutuyu -2500,-50,-1000 de oluşturup son noktasını 2500,50,1000 yapıyorum buda merkez yönünden bir problem olmamasını 0,0,0 olmasını sağlıyor.
Peki o genel dönüşüm matrix'ini nasıl kullanacağım denedim ama nasıl kullanmam gerkiyor.Bu sistemde merkez noktasını neresi almam gerekiyor yada bu sistem haklkında bu çarpımlar hakkında bir bilgi verebilirmisin..
Arkadaşlar gerek kalmadı 4*4 lük matrix çarpımıymış uğraştığım şey
hallettim problemi yalnız kafama takılan bi olayla karşılaştım
c=a*b eşit değildir d=b*a bunu biliyoz..
x y z
A=glRotatef(30,0,0,1);
B=glRotatef(40,1,0,0);
bu iki dönüşüm formülünü bir noktaya uyguladığım zaman
A matrisi B matrisi dersek bunun sonucu
D=B*A
acaba bunun nedeni ne?niye A*B diye işlemiyoda B*A diye alıyo...
ilk önce A daki glRotatef(30,0,0,1); komutunu yazmamıza karşılık
ilk matrisi B olarak alıyor.Bu c++ dilinin yapısıylamı ilgili acaba
hani iç içe parantez li bi sistemde en içteki parantezden başlar çalıştırmaya
acaba sadece c++ demi yoksa diğer dilerdede bu böylemi araştıran varmı...
Bu arda leblebi ne olurdu söyleseydinde kıymetli 3-5 saatimi boş şeylerle harcamasaydım...
Islem sirasi B*A olmali cunku vektoru once A ile donduruyosun sonra B ile donduruyosun. Once A ile dondurmen demek A*x olmasi demek. Sonra B ile dondurmek demek B*(A*x) olmasi demek. Onun icin sira onemli.
Bu forumda yeni konular açamazsınız Bu forumdaki mesajlara cevap veremezsiniz Bu forumdaki mesajlarınızı değiştiremezsiniz Bu forumdaki mesajlarınızı silemezsiniz Bu forumdaki anketlerde oy kullanamazsınız