Ana Menü
· Ana Sayfa
· Dosyalar
· Dökümanlar
· Forum
· Günün Resmi
· Haber Arşivi
· WWW Linkleri
· Üye Listesi

     Forumlar

 strncpy ve strncpy_s
 Konu adi : Borland c++ Builder ile Amiral Batti
 Rady10 - YerliOyun
 Kabusta Kaybolmak
 Konsol da programı bekletmek
 Oyun programlama icin hangi programlama dilli ?
 flash! şanlıurfa bilgisayar oyununda(no rapid)
 Sevgilim Olur musun?
 Directx'e başlamak isteyenler bi bakın
 PSP programlama
 Flash tan php
 Bilgisyr oyunu yapmam için üniverstde hangi bölüme girmeliym
 www.arshiv.gen.ms
 Cimg.h ilgilenenler icin
 müttefik oyunu

Konu Disi
 Emraah
 Yeni sitemiz açıldı
 Kalp krizi durumunda ne yapılmalı?
 Oyun sektöründe hangi görevde çalışmak isterdiniz?
 Takım arkadaşı sorunu
 msn de renklı nıck
 pc hata veriyor ! YARDIM!!
 Gülmek isteyenler Buraya
 İnanılmaz hl 2 modu görüntüsü
 Computer Languages History

[ Forumlara Git ]


oyunyapimi.org: Forums

www.oyunyapimi.org :: Başlığı Görüntüle - 3d rotate dönüşüm açılımı
 SSSSSS   AramaArama   Kullanıcı GruplarıKullanıcı Grupları   ProfilProfil   LoginLogin 

3d rotate dönüşüm açılımı

 
Yeni Başlık Gönder   Cevap Gönder    www.oyunyapimi.org Forum Ana Sayfası -> Duyurular
Önceki başlık :: Sonraki başlık  
Yazar Mesaj
akyalcingames



Kayıt: Feb 15, 2004
Mesajlar: 162
Nereden: Konya

MesajTarih: Sat Aug 28, 2004 3:23 am    Mesaj konusu: 3d rotate dönüşüm açılımı Alıntıyla Cevap Ver

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ı...
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder
leblebi



Kayıt: Jan 05, 2004
Mesajlar: 127
Nereden: q3dm17

MesajTarih: Sat Aug 28, 2004 5:10 pm    Mesaj konusu: ... Alıntıyla Cevap Ver

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:

Kod:

p_rot[0] = p[0]*cos(a) - p[1]*sin(a);
p_rot[1] = p[0]*sin(a) + p[1]*cos(a);


dir. Eger bunu 3D'de x ekseni etrafinda yapmak istersen:
Kod:

p_rot[0] = p[0]
p_rot[1] = p[1]*cos(a) - p[1]*sin(a);
p_rot[2] = p[2]*sin(a) + p[2]*cos(a);


y ekseni icin:
Kod:

p_rot[0] = p[0]*cos(a) - p[2]*sin(a);
p_rot[1] = p[1]
p_rot[2] = p[0]*sin(a) + p[2]*cos(a);


z ekseni icin:
Kod:

p_rot[0] = p[0]*cos(a) - p[1]*sin(a);
p_rot[1] = p[0]*sin(a) + p[1]*cos(a);
p_rot[2] = p[2]
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
leblebi



Kayıt: Jan 05, 2004
Mesajlar: 127
Nereden: q3dm17

MesajTarih: Sat Aug 28, 2004 5:13 pm    Mesaj konusu: ... Alıntıyla Cevap Ver

tabii ki x ekseni etrafindaki denklemler:

Kod:

p_rot[0] = p[0]
p_rot[1] = p[1]*cos(a) - p[2]*sin(a);
p_rot[2] = p[1]*sin(a) + p[2]*cos(a);
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
akyalcingames



Kayıt: Feb 15, 2004
Mesajlar: 162
Nereden: Konya

MesajTarih: Sun Aug 29, 2004 3:03 am    Mesaj konusu: Alıntıyla Cevap Ver

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.
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder
leblebi



Kayıt: Jan 05, 2004
Mesajlar: 127
Nereden: q3dm17

MesajTarih: Sun Aug 29, 2004 4:41 pm    Mesaj konusu: ... Alıntıyla Cevap Ver

Abi iste elinde bir P noktasi var. Eger
Kod:

once
rotatef(45,0,0,1)
sonra
rotatef(35,0,1,0)


ile dondurulmus P2 noktasini bulmak istiyosan:

Kod:

p1[0] = p[0]*cos(45) - p[1]*sin(45);
p1[1] = p[0]*sin(45) + p[1]*cos(45);
p1[2] = p[2]

p2[0] = p1[0]*cos(35) - p1[2]*sin(35);
p2[1] = p1[1] ;
p2[2] = p1[0]*sin(35) + p1[2]*cos(35);


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.
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
MD-C



Kayıt: Feb 26, 2003
Mesajlar: 1258
Nereden: Dünya.Türkiye(54)

MesajTarih: Sun Aug 29, 2004 4:57 pm    Mesaj konusu: Alıntıyla Cevap Ver

