Первый ответ на ваш последний пункт: нет комманда "viewpo i nt". Существует glViewport , который определяет отображение из так называемого пространства клипа [-1,1] × [-1,1] × [-1,1] в пространство окна / экрана - важно: glViewport не устанавливает какое-либо ограничение, поэтому, если ваш видовой экран покрывает только небольшую, среднюю часть вашего окна, то объекты, которые превышают область просмотра при рендеринге, могут / будут вызывать артефакты за пределами области просмотра. Тестирование ножницами (включается и устанавливается с помощью * glEnable (GL_SCISSOR_TEST) * и glScissor ) выполняет такое ограничение, которое также работает в области просмотра (хорошо для реализации выделения резиновых полос!).
Теперь рассмотрим ваш первый вопрос: система координат OpenGL - это то, что вы хотите; в OpenGL-3.1 и OpenGL-4 вообще нет системы координат по умолчанию! В OpenGL-2 и ниже существует ряд так называемых матриц преобразования , наиболее важно модель просмотра и проекция .
Вы можете думать, что проекция - это своего рода объектив камеры (хотя он работает совершенно иначе). Что делает, так это то, что он преобразует пространство world (или представление модели) в вышеупомянутое пространство клипа . Именно эта матрица проекции позволяет вам отображать любую аффинную систему координат в пространство клипа. OpenGL до версии 3 предоставляет вспомогательные функции glFrustum и glOrtho для наиболее часто используемых проекций: перспектива и орто.
Давайте сами построим некоторую проекцию (это орто, но я бы хотел показать, как все работает на математической стороне). Скажем, вы хотите отобразить x в [0; 200], у в [0; 100] до [-1; 1] (слева направо), [-1,1] (сверху вниз) и оставьте z как есть. Тогда
x_clip = -1 + x*(1-(-1))*(200-0) = -1 + x*2/200
y_clip = 1 + y*(-1 1 )*(100-0) = 1 + x*(-2)/100
z_clip = z
Это переводится в следующую матрицу:
2/200 0 0 -1
0 -2/100 0 1
0 0 1 0
0 0 0 1
Теперь вы можете поместить это в матрицу проекции, используя glLoadMatrix .
Матрица modelview используется для перемещения вещей в мировом пространстве. Он также используется для определения точки обзора: в OpenGL нет камеры. Вместо этого мы просто перемещаем весь мир в противоположность тому, как мы переместили камеру в мире к желаемой точке обзора (на этот раз ... точка, а не ... порт!)