Я не могу понять, что делает функция gluOrtho2D()? Исправляет ли он начало координат в какой-то конкретной точке окна OpenGL или что-то еще?
Это потому, что gluOrtho2D(1,1,1,1) фиксирует начало координат в середине окна.
Если в какой-то момент он не фиксирует исходную точку, то есть ли способ исправить ее, потому что я прочитал, что не существует такой вещи, которая называется «Координаты окна OpenGL»?
Я читал, что gluOrtho2D(0,640,480,0) фиксирует начало координат в верхнем левом углу окна, но как мне узнать, где он смещается, если в качестве параметров отправляются другие значения?





gluOrtho2D устанавливает матрицу Ортографическая проекция с заданными левым, правым, верхним и нижним, но фиксированными ближней и дальней плоскостями -1 соответственно 1.
gluOrtho2D( left, right, bottom, top );
Это значит, что
gluOrtho2D(0,640,480,0)
создает матрицу проекции, которая отображает 0 на левую границу области просмотра, 640 - на правую, 480 - на нижнюю и 0 - на верхнюю.
Значения left, right, bottom, top, near и far определяют поле. Вся геометрия, которая находится внутри объема бокса, «видна» в окне просмотра.
Матрица проекции описывает сопоставление трехмерных точек сцены с двухмерными точками области просмотра. Он преобразуется из пространства глаз в пространство клипа, а координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) путем деления на компонент w координат клипа. NDC находятся в диапазоне от (-1, -1, -1) до (1,1,1) .
Каждая геометрия, выходящая за пределы области отсечения, обрезается.
В ортогональной проекции координаты в пространстве глаз линейно отображаются в нормализованные координаты устройства, а координаты пространства клипа равны нормализованным координатам устройства, потому что компонент w равен 1 (для Декартова координата).
Матрица ортогональной проекции:
r = right, l = left, b = bottom, t = top, n = near, f = far
2/(r-l) 0 0 0
0 2/(t-b) 0 0
0 0 -2/(f-n) 0
-(r+l)/(r-l) -(t+b)/(t-b) -(f+n)/(f-n) 1
В дополнение к @ Rabbid76 ответ:
This is because gluOrtho2D(1,1,1,1) fixes the origin at the middle of the window.
Нет. gluOrtho2D(1,1,1,1) этого не делает. Он генерирует ошибку GL_INVALID_VALUE и оставляет текущую матрицу нетронутой. Не разрешается устанавливать left=right или top=bottom, так как это не имеет никакого геометрического смысла, а также приведет к делению на ноль в матрице.
Поскольку у вас, скорее всего, есть матрица идентичности, загруженная в стек матриц перед вызовом gluOrtho2D, в конечном итоге вы получите просто матрицу идентичности, что означает, что ваш объем просмотра представляет собой выровненный по оси куб -1 <= x, y, z <= 1.