Как масштабировать 2d мир с помощью 3D-рендеринга? - PullRequest
5 голосов
/ 15 февраля 2012

Я использую 3D-режим для рендеринга 2-мерной игры, потому что вращение и увеличение / уменьшение камеры намного проще, чем в 2-мерном режиме.

Теперь я столкнулся с проблемой, о которой не могу думатькак исправить:

  • Как сделать так, чтобы 2D-плоскость моего мира соответствовала экрану так, чтобы 1 пиксель текстуры соответствовал 1 пикселю на моем экране?Другими словами: как рассчитать z-положение моей камеры для достижения этой цели?

Мои текстовые координаты начинаются с 0 и заканчиваются на 1, поэтому я могу видеть все пиксели из одной плитки вGL_NEAREST режим текстурного фильтра.

Размер моего окна можно изменять, чтобы мои плитки всегда были квадратами, но видимая область расширялась в зависимости от того, как я изменял размеры моего окна.

Редактировать: мой порт просмотра использует перспективный режим, а не изометрический.но если это невозможно в режиме перспективы, я готов изменить его на изометрический.

1 Ответ

2 голосов
/ 15 февраля 2012

Используйте ортографическую проекцию, которая отображает единицы измерения пространства глаза в пикселях:

glViewport(0,0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);

Обновление в связи с обновлением вопроса:

Тексель → сопоставление пикселей в окне просмотра возможно с перспективной проекцией, нотолько при определенном ограничении: текстурированный квадрат должен быть копланарен перспективному усечению вблизи / в дальней плоскости.

Как это сделать?Для glFrustum(left, right, bottom, top, near, far) с Z = ближним, диапазон пространства глаза XY [влево, вправо] × [низ, верх] отображается на NDC xy [-1, 1] ², а NDC xy [-1, 1] ² отображается на экстенты области просмотра,Таким образом, все эти аффинные преобразования следуют закону

y(x) = to_lower_bound + (x - from_lower_bound) * (to_upper_bound - to_lower_bound) / (from_upper_bound - from_lower_bound)

Все, что вам нужно сделать, это отобразить видовой экран в NDC на ближнюю плоскость, и если вы Z = / = ближний масштаб вблизи / Z.

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