Question

Je suis en train de créer un appareil pour se déplacer autour d'un espace 3D et ai quelques problèmes sa mise en place. Je suis en train de faire cela est de Java, et apparemment en utilisant gluPerspective et gluLookAt ensemble crée un conflit (l'écran commence vacillant comme un fou).

gluPerspective est défini comme suit:

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 de l'oeil, vers l'avant et des vecteurs ( http://people.freedesktop.org/~idr/glu3/form_4.png ) (permet de prendre le code de l'appareil est correcte.

Enfin, avant que je dessine quelque chose 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 leur propre en appelant glRotatef et glTranslatef).

Sans l'appel à glMultMatrixf l'appareil photo affiche les éléments dont j'ai besoin de voir dans le centre de l'écran comme il se doit. Avec glMulMatrixf Cependant, tous Tracez votre I est un écran noir. J'ai essayé d'utiliser à la place glLoadMatrixf et il ne fonctionne pas non plus. Est-ce que je fais quelque chose de mal? Est-ce que je mettais quelque chose sur place? Dans le cas contraire, ce qui est la façon dont il devrait être fait le moi savoir et je vais poster une partie du code de la caméra qui pourrait être de 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 dois mentionner que au moins les vecteurs initiaux (oeil, centre, vers le haut) sont corrects et ne mettent Teh caméra là où il devrait être (travaillé avec gluLookAt mais avait Teh question vacillante)

Était-ce utile?

La solution 2

fixe ce genre de. Le problème utilisait glMultMatrix (float [matrice], int? Ofset?) ... pour une raison quelconque, si je viens d'utiliser glMultMatrix (matrice FloatBuffer), il fonctionne très bien ..

Il y a quelques problèmes avec les transformations que je fais, mais je devrais être en mesure de traiter les ... Merci pour vos commentaires si les gars.

Autres conseils

Il est peut-être plus simple à utiliser glRotatef, glTranslatef et glFrustum pour créer la caméra, même si vos maths me semble bien à (aussi longtemps que UpVec est effectivement défini). Dans la plupart des graphiques 3D que je l'ai fait, vous n'avez pas vraiment un objet défini que vous vouliez suivre. Je suis passé par différentes implémentations d'une caméra 3D à l'aide gluLookAt avant finalement réglé à ce sujet.

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

Quand 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 rendre, 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 la position et orienter la caméra. Dans un premier temps, vous définissez la position et l'orientation à la fois à {0}, puis ajouter ou soustraire de la position lorsqu'une touche est enfoncée, et ajouter ou soustraire de orientation.x et orientation.y lorsque la souris est déplacé ... (en général je ne » t mess avec orientation.z)

Vive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top