2010-11-27 2 views
2

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

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 вместо этого, и он тоже не работал. Я делаю что-то неправильно? Я что-то помешал? Если нет, и так должно быть сделано, дайте мне знать, и я отправлю некоторые из кода камеры, которые могут создавать конфликты.

EDIT: Вот код создания матрицы камеры:

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, но имела мерцающую проблему).

+1

Нет ничего плохого в коде, который вы опубликовали (кроме второго аргумента gluPerspective, который ожидает отношение w/h). Я не могу думать ни о каком другом объяснении, кроме того, что матрица камеры ошибается. – Kos 2010-11-28 00:22:23

+0

Да, переменная «h» - ширина/высота. Почему кто-то назвал его «h», я не знаю (работа в группе). Во всяком случае, я разместил код, который должен был создать матрицу. Надежда someoen может определить, что я делаю неправильно. – Zepee 2010-11-28 00:48:31

ответ

1

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

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

5

Может быть проще использовать glRotatef, glTranslatef и glFrustum для создания камеры, хотя ваша математика кажется мне прекрасной (до тех пор, пока UpVec фактически определен). В большинстве 3D-графики, которые я сделал, у вас действительно не было определенного объекта, который вы хотите отслеживать. Я прошел через различные реализации 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}, затем добавляете или вычитаете из позиции при нажатии клавиши и добавляете или вычитаете из ориентации .x и orientation.y, когда мышь перемещается ... (я вообще не знаю, t беспорядок с ориентацией.z)

Cheers.