Как изменить перспективу просмотра в OpenGL? - PullRequest
1 голос
/ 27 мая 2020

Я рисую много линий, чтобы сформировать сетку. Я хочу, чтобы сетка поворачивалась вокруг оси X, но я никогда не получаю желаемого результата. Я пробовал glRotatef и gluLookAt, которые не работают так, как я хочу. См. Изображения ниже.

это сетка

вот как я хочу это видеть

Редактировать: боже, размещение кода здесь тоже сложно, лол, в любом случае вот он. Edit2: удалено, оставьте только код, в котором есть проблемы.

Пожалуйста, найдите код ниже, независимо от того, как я установил gluLookAt, результат сетки не будет в той перспективе, которую я хочу.

#include <GL/glut.h>

void display() {

    ...

    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_LINES);
    for (int i = 0; i < 720; i += 3)
    {   
        glColor3f(0, 1, 1);
        glVertex3f(linePoints[i], linePoints[i + 1], linePoints[i + 2]);
    }
    glEnd();

    glFlush();
}
void init() {

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 4.0 / 3.0, 1, 40);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, -2, 1.25, 0, 0, 0, 0, 1, 0);
}

1 Ответ

0 голосов
/ 27 мая 2020

Предположим, что у вас есть сетка в плоскости xy мира:

glColor3f(0, 1, 1);
glBegin(GL_LINES);
for (int i = 0; i <= 10; i ++)
{   
    // horizontal
    glVertex3f(-50.0f + i*10.0f, -50.0f, 0.0f);
    glVertex3f(-50.0f + i*10.0f,  50.0f, 0.0f);

    // vertical
    glVertex3f(-50.0f, -50.0f + i*10.0f, 0.0f);
    glVertex3f( 50.0f, -50.0f + i*10.0f, 0.0f);
}
glEnd();

Убедитесь, что расстояние от до дальней плоскости проекции достаточно велико (см. gluPerspective). Вся геометрия, которая не находится между ближней и дальней плоскостью усеченной области обзора , обрезается.
Более того, убедитесь, что соотношение сторон (4,0 / 3,0) соответствует соотношению прямоугольника окна просмотра (окно ).

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 4.0 / 3.0, 1, 200);

Для использования gluLookAt верхний вектор обзора должен быть перпендикулярен сетке. Если сетка расположена параллельно плоскости xy, то вектор вверх - это ось z (0, 0, 1).
Цель (центр) - это центр сетки (0, 0, 0).
Точка обзора (положение глаз) должна быть выше и перед сеткой, например (0, -55, 50). Обратите внимание, что точка обзора используется для сетки с нижним левым от (-50, -50, 0) и верхним правым от (50, 50, 0).

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -55.0, 50.0, 0, 0, 0, 0, 0, 1);

...