OpenGL:透视图不集中在视图的中间?

OpenGL:透视图不集中在视图的中间?,opengl,transformation,perspective,vanishing-point,Opengl,Transformation,Perspective,Vanishing Point,我有一个以视口中心为中心的主场景 除此之外,我还希望在视口的角上显示另一个小对象。 问题是,当我绘制小对象时,它被主投影变换变换,并且看起来倾斜。我希望小对象的消失点位于其中心。 这可能只是变换吗?您希望主场景以一种方式投影,角点对象以另一种方式投影。这将直接引导您找到解决方案: void render() { glMatrixMode(GL_PROJECTION); setUpMainProjection(); glMatrixMode(GL_MODELVIEW);

我有一个以视口中心为中心的主场景
除此之外,我还希望在视口的角上显示另一个小对象。 问题是,当我绘制小对象时,它被主投影变换变换,并且看起来倾斜。我希望小对象的消失点位于其中心。

这可能只是变换吗?

您希望主场景以一种方式投影,角点对象以另一种方式投影。这将直接引导您找到解决方案:

void render() {
    glMatrixMode(GL_PROJECTION);
    setUpMainProjection();
    glMatrixMode(GL_MODELVIEW);
    drawMainObject();

    glMatrixMode(GL_PROJECTION);
    setUpCornerProjection();
    glMatrixMode(GL_MODELVIEW);
    drawCornerObject();
}
也许您想知道如何实现setUpCornerProjection。它看起来像这样:

// let's say r is a rect, which, in eye space, contains the corner object and is
// centered on it
glFrustum(r.left, r.right, r.bottom, r.top, nearVal, farVal);
// let's say p is the rect in screen-space where you want to
// place the corner object
glViewport(p.x, p.y, p.width, p.height);

然后在setUpMainProjection()中,您还需要调用glFrustum和glViewport。

我觉得
glViewport
需要参与进来。谢谢@shoosh:学习glViewport和glFrustum的工作原理会让您受益匪浅。简化的不精确解释:传递给glVertex的坐标位于“对象空间”中。它们通过ModelView进行变换,产生“眼睛空间”坐标系[因为当坐标系位于眼睛(相机)的中心且坐标系Z轴指向眼睛注视的位置时,这些坐标系是顶点的坐标系]。眼睛空间坐标被投影(展平)并缩放到一个从(-1,-1)到(1,1)的正方形上。然后这个正方形被拉伸以完全填充视口。@shoosh:有关详细信息,请参阅。编写一个小应用程序来试验不同的投影和视口。试着准确地得到你期望的结果,不要盲目地尝试不同的数字,直到它起作用为止。在纸上画一个平截头体,并了解如何在OpenGL中创建/使用该平截头体。