Vai al contenuto
robertoliguori

Movimenti Con Opengl

Recommended Posts

Ciao a tutti,

sto usando le librerie glut per opengl. Ho una teiera e devo farla muovere tramite mouse. Ma l'impressione che si deve avere è che la teiera si muova nello schermo.

Vi anticipo che è la prima volta che cerco di far muovere oggetti con opengl.

Ho due problemi:

1) se utilizzo la tastiera con il codice seguente

case GLUT_KEY_LEFT:

coordx=(GLfloat)((newx*xMax)-2);

coordy=(GLfloat)((newy*yMax)-2);

dove coordx e coord di y le utilizzo in una glTranslatef. E questo semplice calcolo serve per portare le coordinate del mouse ll'interno della finestra in coordinate tra [-2,2]-

Succede che le coordinate del mouse diventano sempre zero.... QUALCUNO HA IDEA DEL PERCHE'??

2) se invece non faccio spostare la teiera nella posizione del mouse e volessi farle seguire un percorso... come dovrei fare?

Supponiamo che voglio fare una rotazione... se uso glRotate con 90 gradi per esempio... mi ritrovo la teiera spostata di 90 gradi in un frammento di secondo. Ma vorrei che tale rotazione si vedesse... come fare?

grazie a chiunque abbia anche solo capito il problema

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao,

questo è un messaggio generato automaticamente.

Se hai ricevuto questo messaggio è perché la tua discussione è stata spostata e messa nella sezione più appropriata.

Quando crei una discussione ti preghiamo di far attenzione ad inserirla nella sezione corretta in modo che sia più facile per tutti consultare il forum.

grazie per la collaborazione

lo staff di Treddi.com

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
1) Succede che le coordinate del mouse diventano sempre zero.... QUALCUNO HA IDEA DEL PERCHE'??

2) se invece non faccio spostare la teiera nella posizione del mouse e volessi farle seguire un percorso... come dovrei fare?

Supponiamo che voglio fare una rotazione... se uso glRotate con 90 gradi per esempio... mi ritrovo la teiera spostata di 90 gradi in un frammento di secondo. Ma vorrei che tale rotazione si vedesse... come fare?

1- Dovresti postarci un po' più codice, le ragioni possono essere ennemila, sia un errore di passaggio di parametri, sia di conversione. Inoltre non ho ben capito lungo che piano vuoi far muovere la teiera.

2- Serve un po' di matematica.

Per far muovere (traslare) la teiera lungo il percorso devi memorizzarti i punti del percorso da qualche parte (un array) e poi puoi fare un semplice interpolazione, o lineare o spline. Se fai l'interpolazione spline devi memorizzarti anche le tangenti (che volendo le puoi anche calcolare).

Per la rotazione è molto simile, devi fare un'interpolazione lineare tra zero e 90.

Una cosa del genere:

//Questo va fatto solo la prima volta

startTime = leggiTimer(); 

startAngle = 0.0;

finalAngle = GL_PI/2; //angolo finale


//Questo ogni frame

float angolo;


angolo = (leggiTimer()-startTime) * (finalAngle - startAngle) / tempoDiRotazione;


//a questo punto fai la glRotate con l'algolo giusto.

È importante leggersi il timer perché altrimenti la tua applicazione diventa dipendente dal frame rate.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
1- Dovresti postarci un po' più codice, le ragioni possono essere ennemila, sia un errore di passaggio di parametri, sia di conversione. Inoltre non ho ben capito lungo che piano vuoi far muovere la teiera.

Grazie... credo di aver risolto con i consigli che mi hai dato anche se non ho usato l'interpolazione...

A questo punto vorrei veder scorrere dell'acqua dalla teiera... credi sia possibile?

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Acqua? o.O

Ti sei andato a prendere proprio una delle cose più difficili da fare.

L'acqua la puoi simulare con delle particelle, ma ti devi scrivere una parte di programma per la simulazione delle particelle, che a parer mio è parecchio ardua se vuoi gestire le collisioni. Poi le particelle le puoi visualizzare con dei QUAD che si muovono con le particelle.

Il demo della cascata di nVidia è fatto con questo motodo. Usa DirectX 10, ma le funzionalità di directX 10 vengono usate soltanto per la creazione della roccia, per lo shading e per fare calcoli (dopotutto loro vogliono far vedere quanto è bella la loro scheda).

Guarda la pagina 124 del pdf contenuto qui dentro che ti fa vedere i QUAD. -> http://developer.download.nvidia.com/prese...DemoSecrets.zip

Se hai una scheda (e sistema operativo) che supporta directX 10 ti consiglio di andarti a vedere il demo della cascata, altrimenti trovi qualche video su youtube.

Altrimenti se vuoi qualcosa di più complicato invece di usare le particelle puoi usare una mappa tridimensionale in cui memorizzi la densità per ogni voxel e poi animi quella. Poi devi crearti le geometrie in base alla densità o visualizzare direttamente i voxel.... cosa tutt'altro che banale e che è ancora difficile da fare in real time, ci sono dei tutorial per directX 10 sul sito della nVidia.

