Ну, это не удивительно, что по умолчанию система координат экрана OpenGL довольно сложна для работы с осью x: от -1,0 до 1,0, ось y: от -1,0 до 1,0 и (0,0,0,0) в центре экрана.Пример системы координат игры OpenGL - сделано правильно?
Так я решил написать какую обертку для местных игр с следующими координатами основных идеями:
- Coords экран будет 0..100.0 (ось х), 0..100.0 (оси у) с (0.0,0.0) в левом нижнем углу экрана.
- Существуют различные экраны с различными аспектами.
- Если мы нарисуем квадроцикл, он должен оставаться квадрантом, а не раздавленным прямоугольником.
По четырехугольника я имею в виду
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;
}
и альта, мы получите правильную форму в правильном месте.
Но вопрос в том, что я делаю это правильно?
IIRC текстурные координаты и т. Д. Все работают так же. Так может быть много работы по внедрению по всем направлениям. –