OpenGL: создание собственной камеры - PullRequest
2 голосов
/ 28 ноября 2010

Я пытаюсь создать камеру для перемещения по трехмерному пространству, и у меня возникают некоторые проблемы с ее настройкой. Я делаю это на Java, и, очевидно, совместное использование gluPerspective и gluLookAt создает конфликт (экран начинает мерцать как бешеный).

gluPerspective устанавливается так:

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

Затем я создаю матрицу камеры, используя координаты глаза, векторы вперед и вверх (http://people.freedesktop.org/~idr/glu3/form_4.png) (допустим, что код для камеры правильный.

Наконец, прежде чем я нарисую что-нибудь, что у меня есть:

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

И затем я вызываю свои процедуры рисования (которые самостоятельно выполняют некоторый перевод / вращение, вызывая glRotatef и glTranslatef).

Без вызова glMultMatrixf камера показывает элементы, которые мне нужно видеть в центре экрана, как и должно. Однако с glMulMatrixf все, что я получаю, это черный экран. Я попытался использовать glLoadMatrixf вместо этого, и это тоже не сработало. Я делаю что-то неправильно? Я ставлю что-то не на своем месте? Если нет, и вот как это следует сделать, дайте мне знать, и я опубликую часть кода камеры, который может создавать конфликты.

РЕДАКТИРОВАТЬ: Вот код создания матрицы камеры:

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

}

Я прыгаю, ошибка где-то в этом фрагменте кода, если нет, я посмотрю на мои математические функции, чтобы увидеть, что происходит ..

EDIT2: хотя я должен упомянуть, что, по крайней мере, начальные векторы (глаз, центр, вверх) верны и поставить камеру туда, где она должна быть (работала с gluLookAt, но имела проблему мерцания).

Ответы [ 2 ]

5 голосов
/ 28 ноября 2010

Может быть проще использовать glRotatef, glTranslatef и glFrustum для создания камеры, хотя ваша математика кажется мне подходящей (до тех пор, пока UpVec фактически определен). В большей части трехмерной графики, которую я сделал, у вас действительно не было определенного объекта, который вы хотите отслеживать. Я прошел через различные реализации 3D-камеры, используя gluLookAt, прежде чем окончательно остановился на этом.

Вот как я стараюсь определять свои камеры:

Когда я создаю или инициализирую свою камеру, я настраиваю матрицу проекции с помощью glFrustum. Вы можете использовать glPerspecive, если вы предпочитаете:

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

После того, как я очищаю буферы цвета и глубины для прохода рендера, я вызываю

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

Для позиционирования и ориентации камеры. Первоначально вы устанавливаете положение и ориентацию как {0}, затем добавляете или вычитаете из положения при нажатии клавиши, а также добавляете или вычитаете из файла direction.x и direction.y, когда мышь перемещается ... (Я обычно не не связывайтесь с ориентацией.z)

Приветствие.

1 голос
/ 28 ноября 2010

Исправлено.Проблема заключалась в использовании glMultMatrix (матрица float [], int? Ofset?) ... по какой-то причине, если я просто использую glMultMatrix (матрица FloatBuffer), она работает нормально ..

Есть некоторые проблемы с преобразованиями IЯ делаю, но я должен быть в состоянии справиться с этим ... Спасибо за ваш вклад, ребята.

...