PDA

Prikaži potpunu verziju : Lavirinto 3d


zchira
13.6.2008, 0:05
Ranije sam ovde otvarao temu o mojoj igri Lavirinto:
http://www.sk.rs/forum/showthread.php?t=15729&highlight=lavirinto

U medjuvremenu sam malo pauzirao, i malo doradjivao tako da je stara 2d verzija (0.58) zavrsena i napushtena, a novu sam poceo da pravim koristeci Java/OpenGL. Jos uvek nije igriva, ali mozete da vidite klip kako ce otprilike da izgleda:
www.zchira.110mb.com

na ovom sajtu mozete videti klip sa 3d verzijom, a mozete skinuti i staru 2d verziju.
Direktan link na youtube je:
http://www.youtube.com/watch?v=bXYmInFPP-k

Patton
13.6.2008, 7:57
Izgleda jako mocno... samo tako nastavi :aplauz:

A cekaj sto Java?

zchira
13.6.2008, 8:36
Pa, javu radim na poslu i najbolje je poznajem od svih jezika.
A druga stvar je multiplatformnost jave. Kod kuce koristim linux a na poslu windows, pa mu java dodje kao najbolje resenje (i pored svih mana).

Stevvan
13.6.2008, 10:29
Lepo izgleda, zanimljiva ideja, ja bih ti savetovao da koristis i neki engine za fiziku, ili ako hoces da je odradis sam, kako bi igra izgledala realnije (mozda mi se ucinilo, ali mi kotrljanje lopte ne deluje bas realno). Takodje ces moci da dodas razne stvari tako da ces igru uciniti jos zanimljivijom. Srecno, i nadam se da ce uskoro biti neki demo :)

zchira
13.6.2008, 14:22
Da, lopte se ne okrecu kako treba, ali trenutno ima jos dosta prioritetnijih stvari da se uradi. Kad to zavrsim, treba da se igra malo graficki uoblici (trenutno je neki schLj dizajn) i da se doda zvuk i da se malo ubudze efekti (refleksije, senke itd...)...

Stevvan
13.6.2008, 19:02
Koje su to stvari? :)
Btw, upravo sam igrao 2d verziju igre i lepo radi na linuxu (ubuntu). Hteo bih jos da te pitam koju tehniku koristis za renderovanje objekata? (obican glBegin-glEnd, DisplayList-e, VA, VBO...)

zchira
14.6.2008, 14:59
Te svari :) su:
Treba da se doda logika za ucitavanje nivoa (nivo ce biti cuvani u XML formatu), stvari vezane za sitnice kao sto su meniji, high score, strukture za cuvanje statusa (ponei, zivoti, vreme i td...)... nije nista problematicno samo treba vreme da se odradi. A da, treba i da se osmisle i zanimljivi nivoi.

Sto se tice 2d verzije ona je (kao i 3d) pravljena pre svega za linux, tj. masina na kojoj se pravi igra radi pod linuxom (arch Linux).

Sto se tice tehnike za renderovanje, za neke stvari koristim displaj liste (za polja u lavirintu i objekte), a za neke glBegin i glEnd (za particle engine).
Nasao sam na netu neki kod koji mi omogucava da ucitavam objekte pravljene u nekom programu za 3D modelovanje (waveFront obj format). Jos uvek ne znam kako se radi sa animiranim 3d objektima, ali dok dodje vreme za to valjda cu da se snadjem i za to.
Inace koristim LWJGL. Pokusao sam bio i sa JOGL-om ali sam u medjuvremenu nasao bolju literaturu (i primere) za lwjgl pa sam presao na njega.

Stevvan
14.6.2008, 15:44
.obj format sam po sebi nije los, tj. sadrzi sve sto ti treba za obican model, medjutim problem predstavlja ako hoces da koristis tehnike kao sto su VertexArray-i (VA) ili VertexBufferObject (VBO). Tj. za najoptimizovaniji rad potrebno ti je da ti se informacije o vertex-u nalaze zajedno, tj. da npr struktura vertex sadrzi sledece podatke: poziciju, boju(ako je ima) i tex_coord (ako ima). Ja za projekte na kojima radim koristim 1 i 3 stvar. Dakle za .obj format to nije najsrecnije uradjeno jer on radi sledece:
napravi listu sa pozicijama, pa listu sa tex_coordovima, pa onda posle govori sta cini jedan troguao.
Npr:
f 1/3 2/4 5/8

