Pregunta

Estoy tratando de crear una cámara para moverse por un espacio 3d y estoy teniendo algunos problemas para su creación. Estoy haciendo esto es Java, y al parecer el uso de gluPerspective y gluLookAt juntos crean un conflicto (se inicia el parpadeo de la pantalla como un loco).

gluPerspective se establece así:

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

I a continuación, crear una matriz de cámara, haciendo uso de las coordenadas de los ojos, hacia adelante y arriba vectores ( http://people.freedesktop.org/~idr/glu3/form_4.png ) (supongamos el código para la cámara es correcta.

Por último, antes de dibujar cualquier cosa que tengo:

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

Y luego llamo a mis rutinas de dibujo (que hacen alguna traducción / rotación sobre su propio llamando glRotatef y glTranslatef).

Sin la llamada a los glMultMatrixf cámara muestra los artículos que necesiten ver en el centro de la pantalla como debería. Con glMulMatrixf sin embargo, lo único que consigue es una pantalla en negro. He intentado utilizar glLoadMatrixf vez y no funcionó bien. ¿Estoy haciendo algo mal? Estoy poniendo algo fuera de lugar? Si no es así, y así es como se debe hacer, hágamelo saber y voy a publicar algunos de los códigos de la cámara que podría ser la creación de los conflictos.

EDIT: Aquí está el código de creación de matriz de cámara:

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

}

Estoy Hopping el error está en algún lugar de esta pieza de código, si no, voy a tener una mirada en mis funciones matemáticas para ver que esta pasando ..

Edit2:. Aunque debo mencionar que, al menos, los vectores iniciales (ojo, centro, arriba) son correctos y no ponen teh cámara donde debe ser (trabajado con gluLookAt pero tuvo teh problema de parpadeo)

¿Fue útil?

Solución 2

Fijo que tipo de. El problema estaba usando glMultMatrix (float [] matriz, int? Ofset?) ... por alguna razón, si yo sólo uso glMultMatrix (matriz FloatBuffer) que funciona bien ..

Hay algunos problemas con las transformaciones que estoy haciendo pero deben ser capaces de hacer frente a los ... Gracias por su entrada, aunque los chicos.

Otros consejos

Puede ser que sea más fácil de usar glRotatef, glTranslatef y glFrustum para crear la cámara, aunque su matemática parece bien para mí (con tal de que UpVec está definido en realidad). En la mayoría de los gráficos en 3D que he hecho, que en realidad no tiene un objeto definido que quería realizar un seguimiento. Fui a través de varias implementaciones de una cámara 3D usando gluLookAt antes de que finalmente se establecieron en esto.

Aquí es cómo tiendo a definir mis cámaras:

Cuando creo o inicializar mi cámara, me juego hasta la matriz de proyección con glFrustum. Puede utilizar glPerspecive si lo prefiere:

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

Después de borrar la buffers de color y profundidad para un pase de render, entonces llamo

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

Para la posición y orientar la cámara. Inicialmente, se establece la posición y orientación tanto a {0}, a continuación, añadir o restar de posición cuando se pulsa una tecla, y añadir o restar de orientation.x y orientation.y cuando el ratón se mueve ... (por lo general don' t lío con orientation.z)

Saludos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top