关于OpenGL坐标系统的困惑

问题描述:

我很难理解OpenGL中空间的核心概念。我几个星期以来一直在阅读关于现代3D图形的在线书籍,而且我经常发现自己与程序中使用的所有空间混淆。具体而言,如空间:模型空间,世界空间,相机空间,剪辑空间。我似乎无法总结我的脑海围绕秩序,我应该从进入,一个例子来自我的教程项目之一变换矩阵:关于OpenGL坐标系统的困惑

//.vert shader of a program 
#version 330 

layout(location = 0) in vec4 position; 

uniform mat4 cameraToClipMatrix; 
uniform mat4 worldToCameraMatrix; 
uniform mat4 modelToWorldMatrix; 

void main() 
{ 
    vec4 temp = modelToWorldMatrix * position; 
    temp = worldToCameraMatrix * temp; 
    gl_Position = cameraToClipMatrix * temp; 
} 

cameraToClip,worldToCamera,XtoY,ZtoQ,我怎么能在OpenGL,网站中了解这些空间?视频?参考?或者我应该回去重新阅读教程中这些空间的信息,直到它贴近我的大脑。

我真的不知道如何解释它比我做得更好。特别是当矩阵被清楚地命名时。

想象一个矩阵就像一个函数。一个函数有输入并且它返回一个值。你必须通过正确的输入,否则你的编译器会报错。

考虑以下功能:

Float intToFloat(Int i); 
Double floatToDouble(Float f); 
Real doubleToReal(Double d); 

IntFloatDouble,和Real是用户定义的C++类型。

比方说,我需要写这个函数:

Real intToReal(Int i); 

所以我只有一个Int。以上功能中,有正好有一个函数我可以调用:intToFloat。这个名字说明了一切:它需要一个int并将其变成一个浮点数。因此,给出Int,只有我可以用它做的事情是拨打intToFloat

Int i = ...; 
Float f = intToFloat(i); 

那么,现在我有一个Float。我只能调用一个函数:floatToDouble

Double d = floatToDouble(d); 

然后,我只能拨打doubleToReal。这意味着我们的intToReal功能是:

Real intToReal(Int i) 
{ 
    Int i = ...; 
    Float f = intToFloat(i); 
    Double d = floatToDouble(d); 
    return doubleToReal(d); 
} 

就像矩阵的例子。

顶点着色器做的最重要的事情是将位置从原始空间(称为模型空间)转换到OpenGL定义的称为剪辑空间的空间。这是大多数顶点着色器的工作#1。

矩阵就像这些函数一样,将位置转换为沿途的中间空间。

直到问题解决后才能回答这个问题。对一些人来说,教得好的东西对于他们来说,能够理解概念,对每个人都不会这样做。我最好的建议是在你成为3D程序员之前学会成为3D建模师。这就是我所做的。一旦熟悉了数据的可视化,就可以更容易地形成心智模型,并在脑海中进行编码。当你需要进一步的可视化来帮助你创建算法时,你将能够在不使用代码的情况下创建它们。