OpenGL: создание моей собственной камеры
Вопрос
Я пытаюсь создать камеру для перемещения трехмерного пространства и у меня возникли проблемы с настройкой. Я делаю это, это Java, и, по-видимому, используя Glupperspective, и Glulookat вместе создает конфликт (экран начинает мерцать как ума).
Glupperspective устанавливается так:
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).
Без вызова HLMULTMATRIXF камера показывает элементы, которые мне нужно увидеть в центре экрана, как следствие. С 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];
}
}
}
Я прыгаю, ошибка где-то в этом куске кода, если нет, я посмотрю на свои функции по математике, чтобы увидеть, что происходит ..
Редактировать2: Хотя я должен упомянуть, что, по крайней мере, начальные векторы (глаз, центр, вверх) верны и поставьте камеру TEH, где она должна быть (работала с Glulookat, но имела мерцающую проблему).
Решение 2
Исправлено это вид. Проблема использовала GLMULTMATRIX (float [] matrix, int? Ofsset?) ... по какой-то причине, если я просто использую glmultmatrix (floatbuffer matrix), это работает нормально ..
Есть несколько вопросов с преобразованиями, которые я делаю, но я должен иметь дело с тем ... Спасибо за ваш вклад, хотя ребята.
Другие советы
Может быть проще использовать GLROTATEF, GLTRANSLATEF и GLFRUSTEF, чтобы создать камеру, хотя ваша математика кажется, что мне в порядке (так же длительно, как у 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}, затем добавляют или вычесть из положения, когда клавиша нажата, и добавляет или вычесть из ориентации. Ориентация и ориентация. Когда мышь перемещается ... (я вообще не должен беспорядок с ориентацией.
Ваше здоровье.