我正确到了这一点。我已经做了一些研究,但我仍然没有弄清楚这一点。
我有一个程序,用颜色绘制每个面的立方体。 然后我在Y轴和X轴上旋转这个立方体(分别为-45和+45)。
问题是它没有像我期望的那样呈现,立方体在某个时刻被剪裁了。
代码:
projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);
camera = glm::lookAt(
glm::vec3(+0.0f,+0.0f,+1.0f),
glm::vec3(0.0f,0.0f,0.0f),
glm::vec3(0.0f,1.0f,0.0f)
);
model = glm::mat4(1.0f);
model = glm::rotate(model, -45.0f, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, +45.0f, glm::vec3(1.0f, 0.0f, 0.0f));
mvp = projection * camera * model;
我定义的所有顶点都是用±0.25制作的。所以我至少认为,使用zNear和zFar的这些值,它们仍然适合音量,但是当我改变音量时
projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);
的
projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +2.0f, -1.0f);
它运作得很好
但它不适用于
projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -2.0f);
有人可以解释我为什么吗?我的意思是,我知道如果我投入更多的值,投影立方体将具有更大的体积,因此它将呈现得很好。我知道右下角顶点在多维数据集外面,zNear和zFar为+1.0和-1.0(应用矩阵后顶点值类似于1.76)但是如果我将zFar立方体扩展到-2.0f它应该只适合对,不应该?
我试着阅读红皮书上的内容,还有Peter Shirley的书籍“计算机图形学基础”。甚至自己制作了矩阵,但结果相同。
无论如何,提前谢谢!
答案 0 :(得分:4)
正在发生的事情是,立方体被相机的远剪裁平面剪掉。
超出远剪裁平面的任何内容都不会被渲染。
在原始代码中,远剪裁平面设置为+1,非常接近相机。 超过1个单位的任何东西都不会被渲染。
在您的工作代码中,您将远剪裁平面设置为+2,因此不会渲染超过2个单位的任何内容。
当立方体距离相机更近2个单位时,渲染整个立方体。
答案 1 :(得分:1)
通常,您希望近平面位于远平面之前。我不确定如果你出于某种原因使得远平面为负并且近平面为正,将会发生什么...尝试交换它们。