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).
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
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
Pourquoi ne pas utiliser ol 'good 'gluLookAt' au lieu d'une matrice de caméra personnalisée? – Kos