gpt4 book ai didi

c++ - OpenGL 平截头体、透视

转载 作者:行者123 更新时间:2023-11-27 23:25:51 31 4
gpt4 key购买 nike

我有以下代码将快照拍摄到帧缓冲区。我验证了帧缓冲区工作正常并且相机正确地面向对象。我曾经正确地完成图片,但它是基于错误的代码,使用了错误的截锥体。所以我决定重新开始(使用截锥体)。

物体以中间为中心,有32*32 block ,每 block 2*2,所以64*64。

我的距离是 100,视口(viewport)是 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。运气不好。

最佳答案

您不应同时使用 glFrustum 和 gluProjection。它们都是设置投影矩阵的操作,如果你一起使用它们,你会把它们相乘并得到一个奇怪的结果。通常,您只需在单位矩阵上应用 glFrustum OR gluProjection,而不是同时应用两者。

如果这不能解决问题,那么您的 NEAR、FAR、WIDTH 和 HEIGHT 值是多少?还要确保您没有对屏幕比例进行整数除法(常见错误)。

关于c++ - OpenGL 平截头体、透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606160/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com