To znaci da treba nacrtati vertex cija se kordinata nalazi na mestu 1 a kordinata texture na mestu 3. I tako jos 2 puta. Ovo nije problem kada se pravi display lista ali za one 2 tehnike gore jeste. Zato sam ja osmislio neki svoj fajl format, koji dosta manje memorije zauzimao (neki obj fajl. je zauzimao 300 kb a moj fajl nesto vise od 100). To je zato sto on prvo napise vertex u sledecem obliku:
x y z tx ty
gde su tx i ty kordinate za teksture. U slucaju da se prilikom citanja sa modela ista kombinacija od 5 cifara ponovi ona nece biti zapisana u fajl, ali ako je npr. pozicija vertexa ista a tx i ty drugaciji onda hoce. Posle umesto da govori index pozicije i cordinate texture, za jedan trougao je dovoljno reci:
4 2 5
I to ce biti trougao sa tim pozicijama vertex-a. Jedini problem postoji prilikom pravljenja ovog fajl formata, ukoliko se koristi neki model sa dosta vertex-a (preko 1000) konvertovanje u moj format moze da potraje jer za samo pravljenje nisam uradio nikakvu optimizaciju (ovo naravno nema nikakvog uticaja na ponasanje modela u igri), sto mi za sad nije primarni cilj posto mi ne trebaju modeli sa previse detalja. Ima napisana skripta samo za blender, posto sam inace pobornik open-sourca a i dobro znam python programski jezik preko koga se i pisu skripte za njega. Ako si zainteresovan, mogu ti detaljnije objasniti tacan izgled i nacin rada mog formata, i poslatiti skriptu za pravljenje i kod u C++-u za loadovanje istog. Sto se tice navedenih biblioteka javu, sa njima nisam upoznat sobzirom da nisam nikada programirao u javi, ali kada zavrsim neke stvari na kojima sada radim mozda uzmem da naucim javu, pa da se okusam u pravljenju igara za mobilne telefone :)

zchira
17.6.2008, 10:33
Ja nisam neki expert za openGL i sve te zezalice (nego sam proucavao samo one stvari koje mi trebaju za igu), ali mi ovo tvoje deluje zanimljivo, pa kad dodje vreme za optimizaciju i peglanje igre mozda moze da se iskoristi ;) .
Otprilike, jel ovo poenta tvog programa:
- obj fajl je veliki i tebi ne odgovara. -
- Ti ga propustis kroz tvoj program i on ga konvertuje u neki tvoj format.
- Ti iz tvoje igre (programa) mozes da ucitas taj tvoj format.
- To sto je konverzija spora nema nikakvog uticaja na igru jer se ona obavlja samo jednom.
Jesam ja to dobro shvatio?



Jos nesto: zanima me, jel znas kako se animiraju objekti? recimo u blenderu (ili nekom drugom programu) napravim coveka kako trci, kako se to uvozi u program i kako se animira?

Stevvan
17.6.2008, 14:58
- obj fajl je veliki i tebi ne odgovara. -


Nije toliki problem velicina, koliko problem da se od obj fajla napravi VA ili VBO.


- Ti ga propustis kroz tvoj program i on ga konvertuje u neki tvoj format.


Ne propustam .obj fajl, vec .blend posto koristim blender. Inace .obj fajl se moze importovati u blender pa se onda eksportovati u moj format :)


Jos nesto: zanima me, jel znas kako se animiraju objekti? recimo u blenderu (ili nekom drugom programu) napravim coveka kako trci, kako se to uvozi u program i kako se animira?

Iskreno, jos se nisam u praksi suocio sa animacijom, jer jos nameravam da odradim neke stvari, ali inace imam kompletnu zamisao kako to moze da se uradi i ne bi trebalo da bude problem. Postoje 2 nacina:

1) Laksi za isprogramirati, trosi vise memorije, ali je brzi je koristi manje procesora:
Ako za primer uzmem animaciju coveka koji trci, jednostavno treba za svaki frame da se sacuva model, i onda ce na kraju ispasti recimo 16 modela. Ne znam da li si ikada radio sa sprite-ovima, tj animacijom sa obicnim slicicama, ali bi ovo moglo da se odradi na isti nacin. Dakle imas objekat koji sadrzi informacije za ovih 16 modela kojim redom idu (recimo da je to 16 razlicitih display listi, a objekat sadrzi njihove ID-eve). Onda treba da odredis kojom brzinom treba da se odvija animacija. Standardno bi bilo 30 frejmova po sekundi, sto znaci da na svake 0.03333... sekunde treba da se zameni model koji se prikazuje. Dakle u nekoj funkciji objekta koja se stalno poziva u loop-u se vrsi ta provera. Sve sto ti treba je i funkcija za dobijanje vremena sto pretpostavljam da imas. Imas i variablu last_time koju koristis ovako:

