我有以下代码将快照带到帧缓冲区。我验证了framebuffer正常工作,相机正确对着物体。我曾经正确地完成了图片,但它是基于错误的代码,使用错误的视锥体。所以我决定重新开始(带着支柱)。
对象位于中间,为32 * 32块,每块为2 * 2,因此为64 * 64。
我的距离是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。没有运气。
答案 0 :(得分:4)
你不应该同时使用glFrustum和gluProjection。它们都是设置投影矩阵的操作,如果你一起使用它们,你会将它们相乘,得到一个奇怪的结果。通常,您只需在单位矩阵上应用glFrustum OR gluProjection,而不是两者。
如果这不能解决问题,你的NEAR,FAR,WIDTH和HEIGHT值是多少? 还要确保你没有对屏幕比例进行整数除法(一个常见的错误)。