【问题标题】:Basic lookat with shaders but without gluLookAt using opengl带有着色器但没有使用 opengl 的 gluLookAt 的基本外观
【发布时间】:2012-11-13 01:08:36
【问题描述】:

我有这个 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) 仍然消失了。超级困惑:S 我已经关闭了任何形式的剔除等。有人可以向我解释一下这是如何工作的吗?

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

       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 was removed in OpenGL 3.1, any replacements? 不能说我现在完全理解其中任何一个。

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

【问题讨论】:

  • 请不要在变量名前加上它们的存储类,如“uniform_”和“attribute_”。
  • 嘿嘿,不好意思。教程的诅咒..

标签: opengl shader


【解决方案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 Mathematics

【讨论】:

  • 非常感谢,这正是我所缺少的!
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多