Tutto questo senza considerare le equazioni di Navier-Strokes... :ph34r:

Per i voxel c'è l'ormai famosissimo articolo Real-time fluid dynamic for games di Jos Stam, su cui si basa il fluid effect di Maya (Stam lavorava per Alias). Ma è molto complicato, se devi soltanto far uscire dell'acqua dalla teiera ti suggerisco il primo metodo.

Altrimenti se ti accontenti di una cosa precotta, fai tutto in 3dstudio/maya/blender/chetipare e poi esporti l'animazione (che poi ti devi leggere ed eseguire).

Insomma renderizzare i flussi d'acqua in real-time non è proprio semplicissimo.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
....

Insomma renderizzare i flussi d'acqua in real-time non è proprio semplicissimo.

Credo che tu abbia proprio ragione... a quanto mi dici diventa un'ìmpresa eroica!!

Ho un altro problema però ora, questo più semplice. Ho deciso di realizzare la teiera senza la funzione glut ma con le curve di bezier. Ho scaricato i punti di controllo e ho usato un evaluator. Ti posto un pò di codice:

for(k=0;k<maxpoints;k++) //questo for è usato perché sono in tutto 32 patch

{

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,

0, 1, 12, 4, &data[k][0][0][0]); //data è l'array dei punti di controllo

glEnable(GL_MAP2_VERTEX_3);

//Questo è un codice standard ke ho trovato per disegnare le curve

for (j = 0; j <= 8; j++)

{

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 30; i++)

glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);

glEnd();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 30; i++)

glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);

glEnd();

}

}

Il tutto funge! Ma ho un problema... non riesco a mapparci la texture sopra.

ho scaricato il red book per vederne un esempio ma non riesco ad applicare la texure. Cerco di spiegare il problema .

Il libro dice che bisogna utilizzare un evaluator anche per la texture ma non con i punti di controllo che si usano per la curva. L'esempio utilizza un arry di questo tipo:

GLfloat texpts[2][2][2] = {{{0.0, 0.0}, {0.0, 1.0}},

{{1.0, 0.0}, {1.0, 1.0}}};

da passare alla funzione:

glMap2f(GL_MAP2_TEXTURE_COORD_2,0, 1, 2, 2,

0, 1, 4, 2, &texpts[0][0][0]);

e poi fare l'abilitazione

glEnable(GL_MAP2_TEXTURE_COORD_2);

e quindi scrivere la curva (nel mio caso la teiera)

Ho provato a inserire questo array davvero in tutte le salse ( e da ieri che ci provo). Ma la texture non compare.

Forse sbaglio qualcosa o forse non devo utilizzare proprio questo array.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao Roberto,

mi sono appena affacciato sul mondo delle opengl. Io ho un problemino con le superfici di rotazione...magari banale ma non capisco dove sbaglio:

quello che vorrei fare è una cosa credo abbastanza semplice, ovvero da una curva generare una superficie di rotazione.

Utilizzo c come linguaggio di programmazione.

Per ottenere questa superficie, utilizzo gli "evaluators" e la mapgrip:

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 8, &array[0][0][0]);

glEnable(GL_MAP2_VERTEX_3);

glEnable(GL_AUTO_NORMAL); //per l'illuminazione

glMapGrid2f(50.0, 0.0, 1.0, 50.0, 0.0, 1.0);

dove array è un array dei punti di controllo.

Questo array lo riempio dinamicamente prima di crearmi la finestra con la scena. Mi spiego meglio:

Nella prima parte del programma inserisco le coordinate x e z dei punti di controllo e vado a riempire l'array calcolandomi tutti i punti di controllo per la rotazione attorno all'asse z:

double x, y, z;

int i,j;

int k=0;

float angolo = 36*3.141593/180; //trasformo l'angolo in radianti (l'argomento del sin e cos è in radianti)

printf("\n Inserisci il numero dei punti di controllo della curva: ");

scanf("%i", &numVertici);

for(i=0; i<numVertici; i++)

{

printf("\n punto %i, ordinata x: ", i);

scanf("%lf", &x);

printf("\n punto %i, ordinata z: ", i);

scanf("%lf", &z);

for (j = 0; j < 50; j++)

{

float ang = angolo * (j);

array[j][0] = x*cos(ang);

array[j][1] = x*sin(ang);

array[j][2] = z;

}

}

Poi nella display utilizzo la glEvalMesh2(GL_FILL, 0, 50, 0, 50);

Ecco il mio problema: questo è ciò che mi esce fuori:

figura1.jpg

Sembra che la rotazione si fermi intorno ai 240 gradi, anzichè continuare fino a 360. Qualcuno di voi sa spiegarmi il motivo?

Sbaglio procedura (nel senso c'è un altro modo per ottenere una superficie di rotazione ruotando per l'asse z una curva), oppure sbaglio qualche parametro?

Ti ringrazio per l'attenzione.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Ospite
Rispondi

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×
×
  • Crea nuovo...