Инвертирование оси Y и установка системы координат в OpenGL - PullRequest
8 голосов
/ 13 мая 2011

В OpenGL я пытаюсь инвертировать ось y и установить определенный тип системы координат, такой же, как у Allegro.Предполагая, что мое окно 640x480, я хочу, чтобы верхний левый угол экрана был осью (0, 0), а нижний правый (640, 480).До сих пор мне удалось получить правильную систему координат, которую я хочу, но я не знаю, правильно ли это сделано.Что касается переворачивания оси Y, я не смог инвертировать ее, не изменив систему координат, которая у меня сейчас есть.Я не хочу что-то хакерское, только чтобы перевернуть 1 форму.Я хочу, чтобы он перевернул все будущие фигуры, которые я создаю на оси Y, сохраняя при этом систему координат.Вот что у меня есть.

Инициализация:

const GLdouble XSize = 640, YSize = 480;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, XSize, YSize, 0, 1, 1000);
glMatrixMode(GL_MODELVIEW);

Визуализация:

float size = 30;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -500);

glPushMatrix();
glTranslatef(size, size, 0.0f);

glBegin(GL_TRIANGLES);
glColor3f(0.1, 0.3, 0.8);
glVertex3f( 0.0f, size, 0.0f);
glVertex3f(-size,-size, 0.0f);
glVertex3f( size,-size, 0.0f);
glEnd();
glPopMatrix();

Редактирование:

Я понял, что добавление glScalef(1, -1, 1);перевернет мою фигуру, но я должен включить ее в glPushMatrix () моих фигур, и я не знаю, является ли это правильным способом сделать это или это хакерское решение.

Ответы [ 3 ]

1 голос
/ 03 июня 2016

Для изменения системы координат требуется масштаб и перевод в этом порядке.

// Initialize OpenGL matrices
void init_gl() {
    const float WIDTH = 640.0f;
    const float HEIGHT = 480.0f;

    const float HALF_WIDTH = WIDTH / 2.0f;
    const float HALF_HEIGHT = HEIGHT / 2.0f;

    // Setup the projection matrix
    glMatrixMode(GL_PROECTION);
    glLoadIDentity();
    glOrtho(0, WIDTH, HEIGHT, 0.0f, 0.0f, 1000.0f);

    // Setup the Allegro-to-view matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(-HALF_WIDTH, HALF_HEIGHT, 0.0f);
    glScalef(1.0f, -1.0f, 1.0f);
}

// Render scene
void render() {
    // Now render using points in Allegro coordinates
    const float size = 30.0f;
    glBegin(GL_TRIANGLES);
    glColor3f(0.1f, 0.3f, 0.8f);
    glVertex3f( 0.0f,  size, 0.0f);
    glVertex3f(-size, -size, 0.0f);
    glVertex3f( size, -size, 0.0f);
    glEnd();
}

Обратите внимание, что glTranslatef предшествует glScalef, потому что матрицы преобразования умножаются справа от текущего значения матрицы. Кроме того, вам не нужно устанавливать матрицу Allegro-to-view для каждого кадра; один раз во время инициализации достаточно для большинства случаев использования. Однако вы можете нажать GL_MODELVIEW и применить любые необходимые преобразования модели.


Вот концептуальный анализ того, как это работает. Цель состоит в том, чтобы позволить вам, графическому программисту, указать точки, используя «Allegro» или требуемые координаты, то есть координаты, где начало координат находится в верхнем левом углу ортографической проекции (в данном случае это относится непосредственно к экрану). Для этого вы устанавливаете матрицу вида GL_MODELVIEW для преобразования из этих желаемых координат в координаты орфографической камеры (также известные как пространство обзора или пространство глаза).

Сначала вы переориентируете (масштабируете) ось y желаемых координат, чтобы соответствовать координатам вида (средняя фигура). Во-вторых, вы переводите начало координат нужных координат, чтобы они соответствовали координатам вида. Этот перевод выполняется относительно координат вида (т. Е. Начало координат вида составляет половину экрана по горизонтали вправо и половину экрана по вертикали вниз). Этот последний шаг эквивалентен преобразованию точек в противоположном направлении сдвига.

Символически шкала преобразует точку P = (P.x, P.y) в P' = (P.x, -P.y). Преобразование преобразует точку P' в P'' = (P.x - w/2, P.y + h/2), где w - ширина экрана (480 пикселей), а h - высота (640 пикселей). (Извините, окончательная диаграмма неправильно переключает h и w на P'', потому что я не очень хорошо умею делать диаграммы на SO).

Обратите внимание, что ось z указывает на экран, поскольку мы не масштабировали его на -1.

Способ, которым я предпочитаю концептуализировать изменения систем координат (точнее, изменение кадров , когда мы включаем понятие происхождения), заключается в том, что мы модифицируем базисные векторы (x, y и т. Д.) .) и начало координат с последующими операциями масштабирования, поворота и перевода (в указанном порядке). Это очень похоже на то, как мы концептуализируем перемещение камеры, применяя переводы в направлении, противоположном движению камеры.

Roughly drawn diagram of the two transformations

1 голос
/ 13 мая 2011

В этом случае вам лучше настроить проекцию (представьте, что это «камера»).

Проверьте ответ tzaman здесь: Изменение системы координат OpenGL

0 голосов
/ 27 мая 2011

Вы должны прочитать: http://www.opengl.org/documentation/specs/version2.0/glspec20.pdf Это очень четко прописывает все преобразования координат. Следите за тем, как ваши входные данные glVertex проходят через модель и проекцию, затем обратите внимание на то, как они становятся нормализованными координатами окна и пикселями оттуда. Это достаточно для чтения, и вам нужно выполнить все шаги на бумаге, чтобы действительно понять это. Но оно того стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...