Я пытаюсь создать камеру для перемещения по 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, но имела мерцающую проблему).
Нет ничего плохого в коде, который вы опубликовали (кроме второго аргумента gluPerspective, который ожидает отношение w/h). Я не могу думать ни о каком другом объяснении, кроме того, что матрица камеры ошибается. – Kos 2010-11-28 00:22:23
Да, переменная «h» - ширина/высота. Почему кто-то назвал его «h», я не знаю (работа в группе). Во всяком случае, я разместил код, который должен был создать матрицу. Надежда someoen может определить, что я делаю неправильно. – Zepee 2010-11-28 00:48:31