Frage

Ich versuche, eine Kamera zu schaffen, die einen 3D-Raum zu bewegen und einige Probleme habe es einrichten. Ich tue dies ist Java, und anscheinend mit gluPerspective und gluLookAt zusammen schafft einen Konflikt (der Bildschirm beginnt wie verrückt Flimmern).

gluPerspective wird wie folgt festgelegt:

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

I erzeugt dann eine Kameramatrix, die Verwendung von Augenkoordinaten zu machen, nach vorne und oben Vektoren ( http://people.freedesktop.org/~idr/glu3/form_4.png ) (lässt den Code übernehmen für die Kamera korrekt ist.

Schließlich, bevor ich irgend etwas zeichne ich habe:

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

Und dann rufe ich meine Zeichenroutinen (die auf ihrem eigenen etwas Übersetzung / Rotation zu tun durch den Aufruf glRotatef und glTranslatef).

Ohne den Aufruf von glMultMatrixf Die Kamera zeigt die Elemente, die ich brauche in der Mitte des Bildschirms, um zu sehen, wie es sollte. Mit glMulMatrixf aber alles, was ich bekommen ist ein schwarzer Bildschirm. Ich habe versucht, mit glLoadMatrixf statt und es hat nicht funktioniert. Mache ich etwas falsch? Bin ich Putting etwas fehl am Platz? Wenn nicht, und das ist, wie es getan werden sollte lassen Sie mich wissen und ich werde einige der Kamera Code schreiben, der die Konflikte erschaffen könnten.

EDIT: Hier ist die Kameramatrix Erstellungscode:

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

}

Ich bin Hopping den Fehler irgendwo in diesem Stück Code, wenn nicht, ich einen Blick auf meine Mathe-Funktionen haben werden, um zu sehen, was auf ..

gehen

EDIT2. Obwohl ich sollte erwähnen, dass zumindest die ersten Vektoren (Auge, Mitte, oben) korrekt sind und keine teh Kamera setzen, wo es sollte (mit gluLookAt gearbeitet hatte aber teh Flackern Ausgabe)

War es hilfreich?

Lösung 2

es Feste Art. Das Problem wurde mit glMultMatrix (float [] Matrix, int? Ofset?) ... aus irgendeinem Grund, wenn ich nur glMultMatrix (FloatBuffer Matrix) verwenden, es funktioniert ..

Es gibt einige Probleme mit den Transformationen ich mache, aber ich sollte mit denen ... Vielen Dank für Ihre Eingabe obwohl Jungs.

umgehen können

Andere Tipps

Es könnte einfacher sein glRotatef, glTranslatef zu verwenden, und glFrustum die Kamera zu erstellen, obwohl Sie Ihre mathematischen fein mir scheint (nur solange UpVec tatsächlich definiert). In den meisten der 3D-Grafik, dass ich es getan habe, hast du nicht wirklich ein definiertes Ziel haben, die Sie verfolgen wollten. Ich ging durch verschiedene Implementierungen einer 3D-Kamera mit gluLookAt, bevor ich schließlich auf diesem nieder.

Hier ist, wie ich neige dazu, meine Kameras zu definieren:

Wenn ich meine Kamera erstellen oder initialisieren, stelle ich die Projektionsmatrix mit glFrustum auf. Sie können glPerspecive verwenden, wenn Sie bevorzugen:

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

Nachdem ich die Farbe und Tiefe Puffer für einen Pass machen löschen, dann rufe ich

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

Um Position und Orientierung der Kamera. Zunächst legen Sie Position und Ausrichtung sowohl auf {0}, dann addieren oder subtrahieren von der Position, wenn eine Taste gedrückt wird, und fügen Sie oder von orientation.x subtrahieren und orientation.y, wenn die Maus bewegt wird ... (ich in der Regel don‘ t mess with orientation.z)

Prost.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top