Sorun çözmek için; sende genel dönüşüm matrisini kullan

Kod:

   GET_COS(CosineAngle, AngleDir);
   GET_SINE(SineAngle, AngleDir);

   // X.
   xNewLookDirection = (CosineAngle + (1 - CosineAngle) * durumX);
   xNewLookDirection += ((1 - CosineAngle) * durumX * durumY - durumZ * SineAngle);
   xNewLookDirection += ((1 - CosineAngle) * durumX * durumZ + durumY * SineAngle);

   // Y
   yNewLookDirection = ((1 - CosineAngle) * durumX * durumY + durumZ * SineAngle);
   yNewLookDirection += (CosineAngle + (1 - CosineAngle) * durumY);
   yNewLookDirection += ((1 - CosineAngle) * durumY * durumZ - durumX * SineAngle);

   // Z
   zNewLookDirection = ((1 - CosineAngle) * durumX * durumZ - durumY * SineAngle);
   zNewLookDirection += ((1 - CosineAngle) * durumY * durumZ + durumX * SineAngle);
   zNewLookDirection += (CosineAngle + (1 - CosineAngle) * durumZ);
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
akyalcingames



Kayıt: Feb 15, 2004
Mesajlar: 162
Nereden: Konya

MesajTarih: Mon Aug 30, 2004 5:27 am    Mesaj konusu: Alıntıyla Cevap Ver

once
rotatef(45,0,0,1)
sonra
rotatef(35,0,1,0)

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..
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder
MD-C



Kayıt: Feb 26, 2003
Mesajlar: 1258
Nereden: Dünya.Türkiye(54)

MesajTarih: Mon Aug 30, 2004 1:49 pm    Mesaj konusu: Alıntıyla Cevap Ver

İ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
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
leblebi



Kayıt: Jan 05, 2004
Mesajlar: 127
Nereden: q3dm17

MesajTarih: Mon Aug 30, 2004 5:33 pm    Mesaj konusu: ... Alıntıyla Cevap Ver

akyalcingames:
Hocam ben sana sorunun cevabini "al budur koy koduna aynen kullan" seklinde vermem, vermek de istemiyorum. Olayi ogrenmene yardim etmeye calisiyorum.

Kod:

p1[0] = p[0]*cos(45) - p[1]*sin(45);
p1[1] = p[0]*sin(45) + p[1]*cos(45);
p1[2] = p[2]

p2[0] = p1[0]*cos(35) - p1[2]*sin(35);
p2[1] = p1[1] ;
p2[2] = p1[0]*sin(35) + p1[2]*cos(35);

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]
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
MD-C



Kayıt: Feb 26, 2003
Mesajlar: 1258
Nereden: Dünya.Türkiye(54)

MesajTarih: Mon Aug 30, 2004 6:15 pm    Mesaj konusu: Alıntıyla Cevap Ver

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
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
akyalcingames



Kayıt: Feb 15, 2004
Mesajlar: 162
Nereden: Konya

MesajTarih: Mon Aug 30, 2004 10:33 pm    Mesaj konusu: Alıntıyla Cevap Ver

iyi hoşta sen onu yazmadan önce

p1[0] = p[0]*cos(45) - p[1]*sin(45);
p1[1] = p[0]*sin(45) + p[1]*cos(45);
p1[2] = p[2]

p2[0] = p1[0]*cos(35) - p1[2]*sin(35);
p2[1] = p1[1] ;
p2[2] = p1[0]*sin(35) + p1[2]*cos(35);

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..
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder
akyalcingames



Kayıt: Feb 15, 2004
Mesajlar: 162
Nereden: Konya

MesajTarih: Tue Aug 31, 2004 5:23 am    Mesaj konusu: Alıntıyla Cevap Ver

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...
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder
leblebi



Kayıt: Jan 05, 2004
Mesajlar: 127
Nereden: q3dm17

MesajTarih: Tue Aug 31, 2004 3:10 pm    Mesaj konusu: ... Alıntıyla Cevap Ver

Yaw ben zaten bunu soyledim ya !?

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.
Başa dön
Kullanıcı profilini gör E-Posta'yı gönder Kullanıcının web sitesini ziyaret et
Mesajları göster:   
Yeni Başlık Gönder   Cevap Gönder    www.oyunyapimi.org Forum Ana Sayfası -> Duyurular Tüm saatler GMT +2 Saat
1. sayfa (Toplam 1 sayfa)

 
Forum Seçin:  
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


Powered by phpBB 2.x.x © 200x phpBB Group
Türkçe Çeviri : Onur Turgay & Erdem Çorapçıoğlu
Türkçe Düzenleme: Alexis Canver
Version 2.x.x of PHP-Nuke Port by Tom Nitzschner © 200x www.toms-home.com




Web site powered by PHP-Nuke
Web site engine\'s code is Copyright © 2002 by PHP-Nuke. All Rights Reserved. PHP-Nuke is Free Software released under the GNU/GPL license.
Sayfa Üretimi: 0.119 Saniye