我目前正在尝试使用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
非常感谢提前!
答案 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