if (last_time + 0.03333 < get_time())
{
last_time = get_time();
cm += 1;
if (cm > 15) cm = 0;
}


cm pretsavlja index trenutnog modela (current model) u array-u sa onih 16 modela. U funkciji show koristis glCallList(modeli[cm]). Dakle 'modeli' su ti obican array unsigned int-ova koji oznacaviju odredjenu display listu u ovom slucaju model :) Nadam se da je bilo jasno...

2 ) Nesto teze, ali efikasnije, a svakako i manje memorije zauzima je da se koriste kosti odnosno bones (pretpostavljam da znas kako one funkcionisu u 3d programu tako da se necu puno zadrzavati na njima). Za to bi ti bio potreban samo jedan model, a ostatak je kao u nekom programu za modelovanje, odnosno za svaku kost koja je predstavljena kao duz vezan je odredjeni broj vertexa, na osnovu njenog polozaja u prostoru se rasporedjuju i vertexi. Onda je potrebno imati informaciju samo o pomeranju kosti a ne svih vertexa (jer se njihove pozicije izracunavaju), sto je svakako mnogo manje memorije :)

Btw, ja bih verovatno odabrao mesavinu ova 2 resenja. Tacnije, fajlove bih skladistio kao za 2 slucaj, medjutim, prilikom ucitavanja bih napravio vec gotove modele na memoriji graficke karte koje bih posle koristio u igri kao u 1 slucaju :)

zchira
17.6.2008, 18:33
Hvala na detaljnom odgovoru :aplauz:

I meni je pao na pamet prvi nacin za animiranje ali sam pretpostavljao da postoji neko elegantnije resenje. Inace, da, radio sam sa sprajtovima. Na sajtu moje igre moze da se skine stara verzija igre koja je 2D i koja koristi sprajtove :)

Sto se tice drugog nacina (ili kombinacije prvog i drugog) deluje kao zanimljivo resenje, pa cu se pozabaviti time (kad budem imao vremena).

E, sad, ako te ne mrzi da mi kazes prednosti/mane VA i VBA u odnosu na display liste, ili jos bolje daj neke linkove gde mogu da se upoznam s tim.

Stevvan
17.6.2008, 20:20
http://www.songho.ca/opengl/gl_vertexarray.html
http://www.atomictiger.net/articles/using-opengl-vbos.html

Prvo nauci dobro vertex array, posto ti je vbo ustvari slicna stvar sto se tice samog izgleda koda, i radi po slicnom principu jedino sto se tada podatci o vertexima nalaze u grafickoj memoriji. Ako ti bude bila potrebna neka pomoc, javi. Sad nisam imao dovoljno vremena da trazim, ali pokusaj da nadjes neki tutorial ili article, gde se koriste strukture za vertex.

zchira
22.9.2008, 10:55
Evo, posle par meseci rada, lavirinto 3d je skoro spreman!

Sva logika je isprogramirana, i ostalo je samo da se izdizajniraju nivoi.
Postavljen je novi sajt
http://lavirinto3d.sourceforge.net
na kom su samo screenshot-i...
A uskoro ce biti i postavljena verzija za download.

Red Dragon
22.9.2008, 11:01
Ne izgleda lose. Nisam imao prilike da igram Zenji, mada je ideja dobra. Samo napred!:tapsh:

zchira
3.10.2008, 0:37
S ponosom vas obavestavam da je
Lavirinto3d (v0.6.0) postavljen za download!!!!
Na http://lavirinto3d.sourceforge.net
se nalaze novi screenshot-ovi, i link za download.
Sve pohvale/primedbe/sugestije su dobrodosle.

(imajte u vidu da je ovo tek prva verzija i da ima dosta toga da se jos doradi)

EclipsE
3.10.2008, 14:10
Evo sad sam se malo igrao, extra je! Svaka chast :)

Ketchua
5.10.2008, 20:59
ahem...aplauz za igru, pleni svojom jednostavnoscu, prijatna je na oko, a za izbor muzike desetka...samo su malo losi snimci...:) svaka cast, samo nastavi sa radom...:aplauz:

