这是我的源代码。如果我在没有函数的情况下构建这个源代码,我只能看到2行。但我想看看z轴。
所以我添加了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();
在OpenGL中处理顶点(点)时,它会通过模型视图矩阵和投影矩阵进行转换。
投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间变换到剪辑空间,并且剪辑空间中的坐标通过除以剪辑坐标的w
分量而变换到在(-1,-1,-1)到(1,1,1)范围内的归一化设备坐标(NDC)。剪裁空间外的所有几何体都被剪裁,不可见。
模型视图矩阵是模型矩阵和视图矩阵的组合
视图矩阵描述了观看场景的方向和位置。视图矩阵从世界空间转换到视图(眼睛)空间
模型矩阵定义了网格在场景中的位置、方位和相对大小。
在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);
OpenGL只显示酉立方体内部的内容。一旦你把相机在每个方向上移动了3步,你的线条就不适合这个新的立方体了。
为了看到它,我建议把你的相机移到你的原点附近:
gluLookAt(.5f, .5f, .5f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f);
或者通过建立正交投影创建一个新的可视化体积