У меня есть следующий код, который делает снимки в кадровый буфер.Я проверил, что кадровый буфер работает правильно, и камера правильно смотрит на объект.Раньше я делал картинки правильно, но это было основано на неправильном коде с использованием неправильного усеченного конуса.Поэтому я решил начать с нуля (с усеченными концами).
Объект центрирован посередине и состоит из 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.Не повезло.