zchira
6.10.2008, 0:15
hvala drugari :)
Evo jedan review igre:

http://freegamer.blogspot.com/2008/10/lavirinto-3d-060-balazar-3-01-openanno.html

Ovih dana cu vec da nastavim sa usavrsavanjem...

Sta mislite, dal je igra dostojna da se pojavi mali (najmanji) tekst o njoj u Svetu Kompjutera? :-)

Patton
6.10.2008, 0:22
Meni nece da se startuje na WinXP :(

Ketchua
6.10.2008, 0:31
@patton: ni meni nije htela, probaj sa poslednjom verzijom jave...worked for me...:)

@zchira: pogledaj kakav sve bullshit izlazi i biva opisivan zadnjih meseci...a ovo je retrospektiva na good ol' days, i jos je nase gore list...:) steta pa se mi ne pitamo sta ce se opisati, a sta ne...

zchira
9.10.2008, 12:15
Evo jos jedan review na shpanskom:
http://www.linuxjuegos.com/2008/10/09/lavirinto-3d-06/

Evo i prevoda (uz pomoc google translate) na engleski:
http://translate.google.com/translate?u=http%3A%2F%2Fwww.linuxjuegos.com%2F200 8%2F10%2F09%2Flavirinto-3d-06%2F&hl=en&ie=UTF-8&sl=es&tl=en

Stevvan
9.10.2008, 13:45
Nekoliko kritika sa strane programerskog dela:

Prva stvar koja bi trebala da se resi jeste pitanje velicine ekrana. S obzirom na samu strukturu igre mislim da je prilicno izvodljivo a pritom i zahvalno da se napravi da se velicina ekrana bude prilagodjava igracu (da prozoru moze da se menja velicina preko resize-a). Ovo je recimo bio problem kod mene jer mi je rezolucija 1280 x 800 a cini mi se da je visina prozora nesto veca od 800 (koristim ubuntu)

Sledece se odnosi na glavni meni:
Na pravougaoniku na kome je zalepljena tekstura lavirinta se po obodima koji treba da budu prazni da primeti tanka linija sto vizuelno ume da iritira. Da bi resio ovaj problem dovoljno je da ti svi pikseli na ivicama slike budu skroz providni, tj da alpha bude 0.
Druga stvar vezana za isti pravougaonik je da male lopte prolaze kroz providan deo (a pretpostavljam da treba da se vide i dalje bez obzira sto su prosle. Koliko se secam, za to je bitan red renderovanja i da ti blend f-ja bude glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) sto pretpostavljam da je vec tako. Bitno je da prvo renderujes sve objekte koji su prozirni pa tek onda one ne providne (u ovom slucaju prvo pravougaonik sa texturom lavirinta, pa potom male loptice)

Deluje mi da nisi koristio .ttf fontove vec si koristio gotove slike teksta, sto dovodi da .exe bude veci. Na nehe-ovom sajtu imas tutorial kako da ucitavas .ttf, sto ti verovatno moze pomoci ako sam upravu u vezi ovoga, mada bi me cudilo da ta javina biblioteka nema vec neki nacin za ucitavanje fontova.

Sto se tice rada same igre nemam nekih vecih zamerki sem one koje sam vec pomenuo a odnosi se na okretanje lopte (cini mi se da ovo ipak mozes i da resis bez engine-a za fiziku a da opet ispadne lepo :) ) Takodje bi trebalo malo usporiti okretanje polja jer mi se desi da prilikom igranja zarotiram polje vise nego sto sam zeleo sto u nekim situacijama moze da me kosta gubitka zivota :)

Sto se tice AI-a preporucio bih ti da pogledas Astar algoritam.

S obzirom na mali broj tehnickih nedostataka, mislim da oni mogu u eventualno kratkom roku biti nadoknadjeni, tako da tu ne bi trebalo biti nekih vecih problema. Posle ovoga najveci izazov postaje grafika.

Inace kao sto ti je vecina rekla, ideja je super, nivoi su lepo osmisljeni, a dobar nivo cesto moze da iziskuje vise napora da se osmisli nego sam rad igre, tako da su nivoi za svaku pohvalu, jer je postignuta smisao igre odnosno da treba razmisljati da bi se presao nivo :) Sve pohvale sa te strane :)

Dakle kao sto vidis, kada napravis 90% igre, ostaje da se odradi sledecih 90% :D

zchira
9.10.2008, 17:36
Hvala za dobronamerne kritika.
Uglavnom sam svestan svih nedostataka koje si naveo:

