Здесь есть некоторая путаница.
OpenGL прав в объектном и мировом пространстве.
Но в оконном пространстве (он же экранное пространство) мы внезапно оказываемся левшами .
Как это случилось ?
Способ перехода от правшей к левым - это отрицательная запись масштабирования по z в матрицах проекции glOrtho
или glFrustum
. Масштабирование z на -1 (оставляя x и y такими, какие они были) приводит к изменению управляемости системы координат.
Для glFrustum,
дальний и близкий должны быть положительными, а дальний > ближний . Скажите far = 1000 и near = 1. Тогда C = - (1001) / (999) = -1,002.
Смотрите здесь для получения более подробной информации и диаграмм.
С орфографической точки зрения glOrtho генерирует такую матрицу:
Здесь left , right , bottom и top - это просто координаты для левой вертикальной , правой вертикальной , нижней горизонтальной , верхней горизонтальной плоскостей отсечения (соответственно) .
Однако ближняя и дальняя плоскости указываются по-разному . Рядом параметр определен как
- Рядом: расстояние до ближайшей плоскости отсечения глубины. Это расстояние отрицательно, если самолет должен быть позади зрителя.
и далеко:
- zFar Расстояние до дальней плоскости отсечения глубины. Это расстояние отрицательно, если самолет должен быть позади зрителя.
Вот типичный канонический объем просмотра
Поскольку множитель z равен (-2 / (далеко-близко)), знак минус эффективно масштабирует z на -1 . Это означает, что «z» поворачивается влево во время преобразования просмотра, без ведома большинства людей, поскольку они просто работают в OpenGL как «правосторонняя» система координат.
Итак, если вы позвоните
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
Тогда БЛИЖНИЙ САМОЛЕТ будет на 10 единиц впереди вас . Где ты? Почему в начале координат ось x находится справа от вас, ось Y находится на верхней части головы, а ваш нос направлен вниз по отрицательной оси z (это значение по умолчанию "По умолчанию камера расположена в начале координат , указывает вниз по отрицательной оси Z и имеет вектор вверх (0, 1, 0). " ). Таким образом, ближняя плоскость находится на z = -10. Дальний самолет находится на 10 единиц позади вас, на z = + 10 .