使用gluLookAt后,OpenGL不会呈现任何内容

时间:2017-10-27 16:35:56

标签: opengl mfc coordinate-transformation orthographic glulookat

这是我的来源如果我在没有该功能的情况下构建此源,我只能看到2行。但我希望看到'z'axis。

所以我添加了gluLookAt()功能,但我只能看到黑屏。

我的代码出了什么问题?相机的观点是错误的吗? 它是在MFC对话框中创建的。请帮帮我。

void CopglDlg::OnTimer(UINT_PTR nIDEvent)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

gluLookAt(3.f, 3.f, 3.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f);

glBegin(GL_LINE_LOOP);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glVertex3f(-1.0, 0.0, 0.0);
glEnd();

glBegin(GL_LINE_LOOP);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(0.0, -1.0, 0.0);
glEnd();

glBegin(GL_LINE_LOOP);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, -1.0);
glEnd();

glFlush();

2 个答案:

答案 0 :(得分:3)

当在OpenGL中处理顶点(点)时,它会被模型视图矩阵和投影矩阵变换。

投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间转换到剪辑空间,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)通过使用剪辑坐标的w分量进行划分。剪辑空间之外的所有几何体都被裁剪并且不可见

模型视图矩阵是模型矩阵和视图矩阵的组合 视图矩阵描述了查看场景的方向和位置。视图矩阵从wolrd空间转换到视图(眼睛)空间 模型矩阵定义场景中网格的位置,方向和相对大小。

在OpenGL中,所有矩阵运算都应用于glMatrixMode指定的矩阵堆栈。

在您的情况下,您没有设置投影矩阵,因此投影矩阵默认为单位矩阵。这意味着远平面默认为1,远离眼睛位置(3.0,3.0,3.0)远离1的每个东西都被远平面夹住并且不可见。

你可以改变视图矩阵,这样你就可以从中心看出来(注意,如果投影矩阵是单位矩阵,那么投影是一个正交投影,近平面是-1和远平面在+1处,因此眼睛周围的区域位于剪辑空间中):

glMatrixMode(GL_MODELVIEW);
gluLookAt(0.0f, 0.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f);

或者您设置了一个带有远平面的投影矩阵,该矩阵足够远以包含您的线所在的区域(请参阅glOrtho):

glMatrixMode(GL_PROJECTION);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 10.0 );

glMatrixMode(GL_MODELVIEW);
gluLookAt(3.0f, 3.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);

答案 1 :(得分:0)

OpenGL只显示单一立方体内的内容。一旦你将相机移动到每个方向3步,你的线就不适合这个新的立方体。

为了看到它,我很想将你的相机移到你的正点附近:

gluLookAt(.5f, .5f, .5f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f);

或者通过建立orthographic projection

来创建新的可视化卷