- tekstura kojoj se vide obodi - primetio sam, al nisam stigao da sredim to jer sam zurio da je postavim za download. Ipak hvala za ove tips&tricks za renderovanje. Inace to je trenutno samo tekstura koja ima blend delove, a planiram da stavim bas modele polja.... onda i ta ploca na kojoj je zalepljena textura nece piti tanka kao papir.
- i za male lopte koje prolaze sam primetio, ali nisam pokusao da resim problem - a pitanje dal bi i znao tako da opet hvala za savete... mada kad stavim da ta ploca bude model a ne tekstura onda ce i to da se resi...
-nisam koristio ttf fontove.. imam bitmape sa fontovima (512x512 i 256x256)...mislim da to i nije tako strasno sto se ne koriste ttf...
- sto se tice okretanja lopte... to bi bilo dobro da odradim... i prilicno je izazovan problem..a sto se tice brzine rotacije polja, jos mi se ljudi zalilo na taj problem... pa mogu da ostavim brzinu kretanja, a da jedan pritisak na taster okrece samo jednom polje... a ako se drzi dalje da se nista ne desava...a mogu i da ga usporim.... videcu..
- sto se tice inteligentnih monstera, i to je u planu... arhitekturom sam predvideo postojanje vise vrsta protivnika koji bi se lako pravili (izvodjenjem iz klase AbstractMonster)... tako da ce to biti u nekoj narednoj verziji, mada je igra i ovako teshka (za dosta ljudi koji su probali a koje znam). Inace, upoznat sam sa a* i slicnim algoritmima (slusao sam na faxu :-) )


Sve u svemu, vecina zamerki ce biti resena za neku narednu verziju...
Jos jednom hvala i za kritike i pohvale :)

Stevvan
9.10.2008, 18:09
-nisam koristio ttf fontove.. imam bitmape sa fontovima (512x512 i 256x256)...mislim da to i nije tako strasno sto se ne koriste ttf...

Aha pa mogu i bitmap fontovi :) Samo pazi da i za njih uradis ovo sto sam ti rekao za teksturu jer se na nekim slovima isto pojavljuju linije po obodu.


- sto se tice okretanja lopte... to bi bilo dobro da odradim... i prilicno je izazovan problem..)


Razmisljao sam o ovome, ja mislim da bi bilo dovoljno da kazes da se lopta okrece oko vektora koji je normalan na vektor kretanja lopte i paralelan sa povrsinom. Probaj tako pa javi rezultate, ne bi trebalo da je tesko dobiti taj vektor. Vec u glavi vidim da je taj vektor vektorski prozivod vektora kretanja i vektora koji je normalan na povrsinu (ako je y ka gore onda je vektor normalan na povrsinu 0,1,0) :)



Sve u svemu, vecina zamerki ce biti resena za neku narednu verziju...
Jos jednom hvala i za kritike i pohvale


Nema na cemu, drago mi je kad vidim da mogu da pomognem onima koji se trude, a pogotovo kada je njihov proizvod primenljiv na vise platformi :)

zchira
10.10.2008, 17:13
@Stevvan

Jel mozes da mi kazes gde mogu da nadjem primere kako se koriste ttf fontovi?
Treba nam na poslu pa sam se setio da si mi rekao da je moguce koristiti ttf fontove...

Gledao sam na nehe, ali nisam nashao neshto konkretno. Tj. JOGL + ttf...

Stevvan
10.10.2008, 17:40
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=43

Inace lekcija ima gresku ovde:

for(int j=0; j <height;j++) {
for(int i=0; i < width; i++){
expanded_data[2*(i+j*width)]= expanded_data[2*(i+j*width)+1] =
(i>=bitmap.width || j>=bitmap.rows) ?
0 : bitmap.buffer[i + bitmap.width*j];
}
}

trebalo je ovako:

for(int j=0; j <height;j++) {
for(int i=0; i < width; i++){
expanded_data[2*(i+j*width)]= 255;
expanded_data[2*(i+j*width)+1] =
(i>=bitmap.width || j>=bitmap.rows) ?
0 : bitmap.buffer[i + bitmap.width*j];
}
}


Bug je bio u tome da ako se koristi neka svetlija nijansa za boju teksta, pojavljuju se crne mrljice na slovima zbog toga sto se za boju i providnost pixela koristila ista vrednost. Cini mi se da ima neki memory leak (ne poziva se FT_Done_Glyph) nisam siguran proveri. Ja sam malo prepravio kod (ispravio bugove, neke stvari koje mi nisu bile potrebne izbacio, i dodao da se moze proveriti duzina teksta :) Tako da ako ce ti koristiti evo ti i moj kod 24511

