Autore Topic: Muovere punto di vista  (Letto 1271 volte)

Offline zamby

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Muovere punto di vista
« il: 09 Dicembre 2012, 19:02:18 CET »
0
Sto realizzando un piccolo progetto in opengles.
Ho un problema con il punto di vista. Vorrei farlo muovere nella scena ma purtroppo la scena resta sempre statica.
Posto un esempio:

public void onSurfaceChanged(GL10 gl, int width, int height) {
if(height == 0) { height = 1; }
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();//Calculate The Aspect Ratio Of The Window
GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);
GLU.gluLookAt( gl,10.0f, 10.0f, 10.0f, 0, 0, 0, 0, 0, 1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gridVertexBfr = FloatBuffer.wrap(gridCoords);
gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background
gl.glClearDepthf(1.0f); //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
GLU.gluLookAt( gl,10.0f, 10.0f, 10.0f+k, 0, 0, 0, 0, 0, 1);
gl.glLoadIdentity();
gl.glTranslatef(0, k0 0);
gl.glColor4f(0.2f, 0.2f, 0.2f, 1.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2,GL10.GL_FLOAT,0,gridVertexBfr);
gl.glDrawArrays(GL10.GL_LINES, 0, 88);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
k = k + 0.02f;
}

Grazie comunque per l'aiuto.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Muovere punto di vista
« Risposta #1 il: 09 Dicembre 2012, 23:47:23 CET »
0
Il codice (possibilmente indentato) lo devi inserire tra i campi delimitati da "[ code=java ]" e "[ /code ]".

Usi le OpenGL-ES 1.x, lo sottolineo perché le OpenGL-ES 2.x sono cambiate parecchio e quel codice non è compatibile.

Non ho provato il tuo codice ma da una prima lettura si nota l'uso non corretto dello stack delle matrici. Abiliti la matrice GL_PROJECTION per impostare la proiezione e poi abiliti la matrice GL_MODELVIEW,  fino a qui in teoria è giusto ma poi quando modifichi la proiezione rimani sempre con la matrice GL_MODELVIEW, questo è un errore. Quando modifichi la proiezione deve essere attiva la matrice GL_PROJECTION, per i dati la GL_MODELVIEW.

Ci potrebbero essere potenzialmente altri errori.
adb logcat | tee /tmp/logcat | grep TAG

Offline zamby

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Muovere punto di vista
« Risposta #2 il: 10 Dicembre 2012, 13:15:26 CET »
0
Grazie per la risposta.

Codice (Java): [Seleziona]
public void onDrawFrame(GL10 gl) {
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
 
  gl.glMatrixMode(GL10.GL_PROJECTION);
 
  gl.glLoadIdentity();//Calculate The Aspect Ratio Of The Window
  GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);
  GLU.gluLookAt( gl,10.0f, 10.0f, 10.0f + k, 0, 0, 0, 0, 0, 1);
 
  gl.glMatrixMode(GL10.GL_MODELVIEW);
 
  gl.glLoadIdentity();
  gl.glColor4f(0.2f, 0.2f, 0.2f, 1.0f);
  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  gl.glVertexPointer(2,GL10.GL_FLOAT,0,gridVertexBfr);
  gl.glDrawArrays(GL10.GL_LINES, 0, 88);
  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  k = k + 0.02f;
}

ho provato in questo modo, ma nulla da fare. Adesso lo schermo è completamente nero.
« Ultima modifica: 10 Dicembre 2012, 13:36:12 CET da zamby »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Muovere punto di vista
« Risposta #3 il: 10 Dicembre 2012, 14:08:39 CET »
0
Non ho tempo per provare il codice ma prima di animarlo di solito si scrive il codice con la camera fissa per vedere se funziona e poi si anima.

Non mi risulta l'utilizzo di gluLookAt nel modo  GL_PROJECTION, dagli esempi che ho viene chiamata nel modo GL_MODELVIEW.

Questo è il Red Book delle OpenGL, gli esempi sono scritti in C ma si capiscono, devi seguire l'ordine con cui vengono caricate e moltiplicate le matrici, basta un solo errore e non funziona nulla:

Chapter 3 - OpenGL Programming Guide

adb logcat | tee /tmp/logcat | grep TAG

Offline zamby

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Muovere punto di vista
« Risposta #4 il: 10 Dicembre 2012, 19:50:18 CET »
0
Nel primo post la scena viene renderizzata  ma non si muove, nel secondo esempio lo schermo resta nero.
Mi sembra che con glutlookat non sia necessario impostare la matrice di proiezione,  mentre lo si fa quando si usano le matrici di traslazione, rotazione etc per muovere il punto di vista o meglio l'intera scena ( operazione semplificata da glutlookat)
Eppure tempo fa avevo fatto una cosa del genere e funzionava.
Comunque proverò a rileggermi i tutorial.

Grazie per la pazienza.
« Ultima modifica: 10 Dicembre 2012, 19:55:55 CET da zamby »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Muovere punto di vista
« Risposta #5 il: 10 Dicembre 2012, 21:09:47 CET »
0
La gluLookAt serve per spostare la posizione della camera e la direzione, di default è nell'origine del sistema di riferimento. Se non imposti la matrice di proiezione quella di default è una matrice unitaria equivalente a una matrice di proiezione ortogonale.
adb logcat | tee /tmp/logcat | grep TAG