Для изменения системы координат требуется масштаб и перевод в этом порядке.
// 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 и т. Д.) .) и начало координат с последующими операциями масштабирования, поворота и перевода (в указанном порядке). Это очень похоже на то, как мы концептуализируем перемещение камеры, применяя переводы в направлении, противоположном движению камеры.