Dakle ovde je pokazana integracija freetype biblioteke i OGL-a, za neke detalje oko ove biblioteke mozes pogledati na freetype sajtu, ja nisam mnogo cackao oko ovoga, posto me bas i ne zanima kako funkcionisu fontovi, vec samo da mogu da ih koristim :opanachke

zchira
10.10.2008, 21:00
Hvala za opsiran odgovor.
Ipak, meni treba resenje za javu (jogl), a nisam siguran da freeType postoji za javu...

Stevvan
11.10.2008, 0:52
A steta, ne znam koliko je to tesko ali mi ne izgleda neizvodljivo da se napise mala biblioteka za ucitavanje fontova u c/c++, za javu. Pretpostavljam da biblioteke za ovaj jezik mogu da se pisu u njima, sobzirom da je u njima i java napisana (Takav je slucaj recimo za python).

zchira
11.10.2008, 18:33
Ok, prenecu kolegama na poslu pa ako im nesto znaci neka pokusaju :-)

Nego, da se vratim na lavirinto: poceo sam da se mlatim sa problemom kotrljanja loptice.

Sad cu malo opsirnije da opisem problem:
Z osa je uspravna i oko nje ne treba da se vrsi rotacija pri kotrljanju.
osu rotacije dobijam kao sto si mi reko mnozenjem uspravnog vektora (paralelnog sa z osom) i vektora pravca u kom se krece lopta.
I to je OK.

Sam game loop ima update fazu i render fazu.
U update fazi se u zavisnosti od akcija igraca azuriraju koordinate lopte i uglovi rotacije rotateX i rotateY tj. ugao rotacije oko x i y ose.
Kad se lopta krece levo/desno rotacija se vrsi oko y ose, a kad se krece gore/dole rotacija se vrsi oko x ose.

Ako se krecemo malo levo posle nekog vremena lopta je zarotirana oko y ose i rotateY iznosi neko alfa (a rotateX je nula posto se nismo kretali gore/dole).

Sada krenemo na dole i rotateX pocne da se menja. sada su oba ugla - rotateX i rotateY razliciti od nule. rotateX = alfa, rotateY = beta.

Pri renderovanju prvo radim glRotate za y osu, pa glRotate za x osu.

Medjutim ako se krecem prvo vertikalno, pa horizontalno ovo ne funkcionise... verovatno zbog toga sto se ne dobija isti rezultat za
glRotate Y
glRotate X

u odnosu na
glRotate X
glRotate Y

plus. kada se lopta ne krece vrednosti rotateX i rotateY se ne menjaju ali su generalno razlicite od nule... i tu se isto javlja problem kako postaviti polozaj lopte u pravi polozaj...
ne znam koliko sam lepo objasnio...

U glavnom, moguce je da pravim neku gresku u samom konceptu... mozda se to radi skroz drugacije...svrljao sam malo po netu ali nisam nasao nesto sto bi mi pomoglo...

Stevvan
11.10.2008, 19:53
Problem je u rotaciji najbolje cu ti objasniti slikom:

24517

Kao sto znas u opengl-u se ne rotira objekat vec ceo prostor. Dakle rotaciom oko y ose za ugao alfa rotiramo u stvari x i z (sivom bojom su oznaceni) i to je uredu. Medjutim kada hoces da rotiras oko x ose ti ustvari rotiras oko tog zarotiranog vektora, a potrebna nam je rotacija oko vektora oznacenog zelenom bojom. Da bi smo dobili taj vektor treba upotrebiti malo trigonometrije sto se vidi na ostatku slike. Nadam se da je sada jasnije :) Dakle oko zelenog vektrora x treba posle zarotirati za ugao beta, a taj vektor je kao sto vidis iz formule cos(alpha), 0, sin(alpha). U ogl-u bi to izgledalo ovako:


glRotatef(alfa, 0, 1, 0);
glRotatef(beta, cos(alfa), 0, sin(alfa));


Nisam testirao ali trebalo bi da je tako, pa javi rezultate...

zchira
11.10.2008, 21:44
Ne pomaze...
Tj. kad primenim tvoje resenje isto se desava da se poremete (izrotiraju) ose...

Pokusao sam i da budzim ovako:

