0

我有这个 obj 文件(也尝试过其他更多的 3d 模型):

            Triangle                  
            v 0 0 0                 
            v 0 0.5 0               
            v 1 0 0     
            f 1 2 3        

我使用以下顶点着色器:

    uniform mat4 projection;
    attribute vec4 pos;

    void main(void)
    {
        gl_Position = projection* pos;
    }

超级简单。如果我只用 uniform_Projection = 单位矩阵运行它,我会看到一个三角形,向上 0.5 和向右 1。似乎是对的。

现在,我想做的是使用相机 ala gluLookAt 以及一些透视投影。这就是我感到困惑的地方。

在世界坐标中,三角形位于上面的顶点位置。因此,让我们选择一只眼睛和一个观察点。眼睛 = (0,0,3),看 = (0,0,0)。基本上我们希望眼睛位于原点。所以我们必须将世界原点移动到眼睛位置(即使它是单位矩阵也可以这样做):

   | 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
   | 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
   | 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
   | 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

砰,三角形消失了。我所做的只是沿着原始相机的方向移动世界。eye = (0,0,3) 仍然消失.. 超级困惑:SI 已关闭任何形式的剔除等。有人可以向我解释这是如何工作的吗?

因为后来我的想法是这样的:

       v = normalize(lookat-eye)
       r = normalize(crossProduct(v, up));
       u = crossProduct(r, v);

       viewMatrix = |r1 r2 r3 -eye1|
                    |u1 u2 u3 -eye1|
                    |v1 v2 v3 -eye1|
                    |0  0  0   1   |

作为一个投影矩阵,我在想(从我的讲座中):

       projMatrix = |1 0 0    0|
                    |0 1 0    0|
                    |0 0 1    0|
                    |0 0 -1/d 1|

或者这个链接: gluPerspective 在 OpenGL 3.1 中被删除了,有什么替代品吗? 不能说我现在完全理解其中的任何一个。

对我来说,我似乎不了解坐标系如何工作的一些关键部分。

4

1 回答 1

1

你对这个矩阵的问题:

| 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
| 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
| 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
| 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

是你翻译了它,但你根本没有调整剪辑平面。默认的单位投影矩阵在 Z 轴上从 -1 剪辑到 1。您已将您的眼睛平移到 Z=3,因此您的新剪裁平面是从 4 到 2,并且您的三角形在此范围之外,因此它被剪裁了。

所以如果你想移动你的眼睛,你需要一个新的投影矩阵。由于您在谈论透视,我建议您自己从 gluPerspective 实现方程,或者下载一个将为您生成投影矩阵的库,例如OpenGL 数学

于 2012-11-13T02:32:21.240 回答