OpenGL Frustum, перспектива - PullRequest
0 голосов
/ 07 марта 2012

У меня есть следующий код, который делает снимки в кадровый буфер.Я проверил, что кадровый буфер работает правильно, и камера правильно смотрит на объект.Раньше я делал картинки правильно, но это было основано на неправильном коде с использованием неправильного усеченного конуса.Поэтому я решил начать с нуля (с усеченными концами).

Объект центрирован посередине и состоит из 32 * 32 блоков с каждым блоком 2 * 2, поэтому 64 * 64.

MyРасстояние 100, и мое окно просмотра 128x256.Мое усечённое от 1 до 1000.0.

Я относительно новичок в Opengl, поэтому у меня возникают проблемы с полным пониманием понятий усечений и перспектив.

У меня вообще нет изображения.

saveGLState();

const int nrPics = 360 / DEGREES_BETWEEN_PICTURES;
for (int i = 0; i < nrPics; i++) {

    catchFbo->bind();
    glViewport(0, 0, PICTURE_WIDTH, PICTURE_HEIGHT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float rat = PICTURE_WIDTH / PICTURE_HEIGHT;
    glFrustum(- 1.0, + 1.0, - rat, + rat, 1.0, 1000.0);
    gluPerspective(90.0f,rat,CAPT_FRUSTRUM_NEAR,CAPT_FRUSTRUM_FAR);

    glColorMask(true, true, true, true);
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_MULTISAMPLE);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    drawScreenshot(i);
    catchFbo->release();

    QImage catchImage = catchFbo->toImage();
    catchImage.save("object/test" + QString::number(i) + ".png");
}

glDisable(GL_MULTISAMPLE);
restoreGLState();

void VoxelEditor::saveGLState()
{
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
}

void VoxelEditor::restoreGLState()
{
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glPopAttrib();
}

РЕДАКТИРОВАТЬ: я пытался использовать только glFrustum или glPerspective.Не повезло.

1 Ответ

4 голосов
/ 07 марта 2012

Вы не должны использовать как glFrustum, так и gluProjection. Они оба являются операциями, которые устанавливают матрицу проекции, и если вы используете их вместе, вы умножите их вместе и получите странный результат. Как правило, вы просто применяете glFrustum ИЛИ gluProjection на единичную матрицу, а не на обе.

Если это не решит проблему, каковы ваши значения NEAR, FAR, WIDTH и HEIGHT? Также убедитесь, что вы не делите целочисленное деление на соотношение сторон экрана (распространенная ошибка).

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