if (vertikalnoKretanje) {
GL11.glRotatef(rotationX, rotateVectorX[0], rotateVectorX[1], rotateVectorX[2]);
GL11.glRotatef(rotationY, rotateVectorY[0], rotateVectorY[1], rotateVectorY[2]);
} else if (horizontalnoKretanje) {
GL11.glRotatef(rotationY, rotateVectorY[0], rotateVectorY[1], rotateVectorY[2]);
GL11.glRotatef(rotationX, rotateVectorX[0], rotateVectorX[1], rotateVectorX[2]);
}else{
???
}


dakle ako se krecemo vertikalno idemo prvo na rotaciju oko x ose pa posle oko y i obrnuto...
Na taj nacin se lopta ovek lepo okrece, ali se dolazi do problema kad lopta stane (u kodu oznaceno sa '???'). tada se lopta ne okrece uopste tj. stoji u default polozaju pa izgleda kao da secne... pokusao sam tu da stavim tvoj kod, ali ni to nije pomoglo.

Stevvan
12.10.2008, 16:49
Hm i mene je ovo prilicno zaintrigiralo, ali sam uspeo da resim problem. Fora je u pogodite cemu, matematici :)
Tacnije za ovakav problem koristi se Quaternion Rotation. Razumem ishode ove rotacije, tj. umem da je upotrebim, ali sta se tacno desava, to je vec druga stvar. Nisam pokusavao da razumem princip rada, sobzirom da jos ni matrice ne poznajem dobro, vec sam mehanicki sastavio kod. Ono sto je vazno je da on radi svoj posao tj ono sto ti treba :) Dakle potrebno je da pretocis ovaj kod u javu sto ne verujem da ce ti biti neki problem:


struct Quat
{
float x, y, z, w;
};

void MultQuat(Quat *dst, Quat *a, Quat *b)
{
float t[8];

t[0] = (a->w + a->x) * (b->w + b->x);
t[1] = (a->z - a->y) * (b->y - b->z);
t[2] = (a->x - a->w) * (b->y + b->z);
t[3] = (a->y + a->z) * (b->x - b->w);
t[4] = (a->x + a->z) * (b->x + b->y);
t[5] = (a->x - a->z) * (b->x - b->y);
t[6] = (a->w + a->y) * (b->w - b->z);
t[7] = (a->w - a->y) * (b->w + b->z);

dst->w = t[1] + ((-t[4] - t[5] + t[6] + t[7]) * 0.5);
dst->x = t[0] - (( t[4] + t[5] + t[6] + t[7]) * 0.5);
dst->y = -t[2] + (( t[4] - t[5] + t[6] - t[7]) * 0.5);
dst->z = -t[3] + (( t[4] - t[5] - t[6] + t[7]) * 0.5);
}

void NormaliseQuat (Quat *dst, Quat *src)
{
float d = src->x*src->x+src->y*src->y+src->z*src->z+src->w*src->w;

d = (d > 0) ? (1 / sqrt ( d )) : 1;

dst->x = src->x*d;
dst->y = src->y*d;
dst->z = src->z*d;
dst->w = src->w*d;
}

void AngleAxisToQuat(Quat *q, float angle, float x, float y, float z)
{
float temp_angle = angle*0.01745/2.0;
q->w = cos(temp_angle);
q->x = sin(temp_angle)*x;
q->y = sin(temp_angle)*y;
q->z = sin(temp_angle)*z;
}

void RotQuat (Quat *dst, float angle, float x, float y, float z)
{
Quat q;
AngleAxisToQuat(&q, angle, x, y, z);
Quat r;
r.x = dst->x;
r.y = dst->y;
r.z = dst->z;
r.w = dst->w;
MultQuat(dst, &r, &q);
NormaliseQuat(dst, dst);
}

void QuatToMatrix(Quat *q, float matrix[])
{
float two_xx = q->x * (q->x + q->x);
float two_xy = q->x * (q->y + q->y);
float two_xz = q->x * (q->z + q->z);

float two_wx = q->w * (q->x + q->x);
float two_wy = q->w * (q->y + q->y);
float two_wz = q->w * (q->z + q->z);

float two_yy = q->y * (q->y + q->y);
float two_yz = q->y * (q->z + q->z);

float two_zz = q->z * (q->z + q->z);

matrix[0] = 1 - (two_yy+two_zz);
matrix[1] = two_xy-two_wz;
matrix[2] = two_xz+two_wy;
matrix[3] = 0;
matrix[4] = two_xy+two_wz;
matrix[5] = 1 - (two_xx+two_zz);
matrix[6] = two_yz-two_wx;
matrix[7] = 0;
matrix[8] = two_xz-two_wy;
matrix[9] = two_yz+two_wx;
matrix[10] = 1 - (two_xx+two_yy);
matrix[11] = 0;
matrix[12] = 0;
matrix[13] = 0;
matrix[14] = 0;
matrix[15] = 1;
}


