Visualizzazione Stampabile
-
Riferimento: domanda su XNA (c#)
Ciao, non sono molto esperto di xna (preferisco lavorare con il c++...) però quello che ti serve a te è creare un viewing frustum (composto dall'intersezione di 6 piani) e farlo gestire dalla camera. Googlando mi è uscito questo risultato, spero ti possa essere utile.
Citazione:
Originariamente Scritto da Toty_
Forse non hai letto con attenzione tutta la discussione perchè, a parte questo dubbio su directx o opengl, io sto cercando di capire perchè per ruotare una visuale serve creare tre vettori che rappresentano le righe della matrice di rotazione (e comunque adesso so bene come si dispongono gli elementi all'interno di una matrice per traslare o ruotare).
Si estraggono i vari valori della matrice a seconda del sistema usato, poichè le directx sfruttano un piano cartesiano orientato a destra mentre le opengl uno orientato a sinistra.
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Gr1ph00n
Ciao, non sono molto esperto di xna (preferisco lavorare con il c++...) però quello che ti serve a te è creare un viewing frustum (composto dall'intersezione di 6 piani) e farlo gestire dalla camera. Googlando mi è uscito
questo risultato, spero ti possa essere utile.
Si estraggono i vari valori della matrice a seconda del sistema usato, poichè le directx sfruttano un piano cartesiano orientato a destra mentre le opengl uno orientato a sinistra.
Gr1ph00n, grazie per l'interessamento ma (non voglio sembrare troppo pignolo) il link che mi hai suggerito parla in sostanza del metodo projection.
I miei dubbi non derivano dai metodi di xna per la camera ma dalla trigonometria e le matrici (ma voglio precisare che so calcolare le matrici e so anche creare le matrici di trasformazione).
Ti ripropongo il problema se ti interessa (forse è colpa mia, non mi sono espresso correttamente finora):
Conoscendo la posizione della mia telecamera voglio ruotare la sua visuale non appena l'utente muove il mouse. Per ruotare la visuale dovrò ruotare (usando la trigonometria e le matrici) il punto focalizzato dalla camera (è il secondo parametro del metodo Matrix.CreateLookAt). Si userà il metodo CreateFromYawPitchRoll per creare una matrice di rotazione attorno a tutti e tre gli assi di rotazione.
N.B. conosco e so usare i metodi di xna per creare la camera con la visuale.
Ecco il codice:
// Determina l'angolo di rotazione in base al mouse.
camera_rotazione -= (float)(mouseState.X - graphics.PreferredBackBufferWidth / 2) * elapsedSec;
camera_beccheggio += (float)(mouseState.Y - graphics.PreferredBackBufferHeight / 2) * elapsedSec;
// Riposiziona il mouse al centro del viewport per le successive letture.
Mouse.SetPosition(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 2);
// Crea una matrice di rotazione secondo i vari angoli di rotazione
Matrix rot = Matrix.CreateFromYawPitchRoll(camera_rotazione, camera_beccheggio, camera_rollio);
// Calcola i vettori per la matrice di rotazione corrente.
Vector3 camUp = newVector3(rot.M21, rot.M22, rot.M23); //prendo la seconda riga di rot
Vector3 camLook = newVector3(rot.M31, rot.M32, rot.M33); //prendo la terza riga di rot
Vector3 camLeft = newVector3(rot.M11, rot.M12, rot.M13); //prendo la prima riga di rot
//per spostare la telecamera (e non la visuale)
if (keyState.IsKeyDown(Keys.A))
camera_posizione += speed * elapsedSec * camLeft;
if (keyState.IsKeyDown(Keys.D))
camera_posizione -= speed * elapsedSec * camLeft;
if (keyState.IsKeyDown(Keys.W))
camera_posizione += speed * elapsedSec * camLook;
if (keyState.IsKeyDown(Keys.S))
camera_posizione -= speed * elapsedSec * camLook;
//Si trova nel metodo Update perch essa verr aggiornata ad ogni fotogramma
Mie_variabili.View = Matrix.CreateLookAt(camera_posizione, camera_posizione + camLook, camUp);
----------------------
Quello che non riesco a capire è perchè i tre vettori (che ho messo in grassetto) devono contenere le righe della matrice di rotazione. Cosa rappresentano queste righe?
Il tutto funziona ma non riesco a capirne il senso. Perchè la terza riga della matrice di rotazione (rot) contiene le coordinate esatte della visuale ruotata?
Spero che possiate aiutarmi e che possa essere di aiuto a tutti i visitatori del forum in difficoltà con questi concetti (che non riguardano xna ma la programmazione dei videogiochi in generale). :prostro:
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Toty_
Il tutto funziona ma non riesco a capirne il senso. Perchè la terza riga della matrice di rotazione (rot) contiene le coordinate esatte della visuale ruotata?
Ah quindi a te funziona il tutto, non mi era risultato chiaro dai precedenti posts :bua:
Comunque, quello che tu vuoi sapere è perchè si prendono proprio quei valori. Come ben sai, quello che viene renderizzato dall'engine è ciò che si trova nel campo visivo della telecamera ovvero in una piramide tronca detta in inglese "frustum". Per poter realizzare questa piramide tronca occorrono 6 piani (1 per ogni faccia della piramide) che verranno estratti proprio dalla projection matrix
Ora andando a muoversi nello spazio i valori della matrice cambieranno e di conseguenza quelli dei piani e quindi del frustum e della camera, etc...
Questo documento spiega come si estraggono i piani dalla matrice (e perchè proprio quei valori)
http://www2.ravensoft.com/users/ggri...extraction.pdf
Comunque sul sito msdn c'è tutto ciò che serve sapere :sisi: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.matrix.aspx
Se hai ancora qualche dubbio, sai dove chiedere :)
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Gr1ph00n
Ah quindi a te funziona il tutto, non mi era risultato chiaro dai precedenti posts :bua:
Comunque, quello che tu vuoi sapere è perchè si prendono proprio quei valori. Come ben sai, quello che viene renderizzato dall'engine è ciò che si trova nel campo visivo della telecamera ovvero in una piramide tronca detta in inglese "frustum". Per poter realizzare questa piramide tronca occorrono 6 piani (1 per ogni faccia della piramide) che verranno estratti proprio dalla projection matrix
Ora andando a muoversi nello spazio i valori della matrice cambieranno e di conseguenza quelli dei piani e quindi del frustum e della camera, etc...
Questo documento spiega come si estraggono i piani dalla matrice (e perchè proprio quei valori)
http://www2.ravensoft.com/users/ggri...extraction.pdf
Comunque sul sito msdn c'è tutto ciò che serve sapere :sisi:
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.matrix.aspx
Se hai ancora qualche dubbio, sai dove chiedere :)
Il problema non è la piramide tronca o il metodo projection (questi sono problemi che approfondirò più avanti). L'unica cosa che non capisco (del precedente post) è perchè bisogna estrarre le righe della matrice rot, soprattutto la terza che sembra avere tutte le tre rotazioni aggiornate (tenendo conto di una circonferenza unitaria). Estrarre queste tre righe equivale a moltiplicare rot per i vettori 1;0;0 0;1;0 0;0;1 detti anche versori (se non sbaglio). E' il mio unico dubbio (ne aveva parlato anche Ronin ma non è stato molto chiaro). Se qualcuno me lo toglie, dovrei essere a posto (insisto nel dire che è più un problema di logica e trigonometria con le matrici che un problema di conoscenza della telecamera). :sisi:
-
Riferimento: domanda su XNA (c#)
I vettori [1;0;0] [0;1;0] [0;0;1] sono anche detti "versori".
Sapreste dirmi che senso ha usare i versori per cambiare la visuale della telecamera?
Questi versori vengono moltiplicati per la matrice di rotazione, ottenendo dunque le righe di quest'ultima. Perchè?
Vi prego aiutatemi. :confuso:
-
Riferimento: domanda su XNA (c#)
Perchè andando a definire una matrice di rotazione, definisci una speciale matrice dove ogni riga stabilisce un asse che si trova rispettivamente a 90° dagli altri e che quindi ortogonale agli altri assi. Questo è proprio il motivo per cui si hanno dei versori. Ti invito comunque a leggere questa pagina http://www.euclideanspace.com/maths/...ix/orthogonal/ per poter capire meglio le regole usate :sisi:
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Gr1ph00n
Perchè andando a definire una matrice di rotazione, definisci una speciale matrice dove ogni riga stabilisce un asse che si trova rispettivamente a 90° dagli altri e che quindi ortogonale agli altri assi. Questo è proprio il motivo per cui si hanno dei versori. Ti invito comunque a leggere questa pagina
http://www.euclideanspace.com/maths/...ix/orthogonal/ per poter capire meglio le regole usate :sisi:
Grazie ma quel sito non mi dice niente di particolarmente nuovo.
Mettiamola così: sapete dirmi come fare a ruotare la telecamera attorno ad un punto (stavolta come un gioco in terza persona, tipo splinter cell, la camera ruota attorno a Fisher). Non vi sto chiedendo lezioni di matrici (per carità, non sarei così bastardo). :nono:
Allora, per compiere delle rotazioni anche oblique devo moltiplicare le matrici di rotazione attorno ai tre assi (RotazioneY*RotazioneX*RotazioneZ, che in XNA possono comodamente farlo invocando CreateFromYawPitchRoll).
Il problema è far ruotare la telecamera (che alla fine è solo un punto) attorno ad un punto che non è l'origine.
Un sito diceva di traslare prima il centro della rotazione nell'origine poi moltiplicare per la matrice di rotazione e alla fine moltiplicare tutto per la traslazione del punto riposizionato nelle sue coordinate originarie (visto che prima è stato traslato nell'origine).
Ho provato con una camera fps ma il beccheggio non va bene. Spero di ricevere consigli su una telecamera in terza persona in modo da arrivare alla soluzione. :???:
-
Riferimento: domanda su XNA (c#)
Perchè tutti dicono di moltiplicare le matrici in ordine inverso (es: A * B * C --> C * B * A)? :???:
-
Riferimento: domanda su XNA (c#)
Ciao ragazzi, c'è qualche modo per usare un suono o musica (mp3) memorizzato su una chiave USB in un gioco XNA? E se è possibile, come fare?
Se uso mediaplayer.play(song) devo per forza avere i file audio nel mio context. Se invece i file mp3 fossero su un lettore esterno (magari un ipod)?
Grazie
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Toty_
Perchè tutti dicono di moltiplicare le matrici in ordine inverso (es: A * B * C --> C * B * A)? :???:
Perchè dal sistema verranno lette al contrario.
E cioè, se tu le setti in ordine A B C
verrà letta prima la C, poi la B e poi la A,
ottenendo probabilmente un effetto diverso da quello che desideravi.
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Seraph888
Perchè dal sistema verranno lette al contrario.
E cioè, se tu le setti in ordine A B C
verrà letta prima la C, poi la B e poi la A,
ottenendo probabilmente un effetto diverso da quello che desideravi.
Però con XNA questo non succede. :???:
Intendo dire che ottengo l'effetto desiderato senza invertire l'ordine. Come mai?
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
ziogico
Ciao ragazzi, c'è qualche modo per usare un suono o musica (mp3) memorizzato su una chiave USB in un gioco XNA? E se è possibile, come fare?
Se uso mediaplayer.play(song) devo per forza avere i file audio nel mio context. Se invece i file mp3 fossero su un lettore esterno (magari un ipod)?
Grazie
Scarica la libreria "irrKlang.NET": http://www.ambiera.com/irrklang/ e potrai usare WAV, MP3, OGG, MOD, XM, IT, S3M ecc.. senza problemi, anche direttamente da file su un percorso esterno tipo una chiave USB o ipod.. Io c'ho fatto un lettore karaoke Mp3 :) Tra l'altro questa libreria viene usata anche per giochi professionali tipo Word of Goo ecc..
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
WILEz
Scarica la libreria "irrKlang.NET":
http://www.ambiera.com/irrklang/ e potrai usare WAV, MP3, OGG, MOD, XM, IT, S3M ecc.. senza problemi, anche direttamente da file su un percorso esterno tipo una chiave USB o ipod.. Io c'ho fatto un lettore karaoke Mp3 :) Tra l'altro questa libreria viene usata anche per giochi professionali tipo Word of Goo ecc..
Ma tu sei il vero Wilez che ha messo la guida su internet o sei solo uno che si è messo questo nome?!? :eek:
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Toty_
Ma tu sei il vero Wilez che ha messo la guida su internet o sei solo uno che si è messo questo nome?!? :eek:
Eheh sono io :)
-
Riferimento: domanda su XNA (c#)
Wilez, senza offesa ma la parte sulla heightmap sembra arabo :sad:. Sono molto scoraggiato.
Chiedo aiuto a tutti gli utenti del forum (wilez compreso): vorrei capirci qualcosa su come creare un terreno (magari con la heightmap) in XNA. Consigliarmi qualche sito (io non ho trovato niente di comprensibile) o almeno indirizzarmi agli argomenti che occorre conoscere per poter capire qualcosa sul terreno. E' incredibile, occorrono pagine e pagine di codice (non ne ho capita una). Mi sono impegnato tanto ultimamente (prima di capire le rotazioni, motivo per il quale ho aperto la discussione, ho buttato un mese perdendo la testa) ma stavolta è troppo complicato.
La mia passione è quella di creare vg, vi prego venitemi incontro, sono troppo preoccupato! Aiuutooo. :prostro: :prostro: :prostro:
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Toty_
Wilez, senza offesa ma la parte sulla heightmap sembra arabo :sad:. Sono molto scoraggiato.
Chiedo aiuto a tutti gli utenti del forum (wilez compreso): vorrei capirci qualcosa su come creare un terreno (magari con la heightmap) in XNA. Consigliarmi qualche sito (io non ho trovato niente di comprensibile) o almeno indirizzarmi agli argomenti che occorre conoscere per poter capire qualcosa sul terreno. E' incredibile, occorrono pagine e pagine di codice (non ne ho capita una). Mi sono impegnato tanto ultimamente (prima di capire le rotazioni, motivo per il quale ho aperto la discussione, ho buttato un mese perdendo la testa) ma stavolta è troppo complicato.
La mia passione è quella di creare vg, vi prego venitemi incontro, sono troppo preoccupato! Aiuutooo. :prostro: :prostro: :prostro:
E di che ti preoccupi? Mica ti corre dietro nessuno, prendi le cose con calma, hai tutto il tempo per imparare cose nuove, a piccoli passi. Se non riesci a superare un ostacolo, non incaponirti troppo, prova e riprova, ma se proprio non ci riesci, passa ad altro, forse quell'argomento non è ancora alla tua portata, più avanti avrai più esperienza e potrai capire meglio anche quello.
Le heightmap non sono proprio il primo argomento che si possa imparare, per questo non ho spiegato molto sulla guida, avrei dovuto spiegare un sacco di altre cose prima, ho messo solo il codice da usare per creare una mappa.
Ti consiglio di concentrarti prima su cose più semplici.
-
Riferimento: domanda su XNA (c#)
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
WILEz
E di che ti preoccupi? Mica ti corre dietro nessuno, prendi le cose con calma, hai tutto il tempo per imparare cose nuove, a piccoli passi. Se non riesci a superare un ostacolo, non incaponirti troppo, prova e riprova, ma se proprio non ci riesci, passa ad altro, forse quell'argomento non è ancora alla tua portata, più avanti avrai più esperienza e potrai capire meglio anche quello.
Le heightmap non sono proprio il primo argomento che si possa imparare, per questo non ho spiegato molto sulla guida, avrei dovuto spiegare un sacco di altre cose prima, ho messo solo il codice da usare per creare una mappa.
Ti consiglio di concentrarti prima su cose più semplici.
Finendo la tua guida acquisirò le conoscenze necessarie per imparare la height map? Sai, su internet si trova soltanto la tua guida, non ci sono altre possibilità! x(
Ci sono altri modi per creare un terreno con le relative collisioni?
-
Riferimento: domanda su XNA (c#)
Potreste elencarmi gentilemente gli argomenti da conoscere per poter creare una height map (tipo vertexbuffer, vertex declaration, ecc...)? :|
-
Riferimento: domanda su XNA (c#)
Per creare una heightmap nel senso classico del termine ti serve sapere come:
- aprire e leggere i dati da una immagine qualsiasi(bitmap, jpeg, png,tga, scegli tu)
- tenere conto che l'immagine deve essere in scala di grigio a 256 colori. Ogni pixel dell'immagine rappresenta l'altezza a cui è posizionato il vertice della mappa, il nero (0) significa che il vertice è all'altezza minima..per esempio zero, il bianco (255) è il vertice più alto della tua mappa. Le sfumature di grigio in mezzo tra 0 e 255 indicano le varie "vie di mezzo"
- a questo punto ti crei un vertex buffer di NxN vertici, dove N indica la larghezza, e di conseguenza l'altezza, della tua texture. Si usa fare texture qudrate, quindi NxN va bene.
- ti fai due bei cicli for
Codice:
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
vertice[i][j].x = i;
vertice[i][j].y = j;
vertice[i][j].z = valoreDelPixelImmagine(i,j);
questo supponendo che z rappresenti l'asse che punta in alto. valoreDelPixelImmagine(i,j) è un metodo che ti devi fare tu e che legge appunto il valore contenuto alle coordinate i,j della tua immagine.
- dopo aver fatto questo ti crei il tuo bel index buffer
- Render.
E questo è il minimo, perchè ti accorgerai che con un metodo così diretto potrai disegnare mappe piccolissime altrimenti il pc ti collassa. Quando arrivi a fare questo che ti ho elencato sopra, allora potrai dare uno sguardo a tutte le tecniche di partizionamento dello spazio e culling, in modo da poter disegnare mappe dettagliatissime ed enormi..tipo crysis.
-
Riferimento: domanda su XNA (c#)
Grazie mille, Cherno! ;)
Ci vorrà un miracolo per riuscire a fare queste cose.
Come prima cosa, dovrò cominciare a studiare cosa sono i vertex e index buffer e tutto il resto.
-
Riferimento: domanda su XNA (c#)
Ma va che miracolo: solo un pò di metodo. Comunque si, devi assolutamente capire come devono essere organizzati i dati all'interno dei vari buffer.
-
Riferimento: domanda su XNA (c#)
Sto studiando vertex e index buffer ma non ho capito una cosa: se importiamo un modello 3D dall'esterno (per esempio, con estensione x) non occorre creare un vertex buffer? Come è possibile? In quel caso, dove vengono memorizzati i vertici del modello? :???:
Il vertex buffer si utilizza soltanto per creare modelli da programma (es: terreno, primitive come triangoli e quadrati)?
-
Riferimento: domanda su XNA (c#)
Vertex ed index buffer sono la base con la quale l'sdk comunica con la scheda video. Nel caso dei file .x le informazioni di vertex/index buffer, sono contenute appunto all'interno del file.
L'sdk li carica per te nelle sue strutture dati e quando fai modello.disegna, ci pensa lei a caricare e scaricare le varie risorse(index/vertex buffer, shader, texture ecc ecc)
-
Riferimento: domanda su XNA (c#)
Citazione:
Originariamente Scritto da
Cherno
Vertex ed index buffer sono la base con la quale l'sdk comunica con la scheda video. Nel caso dei file .x le informazioni di vertex/index buffer, sono contenute appunto all'interno del file.
L'sdk li carica per te nelle sue strutture dati e quando fai modello.disegna, ci pensa lei a caricare e scaricare le varie risorse(index/vertex buffer, shader, texture ecc ecc)
Perfetto. Grazie. :)
Per riuscire a creare una heightmap, cosa mi occorre conoscere ancora (oltre i vertex/index buffer)?
Devo studiare anche texture e shader?