Справка OpenGL о координатах в перспективе - PullRequest
0 голосов
/ 13 ноября 2011

Это то, что долго расстраивало меня (десятки часов) перед компьютером и Google, но я до сих пор не решил.Я довольно новичок в openGL, и я начал читать учебники в сети в течение последних 2-3 месяцев, а также экспериментировать с некоторым кодом.Моя главная проблема заключается в том, что когда я перешел от Ортогональной проекции к Перспективе, я все время взрывал, как управлять и рисовать простую форму на экране.Я очень мало знаю о матрицах, но дело в том, что в ортогональной проекции я указываю координаты x, y, z объекта, и это координаты окна.В перспективе я не видел, как применяются координаты.Я видел диапазоны от -1 до 1 или даже от -20 до 20 и т. Д. Я читал, что вы можете указать координаты на openGL, но как мне это сделать?В Orthographic я делаю это:

Размер окна 800x600. Я хочу, чтобы окно было целым окном, поэтому

glVertex2i( 0, 600 );
glVertex2i( 0, 0 );
glVertex2i( 800, 0 );
glVertex2i( 800, 600 );

Но как насчет проекции?Когда я ставлю 1, это в конце окна и -1 в начале.Как opengl определяет начало / конец окна и почему это -1 к 1 ???Это чертовски непонятно, если бы кто-нибудь мог мне помочь, я был бы очень признателен.Спасибо.

1 Ответ

1 голос
/ 14 ноября 2011

Сначала вы настраиваете матрицы проекции и вида модели для 3D-проекции:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, ratio, near_clip, far_clip);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz);

gluLookAt занимает 3 вектора, положение «глаза» камеры, взгляд на точку и «вектор вверх». Если вы вызываете gluLookAt (0.0, 0.0, -10.0, 0,0,0, 0,1,0), это означает, что камера сидит в 0,0, -10 и смотрит вдоль оси z в начало координат 0,0,0. и «вверх» вдоль положительной оси у. Если вы затем сделаете простой вызов отрисовки для opengl для одного квада, он должен появиться в вашем рендеринге:

glColor3f(1.0f,1.0f,1.0f); //set white color (or any contrast to your background)
glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();

Вы рисуете по часовой стрелке или против часовой стрелки, но не в их комбинации. Вы можете управлять отбраковкой с помощью glEnable / Disable (GL_CULL_FACE) и glCullFace.

Размер окна 800x600. Я хочу, чтобы окно было целым окном, поэтому

Когда вы работаете с 2D-проекциями (орфографическими), вы можете легко установить размер вашей системы координат в соответствии с размером вашего окна / окна просмотра. Это не применимо в 3D-проекции, поскольку границы теперь представляют собой 3D-зону просмотра или объем 3D от ближнего клипа до дальних плоскостей клипа. Затем координаты проецируются на 2D-поверхность с помощью матрицы проекции модель-вид. Вы можете легко ввести координаты, например, для квадрата шириной 800 и высотой 600, но чтобы увидеть его, вам нужно отвести камеру далеко, чтобы захватить весь видимый квад.

Цитата из комментариев:

gluPerspective (45.0f, (double) w / (double) h, 1.0f, 100.0f) должно установить перспективу с ближним = 1 и дальним = 100. Но поскольку openGL правша, положительный z равен вне экрана так близко должно быть 100 и далеко 1. Почему я вижу в каждом уроке почти меньше, чем далеко? Это не имеет смысла ..

Ответ (см. Ссылку выше 3D просмотр видео):

Угроза просмотра - это объем 3D в сцене, расположенной относительно камеры области просмотра. Форма объема влияет на то, как модели проецируются из пространства камеры на экран

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