Za razliku od ovoga koriscenje je prilicno jednostavno:


Quat qrot;
qrot.x = qrot.y = qrot.z = 0;
qrot.w = 1;

^Ovo je neka default vrednost za Quat

Prilikom kretanja lopte dovoljno je da kazes, RotQuat(&qrot, angle, x, y, z), i dobices rotaciju oko [x,y,z] vektora za angle stepeni. Dakle quaternion ti omogucava da se rotira oko nekog vektora bez rotacije celog prostora.

Da bi sve ovo primenio na ogl, radis sledece

float matrix[16];
glPushMatrix();
QuatToMatrix(qrot, matrix);
glMultMatrixf(matrix);
Nacrtaj objekat;
glPopMatrix();

Eto to je sve :) Inace koristio sam kod iz plib-a tacnije sg biblioteke, i neke sajtove da bih sastavio ovo.

zchira
12.10.2008, 21:17
Hvala, majstore!
Radi kao ludo!

Uvek sam znao da je matematika majka, al mi to nije bilo dovoljno da je preterano uchim (iako sam na faksu imao 4 matematike) :-)

Sad izgleda profi.
Dobijas mesto u "Special thanx" u igri :tapsh::tapsh::tapsh::tapsh:

Stevvan
13.10.2008, 16:30
Ma opusteno i meni je koristilo da nesto novo naucim :) Inace savet za tebe i za sve koji hoce malo bolje da razumeju kako sta radi, i na taj nacin izbegnu razne zabune, odlican article o matricama http://www.morrowland.com/apron/article/technical/matrix/index.php

zchira
9.11.2008, 22:27
Nova verzija igre Lavirinto3d je upravo izašla.
Više informacija možete saznati na http://lavirinto3d.sourceforge.net

A ovde (http://www.youtube.com/watch?v=N78rJJeeW_s)možete pogledati video klip.

sasha vukelic
11.11.2008, 16:07
ebes ga, sta da kazem, nego:'java' is not recognized as an internal or external command,
operable program or batch file.

zchira
11.11.2008, 16:56
Ako pogledas sysrem requerenments u readme fajlu (a i na sajtu stoji) videces da je lavirinto3d pisan u javi i da zahteva da imas instaliran jre (jave runtime environment) na racunaru.
JRE mozes skinuti na:
http://www.java.com/en/download/index.jsp

;)

sasha vukelic
12.11.2008, 9:27
jest to je ocigledno, nego nisam se dobro izrazio: ne volim javu ;)

zchira
12.11.2008, 10:14
:D:D
Pa jbg, ni ja ne volim windows... al moram na njemu da zaradjujem za lebac :dedica:

A jesi uprkos tome sto ne volis javu probao lavirinto3d?
I kako ti se cini?
(kad se pokrene i ne vidi se da je pisan u javi :p)

sasha vukelic
12.11.2008, 13:57
probao sam kod kolege i kod njega se vidi da je pisan u javi :D

zchira
12.11.2008, 14:13
Vidi stvarno...
Mada, vista... piece of crap :-)
Igra je pre svega pravljena za linux :-P

Mada , mislio sam da kad se pokrene ne vidi se da je pisana u javi :D
A ako se ne pokrene (kao u tvom slucaju) onda se vidi :o

Jbg... nije testirano na visti... pokusacu da ispravim to nekako...

sasha vukelic
12.11.2008, 14:17
nisam siguran da je do viste

moze biti do graficke, npr. neka greska tipa:
This device does not support 32-bit indices.
Use IndexElementSize.SixteenBits
or a type that has a size of two bytes.

zchira
12.11.2008, 14:40
moguce da si u pravu... mada mislim da mi se jos neko zalio da ima problema sa vistom...
I, jesi uspeo negde, nekako da je pokrenes?

sasha vukelic
12.11.2008, 15:09
trenutno sam na poslu, a posto svi imamo iste konfiguracije, znaci svima nam izbacuje tu istu gresku... kad navratim do buraza probacu, ako se sjetim :opanachke