gluPerspective在什么情况下可以看到顶点?

时间:2013-07-30 08:20:37

标签: c++ opengl glfw

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

我正在使用新的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)并且看着(0,0,0),FOV = 60度。

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

但是,如果我将其设置为1,则需要4次而不是5次,我无法弄明白为什么

抱歉我的英语不好..

1 个答案:

答案 0 :(得分:1)

由于我在通过手机半睡半醒时拍摄的失误是正确的,所以答案是正确的:

第一个问题

由于浮点数舍入,结果不同。你在这里做的是将平面(没有深度的物体)放在剪裁平面所在的相同深度上。这是您想要避免的一般情况,因为它会导致像Z-fighting这样的问题或者像您的情况那样的不一致。

经验法则是你永远不应该比较浮点数是否相等,而不是比较次等式,尽管在这种情况下,没有选项来设置它,我只是简单地避免用Z等于剪辑-Z绘图(如你所说)在你的评论中。

第二个问题

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

正如您所看到的,有一个明确定义的起源点。你问过

  

为什么近距离和远距离的组合不会影响投影平方的大小?

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