c++ - gluPerspective在什么情况下会看到顶点?

标签 c++ opengl glfw

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

我正在使用新的 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)。

我知道物体必须在截锥体中才能被看到。 如果我把near clipping plane设置为4,我需要按2次A键才能让方 block 消失(第二次让物体脱离平截头体) 如果我设置为2,我需要按4次A键才能让方 block 消失

但是如果我把它设置为1,它需要4次而不是5次,我不明白为什么

抱歉我的英语不好..

最佳答案

由于我半睡半醒的手机盲拍是正确的,下面是正确形式的答案:

第一个问题

结果因 float 四舍五入而不同。你在这里所做的是将平面(没有深度的对象)放在与你的剪切平面相同的深度上。这是您通常要避免的事情,因为它会导致类似 Z-fighting 的问题。或您的情况下的不一致。

经验法则是你永远不应该比较 float 的相等性,而应该比较子相等性,尽管在这种情况下,没有选项来设置它,我只是避免用 Z 等于 clip-Z 来绘制(正如你所说的在您的评论中。

第二个问题

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

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

why the combination of near and far do not affect the size of the projected square?

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

关于c++ - gluPerspective在什么情况下会看到顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17941806/

相关文章:

C++ 库链接问题

c++ - 在 c++ 中的方法声明后附加 '= x'

c++ - 为什么除了 char 之外的内置类型 sizeof 在 C 和 C++ 中依赖于编译器?

opengl - 最大 OpenGL 帧缓冲区对象大小限制?

c++ - 需要以合理的精度创建自定义数据 2D 纹理

c++ - 如何在mac上使用cmake链接OpenGL相关库?

c++ - C 执行期间记录错误

c++ - CMAKE - 为库设置编译标志

c++ - 如何处理基于 quat 相机的旋转?

c# - 在 C# 中使用 GLFW 的 AccessViolationException