следующий текст немного длиннее, так как я хотел убедиться, что люди с похожими проблемами, например, Google эта страница может легко отслеживать точную проблему и ее решения легко. Но теперь к моей проблеме:
Недавно я начал программировать OpenGL ES на смартфоне с Android и столкнулся с проблемами в понимании того, как используются gluPerspective и gluLookAt. Я думаю Я понимаю, что они делают, однако я не вижу треугольника, который рисую. Я запускаю следующий код в методе onDrawFrame моей деятельности. Упомянутая активность реализует GLSurfaceView.Renderer с onDrawFrame, помеченным @Override. Мой код:
gl.glViewport(0, 0, screen_width, screen_height);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //set background to black
gl.glClearDepthf(1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION); // Change PROJECTION matrix
gl.glLoadIdentity();
float aspect_ratio = (float) screen_width / screen_height;
GLU.gluPerspective(gl, 67, aspect_ratio, 1, 100);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glMatrixMode(GL10.GL_MODELVIEW); // Change MODELVIEW matrix
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, 20, 0, 0, 0, 0, 1, 0);
// make triangle with vertices (-2,0,0), (2,0,0), and (0,.5,0)
float[] vertices = { -2f, 0, 0, 2f, 0, 0, 0, .5f, 0 };
ByteBuffer buffer = ByteBuffer.allocateDirect(vertices.length * 4);
buffer.order(ByteOrder.nativeOrder());
FloatBuffer vertex_buffer = buffer.asFloatBuffer();
for (int i = 0; i < 9; i++) {
vertex_buffer.put(vertices[i]);
}
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex_buffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_DEPTH_TEST);
Следующие пункты - это короткие заметки о том, что я предположительно знаю о настройках камеры в приведенном выше коде. ПОЖАЛУЙСТА, поправьте меня, если я ошибся в следующих объяснениях, так как это может решить все мои проблемы!
- glMatrixMode (GL10.GL_PROJECTION) переключается на изменение матрицы камеры (для которой я загружаю матрицу идентичности непосредственно после этого)
- GLU.gluPerspective (gl, 67, aspect_ratio, 1, 100) устанавливает перспективную проекцию с углом обзора 67 градусов в Y-измерении. Используя «aspect_ration = (float) width / height» OpenGL вычисляет угол обзора в x-измерении. Кроме того, «1» - это ближняя плоскость отсечения, а «100» - это значение дальней плоскости отсечения.
- Насколько я знаю, не имеет значения, где в коде вызывается gluLookAt, если это делается до фактического рисования (хотя я не уверен в этом). В этом примере я сначала переключаюсь на матрицу MODELVIEW, загружаю единичную матрицу, а затем вызывается gluLookAt.
3.
- «GLU.gluLookAt (gl, 0, 0, 20, 0, 0, 0, 0, 1, 0)» фактически состоит из трех 3-элементных векторов. Начальная (в данном примере (0,0,20)) устанавливает положение камеры в мировых координатах (т.е. 20 единиц на положительной оси Z, что означает, что она «торчит» из передней части экрана телефона). ). Второй вектор определяет точку в мировой системе координат, на которую смотрит камера (в этом примере начало координат системы координат, то есть камера смотрит вдоль отрицательной оси z). Третий вектор является вектором вверх, который определяет направление оси Y системы координат камер (и, следовательно, также оси X через перекрестное произведение с вектором от положения камеры до точки, на которую она смотрит).
Код рисования треугольника был скопирован из учебника (но я нашел похожий код и в других учебниках, поэтому я предполагаю, что это не проблема).
Насколько я понимаю, камера теперь расположена на (0,0,20) и смотрит в начало системы координат. Его начальная точка рисования начинается с значения z 19 и достигает -80 (камера находится в точке 20 оси z и смотрит вдоль отрицательной оси z; у ее обзорной плоскости есть ближняя и дальняя плоскости на 1 и 100 (оба вида вдоль отрицательной оси z в этом случае) соответственно). Следовательно, треугольник должен быть видимым, так как его вершины расположены вокруг начала координат в плоскости оси z = 0 (то есть в плоскости xy), которая явно находится в пределах поля зрения просмотра. Далее нарисованные вершины располагаются против часовой стрелки; по умолчанию в OpenGL.
Итак, после этого длительного введения в проблему, мой простой вопрос: что я испортил, чтобы этот код не выполнял то, что я ожидал?