|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Opengl, matrici di trasformazione
Sto facendo un mini space invaders per smanettare un po' con opengl (in c), in vista dell'esame di grafica computazionale. Il problema è che non riesco a creare il proiettile nella stessa posizione della navicella e nello stesso tempo a visualizzarlo su un altro sistema di riferimento. Come faccio a procurarmi la matrice di trasformazione della navicella in modo da moltiplicarla col quella del proiettile ?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
Innanzitutto: stai lavorando in 2d o 3d? Il proiettile deve avere una sua matrice indentità per renderizzarlo nella scena. poi non si capisce cosa vuoi fare: vuoi renderizzare un proiettile insieme alla navicella oppure vuoi che il proiettile vada contro la navicella? Se vuoi che il proiettile sia alla stessa posizione, in world space, della navicella devi assegnare al proiettile le stesse coordinate. poi come hai creato la navicella e il proiettile?... l'hai fatti come mesh.x? ti posso aiutare nel limite ma considera che uso directx ma se sono calcoli vettoriali ti posso aiutare ma devi spoiegare bene cosa vuoi fare. |
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
Quote:
allora 2d o 3d? come sono fatti la navicella e il proiettile in .x (mesh) oppure sono texture per il 2d? |
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Quote:
Lavoro in 2D, la mia navicella è un triangolo bidimensionale. Vorrei che la navicella sparasse un proiettile(un triangolino) da un vertice del triangolo. Il mio problema sta nel fatto che non riesco a trattare navicella e proiettile come due entità diverse e nello stesso tempo rappresentarle in sistemi di riferimento diversi. (il proiettile deve avere come sistema di riferimento inziale, il sistema di riferimento della navicella al momento dello sparo) |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
la navicella deve avere coordinate xy per esempio pos_navicella(10, 28) non devi far altro che dare le coordinate al proiettile a pos_proiettile(10, 28) poi muovi il proiettile sulla y pos_proiettile(x,y)+=0.1f Considera che la navicella si muove sulla x ora nel momento in cui spari visualizzi il proiettile alle coordinate di dove si trovava la navicella al momento dello sparo per esempio (13,28) ora muovi e renderizzi il proiettile a coordinate iniziali (13,28) aumentando solo la y tipo: pos_proiettile(x,y)+=0.1f //y=28.01 pos_proiettile(x,y)+=0.1f //y=28.02 pos_proiettile(x,y)+=0.1f //y=28.03 pos_proiettile(x,y)+=0.1f //y=28.04 pos_proiettile(x,y)+=0.1f //y=28.05 ecc ecc se c'è una collisione con astronave nemica (collisione) allora esegui l'esplosione facendo sparire l'astronave colpita (metti a 0 i.ma posizione della matrice) se è simile a space invader 2d Edit: ogni oggetto deve avere la sua matrice identità come quella della navicella per essere renderizzato che stiano nello stesso sistema di riferimento. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Il mio problema non sono le posizioni, ma le matrici in sè, non capisco nè come utilizzarle nè come ottenerle.
Premetto che per ora la mia navicella si muove in questo modo: se premo 'w' o 's' : traslo sist. rif. su asse y se premo 'a' o 'd' : ruoto sist. rif su asse z se non tocco nulla la navicella resta ferma. Fin qui nessun problema, il problema nasce quando devo inserire il proiettile. Come faccio ad adottare per il proiettile lo stesso sistema di riferimento della navicella ? Con glPushMatrix() e glPopMatrix() riesco a mettere da parte la matrice della navicella, e a operare su una sua copia, ma il proiettile a quel punto diventa parte del sistema di riferimento della navicella. Invece vorrei fare così: salvarmi la matrice della navicella, moltiplicare quest'ultima per la matrice identità del proiettile, disegnare il proiettile. Forse non è questo il metodo esatto ? |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
la navicella ha la sua matrice e non serve moltiplicarla o averne una copia. Non puoi assegnare la matrice della navicella al proiettile solo per dargli le stesse coordinate, il proiettile si muoverebbe insieme alla navicella. il proiettile deve avere, come la navicella, una sua propria matrice identità in directx per esempio si usa questo per le matrici identità (per farti capire): D3DXVECTOR3 Position(0,0,0) D3DXVECTOR3 posNavicella(30,0,18) D3DXMATRIX Navicella D3DXMATRIX proiettile D3DXMatrixTranslation(&Navicella, posNav.x, posNav.y, posNav.z); SetTrasform(Navicella) //renderizzo a video /* if sparo prendo la posizione della navicella e la passo a proiettile Position=posNav */ if(sparo){ Position.y+=0.1f; D3DXMatrixTranslation(&proiettile, Position.x, Position.y, Position.z); SetTrasform(proiettile) //renderizzo a video } come vedi devi avere 2 matrici una per la navicella e una per il proiettile eccole: D3DXMATRIX Navicella D3DXMATRIX proiettile per il proiettile invece puoi fare delle copie ma riguarda solo l'immaggine e la copia ha sempre una matrice identità propria es: D3DXVECTOR3* Position[8] //proiettili puoi usare la stessa matrice per renderizzare il triangolo del proiettile così: D3DXMatrixTranslation(&proiettile, Position[0].x, Position[0].y, Position[0].z); SetTrasform(proiettile) //renderizzo a video D3DXMatrixTranslation(&proiettile, Position[1].x, Position[1].y, Position[1].z); SetTrasform(proiettile) //renderizzo a video D3DXMatrixTranslation(&proiettile, Position[2].x, Position[2].y, Position[2].z); SetTrasform(proiettile) //renderizzo a video ...questi sono 3 proiettili sparati e visualizzati dalla stessa matrice identità ma le loro coordinate sono differenti in definitiva i 3 proiettili verranno renderizzati con la stessa immagine ma a coordinare differenti tutti 3 insieme. spero di essere stati chiaro. questo con le dx ma con le opengl la tecnica è la stessa cambiano solo le istruzioni. ciao Ultima modifica di okay : 03-12-2007 alle 17:37. |
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Quote:
Quote:
Grazie per l'aiuto, appena risolvo ti dico. Ultima modifica di Maverick18 : 03-12-2007 alle 17:44. |
||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
primo triangolo renderizzato (navicella) glBegin (GL_TRIANGLES); glTranslatef (nx, ny, nz); //posizione glVertex3fv (&Data.Verts.Pos); glEnd (); secondo triangolo renderizzato (proiettile) glBegin (GL_TRIANGLES); glTranslatef (px, py, pz); //posizione glVertex3fv (&DataVerts.Pos); glEnd (); |
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Associa ad ogni oggetto una sua matrice che ne definisce l'orientamento e la posizione nel mondo. Se vuoi l'interpretazione matematica, stai costruendo una matrice che porta dal sistema di riferimento locale dell'oggetto al sistema di riferimento del mondo. Questa e' la matrice che OpenGL o D3D "usera'" in qualche modo per disegnare l'oggetto. Quindi la tua navicella avra' una matrice di trasformazione che chiamiamo N. Ora vuoi sparare un proiettile che vuoi disegnare, per fare un esempio, mezzo metro di fronte alla navicella. Stai quindi lavorando in questo caso nel sistema locale della navicella, e devi calcolare una matrice che porta dal sistema locale del proiettile (che e' locale rispetto alla navicella) al sistema di riferimento del mondo. Prima matrice locale del proiettile: P1 = matrice di traslazione di un metro in avanti (decidi tu l'asse) N = matrice di trasformazione della navicella che mantieni da qualche parte nel tuo codice (non te la deve restituire OpenGL, la memorizzi tu nell'oggetto navicella) La matrice di trasformazione P da associare al proiettile diventa: P = P1 * N; Passi la matrice P a OpenGL ed hai finito. Il procedimento generale e' che ogni volta che passi da un sistema locale ad un altro, premoltiplichi la matrice di trasformazione. Nota che il procedimento e' indipendente dall'essere in 2D o in 3D: in 2D hai solo un asse in meno. Quote:
Questo non e' D3D. SetTransform non renderizza nulla
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:58.




















