我正在尝试编写一个 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 来绘制(正如你所说的在您的评论中。
第二个问题
如您所见,有一个明确定义的原点。你问
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/