OpenGL ES 2.0 для 2D, как установить начало координат слева вверху - PullRequest
3 голосов
/ 20 октября 2011

Я думаю, что это уже обсуждалось ранее, но я не могу найти ответ, который мне подходит.

Я занимаюсь разработкой приложения для 2D-рисования для iPad с OpenGL ES 2.0.

Я создаю матрицу проекции орто с функцией, описанной в книге «Программирование на iPhone 3D», и, насколько я знаю, эта матрица верна.Вызов функции выглядит примерно так:

proj = identity.Ortho(-width/2, width/2, -height/2, height/2, -1.0f, 1.0f);

Он работает нормально, но он помещает начало координат в центр области просмотра.Мне нужно получить сенсорную информацию от пользователя, чтобы нарисовать, поэтому я хотел бы, чтобы источник находился в верхнем левом углу.

Я знаю, что мне это не нужно, поскольку я могу просто вычесть (ширина / 2, высота / 2), но все было бы проще, если бы источник находился в TL.

Итак, я попробовал это:

proj = identity.Ortho(0, width, 0, height, -1.0f, 1.0f);

Но это не работает вообще, если я рисую прямоугольник, я просто вижу некоторые линии или треугольники, когда я вращаю матрицу viewModel, это как будто оно искажается.*

Спасибо.

1 Ответ

4 голосов
/ 20 октября 2011

С identity.Ortho(0, width, 0, height, -1.0f, 1.0f) вы были на правильном пути.Но это позволит расположить начало координат в левом нижнем углу (так как он все еще работает в правостороннем трехмерном пространстве, а не в пространстве экрана, поэтому y поднимается вверх, а x - вправо).Вместо этого просто поменяйте местами верх и низ, используя

proj = identity.Ortho(0, width, height, 0, -1.0f, 1.0f);

Но имейте в виду, что, поскольку это отражает направление y (как вы этого хотите), оно инвертирует ориентацию любых нарисованных треугольников, поворачивая счетчикориентированные по часовой стрелке треугольники по часовой стрелке.Это на самом деле не проблема, вам просто нужно помнить об этом, когда вы делаете вещи, основанные на ориентации треугольника (например, отбраковка задней поверхности, двусторонние материалы, ...), и это можно объяснить с помощью glFrontFace для переключения порядка намотки на передней стороне по умолчанию.Но так как вы хотите сделать 2d, ориентация треугольника и отбор задних граней не будут для вас проблемой, в любом случае.

...