Di�er konular� �zerinde uzunca bir gezinimden sonra
3 boyutlu grafikleri OpenGL alt�nda tart��mya var�yoruz. S�ze
yalan s�yleyerek bunun kolay oldu�unu s�ylemenin alemi yok , ��nk� kolay
de�il.
3 boyut uygulamalar�n�n iyi OpenGL programc�lar� �zellikle animasyonlar Cebir , Analitik Geometri
Fizik (Mekanik) ve elbette biraz da say�sal analizde bilgili olmal�lar.
Bu serilerin kalan k�sm�n� herkes i�in elimden geldi�ince
anla��l�r d�zeye indirmeye �al��aca��m.
Maalesef gereken �eylerden sadece bir ka�� olan e�riye polinomik
(polynomial) yakla��m y�zeyler
ve d�zlemin �� boyutlu uzaydaki matematiksel g�sterilimi , vekt�rler,
matrisler hakk�ndaki bilgileri
size veremem.
Ge�en haftalar boyunca bu kar���k konuyu nas�l b�y�k
bir kitlenin anlamas�n� sa�lar�m diye
d���nd�m. standart kitaplar ad�m ad�m yakla��m izlerler. Ben de ge�en
iki makalemde hemen
hemen ayn� y�ntemi izledim. Bu yolu daha fazla takip etmemeye karar
verdim ��nk� her
okuyucunun kendi kodunu yazma noktas�na gelmesi uzun zaman alacakt�.
Bunun yerine ba�ka bir metodu kullanmaya c�ret
ettim. Bunu "�ok tedavi" olarak adland�rmaya karar verdim .Bu makale benim
3 boyutlu similasyonlar�mdan bir tanesinin demosunun kodunu i�erecek, ve
ben bu kodu bit bit a��klamaya �al��aca��m. Asl�nda standart OpenGL kitaplat�nda
normal olarak i�lenenleri detayl� bi�imde a��klayaca��m. Fakat inan�yorumki
aniden sona atlamak ve okuyucuya kod �rneklerini baz� ilgin� �eylerle vermek
kullan�c�lar�n kodlar� denemesini ve baz� �eylerle u�ra�mas�n� sa�lar.Buna
ra�men �imdilik okuyuculara her�eyin tam olarak nas�l �al��t���n� anlatamayaca��m.
Umar�m ki bu methot �al���r ve insanlar bu y�ntemi daha h�zl� ve daha do�ru
bulur.
Ge�ti�imiz 6 ay boyunca Pittsburg �niversitesinde
jel ve polimer similasyonlar�n�n geli�tirilmesini destekleyen nesne y�nelimli
uygulma �zerinde �al��t�m. Bu proje �oktan tamam�yla geli�tirildi. Bilgisayar
bilimlerinden pek �ok insan i�in fizik ilgin�tir , ��nk� jel basit olarak
polimerlerden olu�mu� bir sinir a��d�r. Ve sinir a�lar� i�in geli�tirilmi�
pek �ok teknik jel yap�lar�na uygundur. Bu uygulaman�n stripped down edilmi�
birka� objesini toplad�m ve ../../common/May1998/example2.tar.gz ad� alt�nda basit bir demo
olarak paketledim. Bu paket Linux'ta di�er Unix'lerde veya GLUT kurulmu�
Windows 95 / NT ' de derlenebilir. Bu demo (ba�lanm�� monomerlerden olu�an
zincir ) hareket halindeki tek polimeri baz� �s�larda ��zelti i�inde as�l�
kal�rken g�sterir. The dynamics are tantalizing. It looks like a
snake on stimulants! It is very lively due to the collisions of solvent
molecules. You will not see the solvent, as it is taking care of
through the equations of motion of the polymer.
Example2 polimer zinciri boyunca her d���m�n (monomerin) koordinatlar�n�
izler animasyonun her karesinde monomerlerin koordinatlar�nda bir k�re
�izeriz ve sonra
monomerlerden monomerlere giden silindirleri kullanarak onlar� birle�tiririz.
Ba�l�ca iki temel 3 boyutlu ��e var : K�re ve silindir. Herhangi bir molek�lde
monomerler aras�ndaki uzakl�k zamanla de�i�ti�inden b�t�n ba�lant�lar�
sadece bir silindir kullanarak ��zemeyiz, silindir o andaki iki monomer
aras� uzakl��a ba�l� olarak tekrar �l�eklendirilmelidir.
Soru1: 1 y�ksekli�inde
bir yatay silindir ve bir k�re olmak �zere iki tane 3 boyutlu nesneye sahipsiniz.
her iki nesnenin merkezi koordinatlar�n orjininde olsun. E�er polimerler
hakk�nda bildi�iniz sadece d���mlerin x y z koordinatlar�n�n s�ras� ise
esas silindirin polimer ba�lant�lar�n� olu�turmak i�in nas�l �l�eklendirecek,
d�nd�recek ve ta��yacaks�n�z?
Anlayamad���m bir sebebten
dolay� bilgisayarc�lar kartezyen koordinatlar�n anlam�n� belirginle�tirmi�ler
x: yatay y: d��ey z: g�zlemciye giden. Buna dikkat edin ��nk� matematik
veya bilim taban�n�z varsa bu sizi kar��t�racakt�r. Animasyon penceresinin
�st b�l�m�nde o anki zaman� , polimerin o anki �s�s�n� i ortalama �s�s�n�
, ��zeltinin �s�s�n�, friction of the solvent ve d�� kameran�n d�nme a��s�n�
bilmenizi sa�layacak bir bilgilendirme banner '� var. Polimerin b�t�n y�zlerini
tam olarak g�stermek yerine kamera polimerin etraf�nda yava��a d�ner.
Ger�ekten benim bu
demo i�in se�ti�im polimer uzunlu�u polimerin kendi d�nmesini gerektirmeyecek
kadar k�sa example2.cxx dosyas�ndaki POLYMERLENGTH tan�m�n� 2 ile 100 aras�nda
de�i�tirebilirsiniz. Kameran�n d�nmesinin sebebi kullan�c�n�n g�r�ne bir
problemi yani (koordinat sisteminin de�i�mesi) canland�rmas�n� istememdir.
Ve hareket denkemlerinde kullan�lan d���mlerin koordinatlar� kullan�c�n�n
bak�� a��s�na ba�l� de�ildir. (Genel kordinatlardad�r) Bu koordinatlar
bilgisayar ekran�n�n iki boyutlu x-y koordinatlar�na d�n��t�r�lmelidir.
G�r�� a��s�n�n her de�i�ti�inde polimer i� koordinatlar�n� iki boyutlu
ekran koordinatlar�na �eviren form�ller de�i�ir.
Soru 2: Bu problemi nas�l
��zersiniz? hareket denklemlerinin genel koordinatlardan iki boyutlu viewpoint
koordinatlar�na d�n��t�r�lmesi �ok fazla cebir gerektirdi�inden konumuzun
d���ndad�r. ��nk� uygulanmas� �ok zordur ve pek �ok hata olu�abilir.
�kinci sorunun cevab�
�ok basit sadece bir se�ene�imiz var : 3 boyutlu polimer modelinin genel
koordinatlarda ifadesi ve bu koordinatlar�n �er�evenin (frame) render edilmesi
s�ras�nda iki boyutlu g�r�� noktas� (viewport) koordinatlar�na �evrilmesi.
Bu d�n���m� yapmak i�in OpenGL genelde donan�m d�zeyinde desteklenir .(OpenGL
kart� olanlar fark� g�rebilirler) Ama OpenGL'in bu konuya nas�l yakla�t���n�
incelemeden �nce isterseniz 3 boyutlu genel koordinatlardan 2 boyutlu
pencere koordinatlar�na ge�i�te ka� tane d�n���m yap�ld���na bakal�m.
�ncelikle Modelview koordinat d�n���m� gelir.
Bu d�n���m genel koordinatlar� g�zlemcinin g�zlerinin
( kamera ) yerine ba�l� 3 boyutlu g�z koordinatlar�na
d�n��t�r�r. Bu d�n���m�n Modelview olarak adland�r�lmas�n�n
sebebi, bu d�n���m�n benzer pek�ok aral�klara uygulanabilmesidir.
Modelleme ve g�r�nt�leme uygulamalar�ndan ikincisi bir
photo-camera'n�n bir st�dyoya yerlle�tirilmesi ve tam
kar��daki g�r�nt�n�n fotograf olarak adland�r�lmas�, di�eri ise
ilgilenilen objelerin kamera �n�ne yerle�tirilmesi olarak
d���n�lebilir.
D�n���m�n pipeline'�n� takip edersek g�z koordinatlar�n�n
projeksiyon koordinat d�n���mlerine ge�irildi�ini g�r�r�z.
Bu d�n���m�n amac� �imdilik gizli kalacak.
Kameran�n g�r�� y�n�nde ve objelerin g�r�� alan� i�ine
yerle�tirilmesinden sonra, OpenGL g�r�n�m�n ne kadar�n�n
bilgisayar ekran�na aktar�lmas� gerekti�ini bilmek
isteyecektir. Orne�in, kamera �ok uzaktaki bir da�a
y�nlendirilmi� olabilir. Bu durumda g�r�� alan� �ok b�y�k bir
alan� belirtecektir. Bilgisayarlar sadece sonlu �eyleri ele
alabilece�inden g�r�nt�n�n ne kadar�n� kesece�imizi
belirtmek zorunday�z. Bu d�n���m ayn� zamanda
gizli y�zeylerin kald�r�lmas�yla da ilgilenir. Sonda
ula��lacak koordinatlar Clip koordinatlar�d�r. Hat�rlars�n�z
ki, bu durum 3 boyutlu objelerin her zaman kamera �n�ne
d��mesi i�in yeterli de�ildir. Fakat, projeksiyon d�n���m�n�
tan�mlayan kesilmi� y�zeylerin i�inde olmal�d�r. Pek�ok 3
boyutlu persfektif �zellikleri ( konik, ortagonal, ... ) bu
a�amada uygulanabilir.
�u an i�in ne persfektif b�ul�nmenin ne de clip koordinatlar� ile normalle�tirilmi�
ara� koordinatlar� aras�ndaki fark� incelemeye giri�meyece�iz. �imdilik
bu gerekli de�il.
Son �nemli koordinat d�n���m� "G�r�� noktas� d�n���m�" . Burada,
b�t�n 3 boyutlu d�n���mlerden ge�en 3 boyutlu koordinatlar son i� olarak
bilgisayar ekran�n�n 2 boyutlu y�zeyine i�lenir.
Koordinat d�n���mleri matrislerle ( iki boyutlu say� dizileri ile )
ifade edilir. Yukar�daki her bir d�n���m i�in ayr� bir matris kullan�l�r.
Bu matrisler �er�eveyi render etmeden �nce program�n herhangi bir yerinde
tan�mlanabilirler. OpenGL her sahnenin ba��nda birtak�m matris d�n���mlerini
uygular. Bu, �ok ak�lc� ve yararl� bir tekniktir ve biz bunu daha ilerideki
yaz�larda inceleyece�iz. �u an i�in, gelin kodu inceleyelim ve bu d�n���mlerin
nas�l ve nerede uyguland���n� g�relim. example2.cxx dosyas�nda tan�d�k
oldu�unuz yeniden �ekillendirme fonksiyonlar� var.
void mainReshape(int w,int h){
//VIEWPORT TRANSFORMATION
glViewport(0,0,w,h);
//PROJECTION TRANSFORMATION
glMatrixMode(GL_PROJECTION);
glLoad Identity();
glFrustum(wnLEFT,wnRIGHT,wnBOT,wnTOP,wnNEAR,wnFAR);
//MODELWIEW TRANSFORMATION
glMatrixMode(GL_MODELVIEW);
...............
glViewport(x,y,w,h) direktifi,g�r�nt� alan�n�n d�n���m�n� sa�lar :
x ve y ��geni g�ren pencerenin sol alt k��e
koordinatlar� ve 'w' ve 'h' de g�r�� alan�n�n boyutlar�d�r.
B�t�n numaralar pixel (parantezler) i�inde verilir.
Ard�ndan glMatrix Mode() ,son matrisi se�mek i�in kullan�l�r , planlanan
d�n���m�n belirlenmesine ba�lamak i�in
GL_PROJECTION parametresiyle �ag�r�l�r. Herhangi bir matris d�n���m�
belirlenmeden �nce (k��e koordinatlar�n�
etkilemeyen) birle�im matrisi y�klemek tavsiye edilir.Bu i�lem son
matrisi birle�tirmeye ba�layan glLoad Identity() ile
yap�l�r. Daha sonra s�ra �� boyutlu perspektifin bildirimine gelir;
glFrustum(sol,sa�,alt,�st,yaki�,uzak) cumlesi sa�,sol,alt,�st,yak�n
ve uzak pozisyonlarda kesi�en y�zeyleri bildirir.Bu numaralar g�z koordinatlar�nda
belirlenir ve say�lar�n b�y�kl�kleri de g�r�nt�
alan�nda (bilgisayar ekran�) yerle�tirilen bo�luk hacimlerinin �eklini
(b�ylelikle perspektifini ) belirler. Bu belki kar���k
g�runebilir;benim al��mam da bir sure ald�. Hakk�nda bir al��kanl�k
kazanabilmek i�in yap�lacak en iyi �ey �esitli say�lar
denemektir; yaln�z her zaman hat�rlanmas� gereken �u ki; hangi say�y�
se�erseniz se�in model-viewed (�rnek al�nan) nesne
kesi�en y�zeylerin i�inde kalmal�d�r. Aksi takdirde ekranda hi�bir
�ey g�rnmeyecektir. Planlanan d�n���m�n belirlenmesi i�in
farkl� yollar da var. Zaman i�inde bu konulardan da bahsedece�iz.
Final olarak ge�erli matrisi (�rnek alinan) modelview harf kal�b�yla
degi�tiririz. Bu i� i�in tekrar GL_MODELVIEW
parametresini kullanarak glMatrixMode() �zelli�inden yararlan�r�z.
mainReshape() �zelli�i di�er ilgisiz �eylerle devam eder ve
biter. Burada �nemli olan �udur: As�l pencere yeniden �ekillendirilirken
bu �zellik, g�r�nt� alan�n� ve planlanan d�n���m�
belirlendi. Son olarak da (�rnek al�nan) modelview matrisi ge�erli
duruma getirdi.
Bundan sonra, mainDisplay() �zelli�i modelview (�rnek al�nan) d�n���m�n
belirtilmesine son verir ve polimeri scene() ile
tamamlar:
void mainDisplay(){
glutSetWindow(winIdMain);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Renkleri netle�tirir ve (derinlik verir) depth buffers
//Bu ,tahtayi silmek gibidir
//MODELVIEW DONUSUMUNE DEVAM: Kameray� kur ve yerle�tir
glLoadIdentitiy(); //Birle�imi ge�erli matrise y�kle
glTranslatef(0.0,0.0,-4.0); //Kameray� 4 ad�m geri g�t�r
//kameray� -z y�n�n� g�sterir �ekilde b�rak�r�z. Asl�nda bu, arkadaki
g�r�nt�y� -z y�n�nde
//4 ad�m hareket ettirerek ger�ekle�ir. Ekaranda yaln�zca izlenen hacmin
i�inde kalan
//g�r�nt� elemanlar� g�z�k�r. (Daha sonra planlanan d�n�s�m k�sm�na
bak�n�z)
//Zinciri olu�turmak
glSaclef(0.5,0.5,0.5);
glRotatef(Aci,0,1,0);
scene();
glutSwapbuffers();
};
Umar�m iki alt pencere kullanarak okuru �ok �a��rtmam���md�r. Sonu�lar�
alt pencerelere bagl� olarak a��klam�yorum; ��nk�
bu bir �nceki b�l�mde (windows management) zaten ele al�nm��t�. E�er
��pheli olan bir k�s�m varsa l�tfen geri d�n�p haf�zan�z�
tazeleyiniz.
Bu �zellik olduk�a a��k ve basittir. �lk �nce glClear rengi siler ve
(derinlik verir) depth buffers.Depth buffer (derinlik
verilmesi) simdi �� boyutta �nemlidir; ��nk� her k��enin z koordinati,
sakl� y�zeyleri ve y�zeylerin yer degi�tirmesini saptamak
i�in test edilmelidir. Ardindan birle�im matrisi ge�erli modelview
matris �zerine y�kleriz ve 3 modelling d�n���m� �ag�r�r�z:
glTranslate(xt,yt,zt),,bu ge�erli koordinat sistemini (xt,yt,zt) vekt�rleriyle
ta��r. Bizim durumumuzda bu i�lem kameray� z'de
4 birim geri g�t�rme etkisini yarat�r ki bu da �rnekten uzaktad�r.
E�er bunu yapmasayd�k kamera orjinde, sahnenin ortas�nda
kalacakt� ve �ok az �ey g�rebilecektik.
glScalef(xs,ys,zs),ad�ndan da anla��laca�� gibi koordinat sistemlerini
s�ras�yla x,y,z eksenleri boyunca xs,ys,zs fakt�rleriyle
�l��lendirmeye yarar. Bu �l��lendirme koordinat sisteminin d�nyada
kabul g�rm�� koordinat sistemine uymas� i�in gereklidir.
glRotatef(aci,vx,vy,vz), ge�erli koordinat sistemini (vx,vy,vz) normal
vekt�r� etraf�nda belli a��larla d�nd�r�r. Bu
bizim, kameran�n d�nd�g� izlenimini vermek i�in kulland�g�m�z bir hiledir.
Asl�nda d�nen sahnedir. Kameray� hareket ettirmenin
ba�ka bir�ok yolu olmas�na ra�men �u anda en kolay� budur.
Son bir uyar�: Modelling d�n�s�mlerin s�ras� �ok onemlidir. Her koordinat
sistemi �ag�r���m�zda Modelview matrise ne
oldu�unu anlamam�z gerekir. Her d�n���m Ti matemaksel olarak bir Mi
matrisiyle temsil edilir. Bir dizi d�n���m�n superposition
i ,Tn Tn-1....T1 (�rne�in: yer degi�tirme+�l��lendirme+d�nd�rme) matematiksel
olarak bir tek matrisle temsil edilir.M=Mn
Mn-1.......M1
.S�ralama en can al�c� noktad�r; ��nk� karma��k M d�n���m� bir k��eye
uyguland�g�nda d�n���mler ters s�rada ger�ekle�ir.
M v = Mn Mn-1 .... M1 v
Ilk olarakM1, sonraM2, vb... ve en son olarak da Mn Kod �rne�imizde
transformansyonlar� yandaki s�raya g�re belirttim:
translasyon-> �l�eklendirme -> d�nm��. Bundan dolay�, d�nya koordinatlar�ndak�
modelimizin her noktas� grafik ekran�na
yans�t�lmadan �nce d�nm�� -> �l�eklendirilmi� -> �evirilmis olmal�d�r.
Kod yazarken, bu transformasyonlar�n ters s�ras�n� her zaman akl�n�zda
bulundurun, aksi taktirde �ok �a��rt�c� sonu�lar
bulabilirsiniz.
scene ?> fonksiyonu polimer obje uzerindeki 3D-�eviricisini �al��t�r�r.
3D modelinin sonradan nas�l in�a edildi�ini anlamak i�in
Gd-OpenGL.cxx dosyas�na gidip member fonksiyonu draw GdPolymer ? P
ye bir g�z atmak gerekir. Polimer zincirindeki b�t�n
par�alardan ge�en bir ana halka vard�r ; �yle ki bu halka X, Y, Z koordinatlar�n�
tekrar bulup getirir ve o b�lgede bir k�re �izer
ve sonra birbirine halen bagl� olan par�alardaki ba�lar boyunca silindirler
�izer. Soru 1'i hat�rl�yor musunuz? ��te size bir olas�
��z�m ... Daha h�zl� bir ��z�m �retebilirseniz bizim de haberimiz olsun.
Okuyucunun Polimer �evirme rutinini tamamiyle anlayabilmesi i�in bir
�ey daha var. glPushMatrix?> ve glPopMatrix?> ne i�e
yarar ?
Polimer modelinde sadece 2 tane geometrik temel vard�r ; biri merkezi
orijinde olan 0.40 yar��apl� bir k�re, di�eri ise y�ksekli�i
1.0 yar��ap�
0.40 olan bir dogru silindir. Polimer, kureleri ve silindirleri d�zg�n
bir pozisyonda yerle�tirmek i�in bu iki temeli ve
transformasyonlar serisini kullanmak suretiyle yap�l�r. glCalList ?Par�a>
ve glCalList?Silindir> komutlar�ndan her biri her i�leme
konuldu�unda orijinde yeni bir k�re ve silindir �evirilmi� olur. K�releri
X, Y, Z koordinatlar�na ta��mak i�in bir translasyona
ihtiyac�m�z var ?bkz. glTranlatef?X, Y, Z>>; Bir silindiri bir ara
zincir gibi �evirmek ve yerle�tirmek daha zor olur ��nk� ilk
ba�ta silindiri ara zincir kadar b�y�k yapman�z laz�m ve daha sonra
onu do�ru y�ne �evirmeniz laz�m. ?Benim hesap y�ntemime
g�re rotasyon transformasyon �eklinde bir derecelendirme kullan�l�r>
3D modelini inssa etmek i�in hangi metod kullan�l�rsa kullan�ls�n ona
hi� ��phe yok ki o ek transformasyonlara, tranzlasyonlara
ve rotasyonlara ihtiya� olacak. scene ?> fonksiyonu �a��r�ld���nda
OpenGL pozisyon makinas�ndaki mevcut matris
MODELVIEW matrisidir. Daha �nce de belirtti�imiz gibi, bu, modelin
d�nya koordinatlarinin clipping koordinatlar�na
projeksiyonunu temsil eden matristir. Bu ciddi bir sorundur ; modelview
matrisi hala ge�erli matris iken, 3D modelini
kurmak i�in uygulanan her ilave transformasyon ge�erli matrise eklenecek
ve modelview tranformasyonunu tahrip etme
�eklindeki arzulanmaz bir sonuca yol a�acakt�r. Bununla yap�lan iki
temel i�lem vard�r ; glPushMatrix?> ile uygulanan stack
push ve gl PopMatrix?> ile uygulanan pop. scene?> fonksiyonun kaynak
kodunu bir kere daha inceleyiniz ve her par�an�n
k�resini tercume etmeden �nce MODELVIEW matrisini stack'in i�ine g�ndermek
i�in bir kereli�ine push i�lemini �a��rd���m�zda
dikkat ediniz. Halkan�n sonunda da MODELVIEW matrisini geri getirmek
i�in pop i�lemini �a��r�n�z. Polimer s�ralar�n� �eviren
i�eride bulunan halkan�n kendi push'u ve pop operasyonlar� vard�r ;
�yle ki bunlar skalayi izole eder ve k�re ile silindirleri
etkileyen tranzlasyonda transformasyonlar� �evirir.
3D tranformasyonlari matris stacklari hakk�nda s�ylenecek �ok s�z yok.
Bu makalede biz sadece her iki konuyu yuzeysel bir
�ekilde anlatt�k. �u an i�in bu kadarl�k bir anlat�m yeterli olur,
ilgilenen okuyucunun kaynak kodunu kendisi arast�rmas� ve kendi
3D modellerini geli�tirmesi gerekir. Kod �rne�i 2'de daha �nce arast�r�lmamm��
baz� �ehreleri de kullan�r: materyaller ve
���kland�rma. Edisyonlar�n tart��mas�n� daha sonraki bir makaleye b�rak�yoruz.
Bir dahaki sefere matris stacklerini ve 3D
tranformasyonlar�n� daha derin bir �ekilde anlataca��z. Hareket eden
bir robotu OpenGL komutlar�yla nas�l y�nlendirece�imizi
de g�sterece�iz. O zamana kadara OpenGL ile iyi vakiti ge�irmeye bak�n.
|