2013-02-08 4 views
0

Ну, это не удивительно, что по умолчанию система координат экрана OpenGL довольно сложна для работы с осью x: от -1,0 до 1,0, ось y: от -1,0 до 1,0 и (0,0,0,0) в центре экрана.Пример системы координат игры OpenGL - сделано правильно?

Так я решил написать какую обертку для местных игр с следующими координатами основных идеями:

  1. Coords экран будет 0..100.0 (ось х), 0..100.0 (оси у) с (0.0,0.0) в левом нижнем углу экрана.
  2. Существуют различные экраны с различными аспектами.
  3. Если мы нарисуем квадроцикл, он должен оставаться квадрантом, а не раздавленным прямоугольником.

По четырехугольника я имею в виду

quad_vert[0].x = -0.5f; 
quad_vert[0].y = -0.5f; 
quad_vert[0].z = 0.0f; 

quad_vert[1].x = 0.5f; 
quad_vert[1].y = -0.5f; 
quad_vert[1].z = 0.0f; 

quad_vert[2].x = -0.5f; 
quad_vert[2].y = 0.5f; 
quad_vert[2].z = 0.0f; 

quad_vert[3].x = 0.5f; 
quad_vert[3].y = 0.5f; 
quad_vert[3].z = 0.0f; 

Я буду использовать GLM :: орто и GLM :: mat4 для достижения этой цели:

#define LOC_SCR_SIZE 100.0f 

typedef struct coords_manager 
{ 
float SCREEN_ASPECT; 
mat4 ORTHO_MATRIX;//glm 4*4 matrix 
}coords_manager; 

glViewport(0, 0, screen_width, screen_height); 

coords_manager CM; 

CM.SCREEN_ASPECT = (float) screen_width/screen_height; 

Например наш аспект будет 1.7

CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE, 0.0f, LOC_SCR_SIZE); 

Теперь нижний левый угол (0,0) и верхний правый (100,0, 100,0)

И это работает, в основном, теперь мы можем перевести наш квадратик на (25,0, 25,0), масштабируем его до (50,0, 50,0), и он будет сидеть в нижнем левом углу с размером 50% экрана. Но проблема в том, что он не квад больше, он выглядит как прямоугольник, потому что ширина экрана не равна высоте.

Поэтому мы используем наш экран аспект:

CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE * CM.SCREEN_ASPECT, 0.0f, LOC_SCR_SIZE); 

Да, мы получаем правильную форму, но еще одна проблема - если поместить его в (50,25), мы получаем любопытное налево, то центр экрана, потому что наш местный система не 0..100 оси х больше, теперь 0..170 (потому что мы умножаем на нашем аспекте 1.7), поэтому мы используем следующую функцию перед установкой нашего четырехъядерного перевода

void loc_pos_to_gl_pos(vec2* pos) 
{ 
pos->x = pos->x * CM.SCREEN_ASPECT; 
} 

и альта, мы получите правильную форму в правильном месте.

Но вопрос в том, что я делаю это правильно?

+0

IIRC текстурные координаты и т. Д. Все работают так же. Так может быть много работы по внедрению по всем направлениям. –

ответ

1

Система экранных углов OpenGL довольно сложна для работы с осью x: от -1,0 до 1,0, ось y: от -1,0 до 1,0 и (0,0,0,0) в центре экрана.

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

мы получаем любопытное налево, то центр экрана, потому что наша локальная система не 0..100 оси х больше,

Именно поэтому OpenGL отображает NDC пространство (0,0,0) к центру экрана. Если вы нарисуете квадрант с координатами, расположенными симметрично вокруг начала координат, он останется в центре.

Но вопрос в том, что я делаю это правильно?

В зависимости от того, чего вы хотите достичь.

+0

Так лучше ли моя система симметрична с 0.0 в центре? Проекционная орто-матрица будет CM.ORTHO_MATRIX = орто (-LOC_SCR_SIZE * CM.SCREEN_ASPECT, LOC_SCR_SIZE * CM.SCREEN_ASPECT, -LOC_SCR_SIZE, LOC_SCR_SIZE); – Aristarhys

+0

@Aristarhys: Нет решения «одного размера для всех». Вы выбираете проекцию и моделирование в соответствии с заданием. Кроме того, вы не ограничены только одной проекцией для визуализации кадра. Вы можете, и на самом деле, настроить его для того, что вы рисуете. Вы рисуете какой-то 3D-мир: используйте проекцию. Затем вы нарисовываете HUD поверх него, поэтому вы переключаетесь на ортопроекцию. – datenwolf

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