Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL:任何顶点Z坐标是否必须为负?_Opengl_Glm Math - Fatal编程技术网

OpenGL:任何顶点Z坐标是否必须为负?

OpenGL:任何顶点Z坐标是否必须为负?,opengl,glm-math,Opengl,Glm Math,我知道OpenGL中的相机被定义为在负Z方向上观看。因此,在一个简单的示例中,我认为要渲染顶点,它们的定义必须类似于以下内容: rawverts = { 0.0f, 0.0f, -1.0f, 0.0f, 0.5f, -1.0f, 0.5f, 0.0f, -1.0f, }; 然而,绝对没有向导会告诉我答案。无论我在哪里看,“Hello triangle”示例都是在z坐标保持为0的情况下创建的,并且每当定义更复杂的网格时,甚至都不会显示坐标。我仍然不知道在屏幕上绘制坐标的可

我知道OpenGL中的相机被定义为在负Z方向上观看。因此,在一个简单的示例中,我认为要渲染顶点,它们的定义必须类似于以下内容:

rawverts = {
    0.0f, 0.0f, -1.0f,
    0.0f, 0.5f, -1.0f,
    0.5f, 0.0f, -1.0f,
};
然而,绝对没有向导会告诉我答案。无论我在哪里看,“Hello triangle”示例都是在z坐标保持为0的情况下创建的,并且每当定义更复杂的网格时,甚至都不会显示坐标。我仍然不知道在屏幕上绘制坐标的可能值。以glm::perspective为例:

glm::mat4 projectionMatrix = glm::perspective(
    FoV,         // The horizontal Field of View, in degrees : the amount of "zoom". Think "camera lens". Usually between 90° (extra wide) and 30° (quite zoomed in)
    4.0f / 3.0f, // Aspect Ratio. Depends on the size of your window. Notice that 4/3 == 800/600 == 1280/960, sounds familiar ?
    0.1f,        // Near clipping plane. Keep as big as possible, or you'll get precision issues.
    100.0f       // Far clipping plane. Keep as little as possible.
);
但是,如何使用任何正值定义剪裁平面?相机面向-Z方向!此外,如果我在,-1和-4处创建近/远剪裁平面,这会使任何大于-1或小于-4的Z坐标无效吗?或者原始z坐标仅在0和-1之间有效(同样,z坐标绝对不能为正?)

但让我们假设实际发生的情况是OpenGL(或glm)获取剪裁平面值并秘密地否定它们。所以,我的-1到-4变成了1到4。这是否会使任何小于1且大于4的Z坐标失效,这就是为什么
0.0f,0.0f,-1.0f
不会在屏幕上绘制的原因


在这个阶段,我将把答案视为指向一本书或某个材料的指针,该书或材料中有关于这个问题的信息。

不,点/顶点可以有一个正的z坐标,但除非将相机向后移动,否则您将看不到它们


你的问题是你不理解坐标系和变换

首先是窗口坐标。它是你窗口中的像素网格,纯粹是一个简单的。没有z轴

其次是国家数据中心。谷歌。它是xyz轴上从-1到1的立方体。如果同时加载具有标识的modelview和投影矩阵,则这是渲染的空间。通过指定视口,可以将NDC转换为窗口坐标。将剪裁立方体外部顶点的像素

使用“投影”和“模型视图矩阵”可以在NDC多维数据集上创建变换,使其覆盖对象。移动摄影机时,可以更改变换。变换可以将顶点从任何位置平移到NDC立方体,包括负z坐标


这是事情如何运作的简短版本。长版本太长,无法在此输入。有关更多信息,请提出具体问题,或者最好阅读一些相关的文献。

好的,假设我将相机向后移动1000.0f单位,然后想使用
glm::perspective()
-那么近平面和远平面的行为如何?@MaxB剪裁平面始终相对于相机。移动相机时无需更改它们。近距离和远距离始终定义为与相机的距离,而不是空间中的某些点。否则,在移动摄影机时,剪裁平面将布满整个位置。碰巧相机在默认情况下沿-z方向观看。