关于OpenGL坐标系的困惑

时间:2012-11-17 22:35:08

标签: opengl matrix glsl hierarchy transformation

我无法理解OpenGL中空间的核心概念。我已经阅读了一本关于现代3D图形的在线书籍了几个星期了,我经常发现自己对程序中使用的所有空间感到困惑。具体而言,空格如:模型空间,世界空间,相机空间,剪辑空间。我似乎无法将我的思维包含在我应该从一个教程程序中转换矩阵的顺序中:

//.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,网站中了解这些空间?视频?参考?或者我应该回去重新阅读教程中有关这些空间的信息,直到它附着在我的大脑上。

2 个答案:

答案 0 :(得分:1)

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

想象一个像函数一样的矩阵。函数有输入并返回一个值。您必须传递正确的输入,否则您的编译器会抱怨。

考虑以下功能:

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

IntFloatDoubleReal是用户定义的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。

矩阵就像那些函数一样,在整个过程中将位置转换为中间空间。

答案 1 :(得分:0)

在问题解决之前,这个问题没有答案。什么能教给一些人,让他们理解概念,对每个人都不会这样做。我最好的建议是在成为3D程序员之前学会成为3D建模师。这就是我做的。一旦您熟悉数据的可视化,您就可以更轻松地形成心理模型,并记住它们的代码。当您需要进一步的可视化来帮助您创建算法时,您将能够在不使用代码的情况下创建它们。