沿y轴观察时,OpenGL不显示任何内容

时间:2014-10-23 08:24:18

标签: opengl

我目前正在尝试使用SFML和OpenGL显示从顶部查看的红色网格。 网格平面垂直于y轴(y轴是向上看的向量)。

在我的渲染循环之前调用它:

glEnable(GL_DEPTH_TEST);
gluPerspective(90.0f, (GLfloat)640/(GLfloat)480, 1.0f, 1000.0f);

在渲染循环中:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, -3.0, 0.0,
    0.0, -0.8, 0.0,
    0.0, 1.0, 0.0);

for (float x = -10.0f, x < 10.0f, x += 1.0f) {
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_LINES);
        glVertex3f(x, -0.5f, -10.0f);
        glVertex3f(x, -0.5f, 10.0f);
        glVertex3f(-10.0f, -0.5f, x);
        glVertex3f(10.0f, -0.5f, x);
    glEnd();
}

window.display(); // swap buffers in SFML

我剥离了SFML部分。

当我更换gluLookAt();这一部分(相机略微倾斜):

gluLookAt(0.0, -3.0, 0.0,
    0.0, -0.8, 0.01,
    0.0, 1.0, 0.0);

或者这个:     gluLookAt(0.0,-3.0,0.0,         0.0,-0.8,0.0,         0.0,0.0,1.0);

一切都很好。

我得出的结论是,当我准确地看向-y方向(90°)时,没有画出任何东西。但为什么?我错过了什么吗?

我的OpenGL支持版本是2.1 Mesa 10.2.4

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

问题是,你的上轴也指向y轴。上向量没有必要精确向上,但它必须与您的观察方向不同。有关详细信息,请查看at this answer

编辑:自提出要求以来,这里是数学解释:

gluLookAt生成一个三维坐标系,由三个垂直向量组成。 假设gluLookAt的输入是摄像机位置(C),眼睛位置(E)和向上矢量(U)比矩阵使用以下等式构造:

F = C - E
f = F / |F|

U' = U / |U|

这会产生两个跨越平面的向量。我们已经知道,f(视图矢量)将是我们最终坐标系的-z轴(opengl始终沿着负z轴)。可以通过找到由f和u跨越的平面的法向量来计算x轴,因此可以通过

计算
S = f x U' (x is the cross product)
s = S / |S|

请注意,如果u和f已经垂直,则不需要归一化,但由于gluLookAt不需要实数向量,因此不一定给出。出于同样的原因,我们不能直接使用u作为y轴。我们正在寻找的是一个垂直于f和s两者的y向量,其给出如下:

u = s x f

最终矩阵由

构建
    |     s    0 |
M = |     u    0 |
    |    -f    0 |
    | 0  0  0  1 |

现在考虑你的情况f = U': 在计算S时我们得到

 S = f x U' = U' x U' = [0, 0, 0]

由于这给出了一个空向量,你也将是一个空向量。总的来说,这会产生一个矩阵,其中前两行全部为零,因此每个向量乘以此矩阵将以x和y结束为止。

希望这会对你有所帮助。 gluLookAt的公式取自here