1

我正在尝试编写一个自我练习程序来测试我的知识是否正确。但现在我发现透视图有问题

我正在使用新的 glfw 3 :)

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);

    //Pressing A key to pull the object up one unit 
    if( key==65 && action==GLFW_PRESS){
        glMatrixMode(GL_MODELVIEW);
        glTranslatef(0, 0, 1);
    }
}


int main(int argc, char *argv[])
{
    init();
    GLFWwindow *window=initWindow(800, 600, "Projection Testing");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,800/ static_cast<float>(600), 4, 10);
    //glOrtho(0, width/ (float)height, 0, 1, -10, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);

    while (!glfwWindowShouldClose(window))
    {

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);



        glBegin(GL_QUADS);

        glVertex3f(0,0,0); 
        glVertex3f(800/ static_cast<float>(600),0,0);
        glVertex3f(800/ static_cast<float>(600),1,0); 
        glVertex3f(0,1,0);


        glEnd();


        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}

注意这里

gluPerspective(90,800/ static_cast<float>(600), near clipping plane, 10);

我很确定其他代码是正确的......

我的眼睛被设置在位置 (0, 0, 5) 并以 FOV=60 度看着 (0, 0, 0)。

我知道对象必须在截锥体中才能被看到。如果我将剪裁平面附近设置为 4,我需要按 2 次 A 键才能使正方形消失(第二次使对象脱离平截头体)如果我将其设置为 2,我需要 4 次按 A 键才能让方块消失

但是,如果我将其设置为 1,则需要 4 次而不是 5 次,我不知道为什么

对不起,我的英语不好..

4

1 回答 1

1

由于我在半睡半醒的时候通过手机盲拍是正确的,所以下面是正确形式的答案:

第一个问题

由于浮点数舍入,结果有所不同。您在这里所做的是将平面(没有深度的对象)放置在与剪切平面相同的深度上。这是您通常要避免的事情,因为它会导致诸如Z-fighting之类的问题或您的案例中的不一致。

经验法则是,您永远不应该比较浮点数的相等性,而不是子相等性,尽管在这种情况下,没有设置它的选项,我会简单地避免使用 Z 等于剪辑-Z 进行绘制(正如您在评论中所说.

第二个问题

http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/ViewFrustum.svg/

如您所见,有一个明确定义的原点。您问

为什么近和远的组合不影响投影正方形的大小?

简而言之,这是因为截锥体的形状没有改变。当您移动near平面时,所有计算都基于从该平面到原点的距离。这实际上就是为什么我们不能有一个剪切平面的原因Z = 0(这意味着从原点到平面的距离是 0,并且由于我们不想除以那个数字,它会产生明显的问题)。您需要查看透视计算方程才能真正得到它,但维基百科比我解释得更好。

于 2013-07-30T08:59:08.217 回答