Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-12-2007, 16:28   #1
Maverick18
Senior Member
 
L'Avatar di Maverick18
 
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 ?
Maverick18 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 16:33   #2
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
Potresti prendere spunto dal codice di Space Invaders GL.

variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 16:42   #3
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
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 ?
la matrice di trasformazione della navicella e del proiettile non centra nulla.

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.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 16:47   #4
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
...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...
il sistema di riferimento deve essere lo stesso se no o la navicella o il proiettile saranno in posizioni assurde.

Quote:
...Come faccio a procurarmi la matrice di trasformazione della navicella in modo da moltiplicarla col quella del proiettile ?...
Se la navicella è renderizzata a video nello spazio dovresti sapere la sua matrice identità e di trasformazione a meno che stai lavorando su codice non tuo.

allora 2d o 3d?

come sono fatti la navicella e il proiettile in .x (mesh) oppure sono texture per il 2d?
okay è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 16:47   #5
Maverick18
Senior Member
 
L'Avatar di Maverick18
 
Iscritto dal: Aug 2005
Messaggi: 2020
Quote:
Originariamente inviato da okay Guarda i messaggi
la matrice di trasformazione della navicella e del proiettile non centra nulla.

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.
Mi sono spiegato decisamente male.
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)
Maverick18 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 16:57   #6
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
Mi sono spiegato decisamente male.
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)
allora 2d.

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.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 17:12   #7
Maverick18
Senior Member
 
L'Avatar di Maverick18
 
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 ?
Maverick18 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 17:31   #8
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
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 ?
te lo ripeto:
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.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 17:40   #9
Maverick18
Senior Member
 
L'Avatar di Maverick18
 
Iscritto dal: Aug 2005
Messaggi: 2020
Quote:
Originariamente inviato da okay Guarda i messaggi
te lo ripeto:
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.
Non voglio assegnarla, vorrei solo moltiplicarla per ottenere la posizione della navicella.
Quote:
in directx per esempio si usa questo per le matrici identità (per farti capire):
questo con le dx ma con le opengl la tecnica è la stessa cambiano solo le istruzioni.
Sì, questo ragionamento l'avevo fatto anch'io, ma per ora non ho trovato istruzioni per farlo allora mi sono buttato sulle matrici. Sto facendo un po' di confusione
Grazie per l'aiuto, appena risolvo ti dico.

Ultima modifica di Maverick18 : 03-12-2007 alle 17:44.
Maverick18 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 17:51   #10
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
Non voglio assegnarla, vorrei solo moltiplicarla per ottenere la posizione della navicella.


Sì, questo ragionamento l'avevo fatto anch'io, ma per ora non ho trovato istruzioni per farlo allora mi sono buttato sulle matrici. Sto facendo un po' di confusione
Grazie per l'aiuto, appena risolvo ti dico.
in opengl si usa:

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 ();
okay è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 18:01   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Maverick18 Guarda i messaggi
Invece vorrei fare così:
salvarmi la matrice della navicella, moltiplicare quest'ultima per la matrice identità del proiettile, disegnare il proiettile.
Il problema e' abbastanza semplice ed e' indipendente dalla libreria che usi o dall'essere in 3D o 2D. E' un semplice problema di geometria.

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:
Originariamente inviato da okay Guarda i messaggi
D3DXMatrixTranslation(&Navicella, posNav.x, posNav.y, posNav.z);
SetTrasform(Navicella) //renderizzo a video
Uh?!
Questo non e' D3D. SetTransform non renderizza nulla
fek è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2007, 19:12   #12
Maverick18
Senior Member
 
L'Avatar di Maverick18
 
Iscritto dal: Aug 2005
Messaggi: 2020
Quote:
Originariamente inviato da fek Guarda i messaggi
Il problema e' abbastanza semplice ed e' indipendente dalla libreria che usi o dall'essere in 3D o 2D. E' un semplice problema di geometria.

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.
Ok, la spiegazione l'ho capita, sono gli argomenti che sto affrontando anche in robotica. E' la parte in grassetto che non comprendevo, pensavo che la matrice mi venisse fornita direttamente da opengl. Quindi le matrici le devo implementare io, poi le elaboro con le varie chiamate. Appena ho tempo ci provo.
Maverick18 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Hong Kong sempre più aperta alle ...
E-Bike e Cyber Monday, non si scherza: s...
Un supervulcano potrebbe cambiare il fut...
Questa scheda video cinese non ha una GP...
Com'è fatto il cloud... di person...
Windows 11, l'icona per la password non ...
Stabilimento Beko di Siena: fine delle a...
Gillette City Winter Edition: la nuova m...
Ultimo giorno di Black Friday: ecco le o...
Le pubblicità stanno arrivando su...
Ultimo giorno di Black Friday: droni DJI...
Elon Musk: 'AI e robotica sono la chiave...
Wi-Fi superveloce anche in giardino? FRI...
Ogni richiesta a ChatGPT consuma quanto ...
Nuova Renault Clio, primo test: ottimo f...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v