2015-10-07 7 views
0

Я пытаюсь сделать 2D-графику для своего Android-приложения, состоящего из шести тонких прямоугольников, каждая из которых занимает примерно 1/6 экрана по ширине и равна высоте экрана. Я не уверен, как правильно определить границы координатной плоскости x и y OpenGL на экране. В конце концов мне нужно будет написать логику, которая проверяет, какой из 6 прямоугольников имеет событие касания, поэтому я пытался решить эту проблему, переназначив координатную плоскость OpenGL в координатную плоскость экрана устройства (где начало координат (0,0) . в верхнем левом углу экрана вместо серединыПоиск/замена границ координатной плоскости OpenGL ES

Я объявляю одну из моих шести прямоугольников, как так:

private float vertices1[] = { 
      2.0f, 10.0f, 0.0f, // 0, Top Left 
      2.0f, -1.0f, 0.0f, // 1, Bottom Left 
      4.0f, -1.0f, 0.0f, // 2, Bottom Right 
      4.0f, 10.0f, 0.0f, // 3, Top Right 
    }; 

, но так как я не уверен, что видимые пределы на х и у (в системе координат OpenGL) У меня нет конкретного способа узнать, какие вершины нужно создать для моего прямоугольника, чтобы занять 1/6 дисплея. Каков идеальный способ сделать это?

я пробовал подходы, такие как using glOrthoof() переназначить координат OpenGL в в легко работать с экрана устройства координаты:

gl.glViewport(0, 0, width, height); 
// Select the projection matrix 
gl.glMatrixMode(GL10.GL_PROJECTION); 
// Reset the projection matrix 
gl.glLoadIdentity(); 
// Calculate the aspect ratio of the window 
GLU.gluPerspective(gl, 45.0f,(float) width/(float) height,0.1f, 100.0f); 
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f); 
// Select the modelview matrix 
gl.glMatrixMode(GL10.GL_MODELVIEW); 
// Reset the modelview matrix 
gl.glLoadIdentity(); 

, но когда я делаю прямоугольник полностью пропадает.

ответ

2

Вы, разумеется, не хотите использовать перспективную проекцию для 2D-графики. Это просто не имеет большого смысла. Перспективный прогноз для ... ну, создавая перспективную проекцию, которая полезна только тогда, когда ваши объекты фактически размещены в трехмерном пространстве.

еще хуже, у вас есть два вызова, чтобы настроить перспективную матрицу:

GLU.gluPerspective(gl, 45.0f,(float) width/(float) height,0.1f, 100.0f); 
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f); 

Хотя это законно, это редко имеет смысл. Что существенно, если вы делаете это, так это то, что обе проекции применяются последовательно. Поэтому первое, что нужно сделать, это избавиться от вызова gluPerspective().

Чтобы разместить ваши 6 прямоугольников, у вас есть несколько вариантов. Почти самый простой - вообще не применять никаких преобразований. Это означает, что вы укажете свои входные координаты в нормализованных координатах устройства (например, NDC), который является диапазоном [-1.0, 1.0] в обоих направлениях x и y. Таким образом, для 6 прямоугольников, расположенных рядом друг с другом, вы должны использовать y-диапазон [-1.0, 1.0] для всех прямоугольников и x-диапазон [-1.0, -2.0/3.0] для первого, [-2.0 /3.0, -1.0/3.0] для второго и т. Д.

Другой вариант заключается в том, что вы используете орфографическую проекцию, которая делает определение прямоугольников еще более удобным. Например, диапазон [0,0, 6,0] для й и [0,0, 1,0] при у бы сделать это особенно легко:

gl.glOrthof(0.0f, 6.0f, 0.0f, 1.0f, -1.0f, 1.0f); 

Тогда все прямоугольники имеет у-диапазон [0,0, 1,0], то первый прямоугольник имеет x-диапазон [0.0, 1.0], второй прямоугольник [1.0, 2.0] и т. д.

BTW, если вы только начинаете с OpenGL, я передам ES 1.x и непосредственно изучать ES 2.0. ES 1.x - это устаревший API на данный момент, и я бы не использовал его для какой-либо новой разработки.

+0

Спасибо за ваш ответ! Сейчас я перехожу к GLES 2.0; будут ли два решения, которые вы наметили, одинаковы для GLES 2.0? – Cody

Смежные вопросы