Domanda

Sto cercando di creare una macchina fotografica di muoversi intorno ad uno spazio 3D e sto avendo alcuni problemi sua creazione. Sto facendo questo è Java, e apparentemente con gluPerspective e gluLookAt insieme crea un conflitto (lo schermo inizia tremolante come un matto).

gluPerspective è impostato in questo modo:

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

I quindi creare una matrice telecamera, facendo uso di coordinate dell'occhio, in avanti e fino vettori ( http://people.freedesktop.org/~idr/glu3/form_4.png ) (lascia supporre il codice per la fotocamera è corretta.

Infine, prima di disegnare qualsiasi cosa che ho:

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

E poi io chiamo la mia routine di disegno (che fanno un po 'di traduzione / rotazione sul proprio chiamando glRotatef e glTranslatef).

Senza la chiamata a glMultMatrixf spettacoli telecamera gli articoli che hanno bisogno di vedere nel centro dello schermo come dovrebbe. Con glMulMatrixf però, tutto quello che ottiene è una schermata nera. Ho provato ad utilizzare glLoadMatrixf invece e non ha funzionato neanche. Sto facendo qualcosa di sbagliato? Sto mettendo qualcosa fuori posto? In caso contrario, e questo è come dovrebbe essere fatto fatemelo sapere e vi posterò una parte del codice della fotocamera che potrebbe essere la creazione di conflitti.

EDIT: Ecco il codice di creazione matrice della macchina fotografica:

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];
        }
    }

}

Sono saltellare l'errore è da qualche parte in questo pezzo di codice, se non, avrò uno sguardo alle mie funzioni matematiche per vedere cosa sta succedendo ..

EDIT2:. Anche se devo dire che almeno i vettori iniziali (occhio, al centro, in alto) sono corretti e fanno mettere teh fotocamera dove dovrebbe essere (lavorato con gluLookAt ma aveva teh problema sfarfallio)

È stato utile?

Soluzione 2

fissi che tipo di. Il problema stava usando glMultMatrix (float [] matrice, int? Ofset?) ... per qualche motivo se mi basta usare glMultMatrix (matrice FloatBuffer) funziona bene ..

Ci sono alcuni problemi con le trasformazioni che sto facendo, ma dovrei essere in grado di trattare con chi ... Grazie per il tuo contributo però ragazzi.

Altri suggerimenti

Potrebbe essere più semplice da utilizzare glRotatef, glTranslatef, e glFrustum per creare la macchina fotografica, anche se la matematica sembra che vada bene a me (così come lungo come UpVec in realtà è definito). Nella maggior parte dei grafica 3D che ho fatto, non hai davvero un oggetto definito che si voleva tenere traccia. Sono andato attraverso varie implementazioni di una fotocamera 3D utilizzando gluLookAt prima ho infine optato per questo.

Ecco come io tendo a definire le mie macchine fotografiche:

Quando creo o inizializzare la mia macchina fotografica, ho creato la matrice di proiezione con glFrustum. È possibile utilizzare glPerspecive se si preferisce:

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

Dopo aver svuotare i buffer colore e profondità per un passaggio di rendering, quindi chiamo

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);

Per posizione e orientare la telecamera. Inizialmente, è possibile impostare la posizione e l'orientamento sia per {0}, quindi aggiungere o sottrarre dalla posizione quando si preme un tasto, e aggiungere o sottrarre da orientation.x e orientation.y quando il mouse viene spostato ... (io in genere don' t pasticcio con orientation.z)

Saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top