我正在使用新的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次,我无法弄明白为什么
抱歉我的英语不好..答案 0 :(得分:1)
由于我在通过手机半睡半醒时拍摄的失误是正确的,所以答案是正确的:
由于浮点数舍入,结果不同。你在这里做的是将平面(没有深度的物体)放在剪裁平面所在的相同深度上。这是您想要避免的一般情况,因为它会导致像Z-fighting这样的问题或者像您的情况那样的不一致。
经验法则是你永远不应该比较浮点数是否相等,而不是比较次等式,尽管在这种情况下,没有选项来设置它,我只是简单地避免用Z等于剪辑-Z绘图(如你所说)在你的评论中。
正如您所看到的,有一个明确定义的起源点。你问过
为什么近距离和远距离的组合不会影响投影平方的大小?
简而言之,这是因为截锥体的形状不会改变。移动near
平面时,所有计算都基于从该平面到原点的距离。这实际上就是为什么我们不能在Z = 0
处有一个剪裁平面(这意味着从原点到平面的距离是0,因为我们不想除以那个数字,它会产生明显的问题)。您需要查看透视计算公式才能真正得到它,但Wikipedia比我更好地解释了它。