2010-11-27 12 views
2

J'essaie de créer une caméra pour me déplacer dans un espace 3D et j'ai quelques problèmes pour la configurer. Je fais ceci est Java, et apparemment en utilisant gluPerspective et gluLookAt ensemble crée un conflit (l'écran commence à scintiller comme un fou).OpenGL: créer ma propre caméra

gluPerspective est défini comme ceci:

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
gl.glLoadIdentity(); 
glu.gluPerspective(50.0f, h, 1.0, 1000.0); 
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 

Je puis créer une matrice de la caméra, en utilisant les coordonnées des yeux, des vecteurs vers l'avant et vers le haut (http://people.freedesktop.org/~idr/glu3/form_4.png) (laisse supposer le code de l'appareil est correcte

.

Enfin, avant que je dessine tout ce que j'ai:

gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
gl.glLoadIdentity(); 
gl.glMultMatrixf(camera.matrix); 

Et puis j'appelle mes routines de dessin (qui font une translation/rotation sur thei r propre en appelant glRotatef et glTranslatef).

Sans l'appel de glMultMatrixf, l'appareil photo affiche les éléments que je dois voir au centre de l'écran comme il se doit. Avec glMulMatrixf cependant, tout ce que je reçois est un écran noir. J'ai essayé d'utiliser glLoadMatrixf à la place et cela n'a pas fonctionné non plus. Est-ce que je fais quelque chose de mal? Est-ce que je mets quelque chose hors de propos? Si ce n'est pas le cas, et que c'est ainsi que cela doit être fait, faites-le moi savoir et je posterai une partie du code de la caméra qui pourrait créer les conflits.

EDIT: Voici le code de création de la matrice de la caméra:

private void createMatrix() 
{ 
    float[] f = new float[3]; //forward (centre-eye) 
    float[] s = new float[3]; //side (f x up) 
    float[] u = new float[3]; //'new up' (s x f)   
    for(int i=0;i<3;i++){ 
     f[i] = centre[i]-eye[i]; 
    } 
    f = Maths.normalize(f); 
    s = Maths.crossProduct(f,upVec); 
    u = Maths.crossProduct(s,f); 

    float[][] mtx = new float[4][4]; 
    float[][] mtx2 = new float[4][4]; 
      //initializing matrices to all 0s 
    for (int i = 0; i < mtx.length; i++) { 
     for (int j = 0; j < mtx[0].length; j++) { 
      mtx[i][j] = 0; 
      mtx2[i][j] = 0; 
     } 
    } 

      //mtx = [ [s] 0,[u] 0,[-f] 0, 0 0 0 1] 
      //mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1] 
    for(int i=0;i<3;i++){ 
     mtx[0][i] = s[i]; 
     mtx[1][i] = u[i]; 
     mtx[2][i] = -f[i]; 

     mtx2[i][3]=-eye[i]; 
     mtx2[i][3]=-eye[i]; 
     mtx2[i][3]=-eye[i]; 
    } 
    mtx[3][3] = 1; 
    mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1; 

    mtx = Maths.matrixMultiply(mtx,mtx2); 
    for(int i=0;i<4;i++){ 
     for(int j=0;j<4;j++){ 
          // this.mtx is a float[16] for glMultMatrixf 
      this.mtx[i*4+j] = mtx[i][j]; 
     } 
    } 

} 

Je Hopping l'erreur est quelque part dans ce morceau de code, sinon, je vais jeter un oeil à mes fonctions mathématiques pour voir ce qui se passe ..

EDIT2: Bien que je devrais mentionner qu'au moins les vecteurs initiaux (oeil, centre, haut) sont corrects et mettent l'appareil photo où il devrait être (travaillé avec gluLookAt mais avait le problème de scintillement).

+1

Il n'y a rien de mal avec le code que vous avez posté (sauf pour le second argument de gluPerspective, qui attend le rapport w/h). Je ne peux penser à aucune autre explication que la matrice de la caméra qui ne va pas. – Kos

+0

Oui, la variable 'h' est la largeur/hauteur. Pourquoi quelqu'un l'a appelé 'h' je ne sais pas (travail de groupe). Quoi qu'il en soit, j'ai posté le code qui est censé créer la matrice. J'espère que quelqu'un peut voir ce que je fais de mal. – Zepee

+0

Pourquoi ne pas utiliser ol 'good 'gluLookAt' au lieu d'une matrice de caméra personnalisée? – Kos

Répondre

1

Correction d'un peu. Le problème était l'utilisation de glMultMatrix (float [] matrix, int? Ofset?) ... pour une raison quelconque, si je viens d'utiliser glMultMatrix (matrice FloatBuffer), cela fonctionne très bien ..

Il y a quelques problèmes avec les transformations que je fais mais je devrais être en mesure de faire face à ceux ... Merci pour votre contribution si les gars.

5

Il est peut-être plus simple d'utiliser glRotatef, glTranslatef et glFrustum pour créer la caméra, bien que vos maths me paraissent bien (aussi longtemps que UpVec est réellement défini). Dans la plupart des graphiques 3D que j'ai réalisés, vous n'aviez pas vraiment d'objet défini que vous vouliez suivre. Je suis allé à travers différentes implémentations d'une caméra 3D en utilisant gluLookAt avant que je me suis finalement arrêté sur cela.

Voici comment je tends à définir mes caméras:

Lorsque je crée ou initialiser mon appareil photo, je mis en place la matrice de projection avec glFrustum. Vous pouvez utiliser glPerspecive si vous préférez:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(left, right, down, up, near, far); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Après avoir vident les tampons de couleur et de profondeur pour une passe de rendu, j'appelle

glLoadIdentity(); 
glRotated(orientation.x, 1.0, 0.0, 0.0); 
glRotated(orientation.y, 0.0, 1.0, 0.0); 
glRotated(orientation.z, 0.0, 0.0, 1.0); 
glTranslatef(position.x, position.y, position.z); 

Pour positionner et orienter la caméra. Initialement, vous définissez la position et l'orientation à la fois à {0}, puis ajoutez ou soustrayez de la position quand une touche est enfoncée, et ajoutez ou soustrayez à orientation.x et orientation.y lorsque la souris est déplacée ... t mess avec l'orientation.z)

Cheers.

+0

La seule raison pour laquelle j'essaie d'éviter directement l'utilisation de glRotate/glTranslate pour contrôler la caméra, c'est que j'ai entendu dire que c'était un mauvais hack et des dizaines pour ralentir le programme. Mais oui, je peux voir où vous allez avec cela, et cela devrait certainement fonctionner aussi bien. – Zepee