1

这是我的源代码 如果我在没有该功能的情况下构建这个源代码,我只能看到 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();
4

2 回答 2

3

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

投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图空间变换到剪辑空间,剪辑空间中的坐标变换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的归一化设备坐标 (NDC)通过与w剪辑坐标的分量相除。所有超出裁剪空间的几何图形都被裁剪并且不可见

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

在 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);
于 2017-10-27T17:14:12.473 回答
0

OpenGL 只向您展示单一立方体内部的内容。一旦你在每个方向上移动你的相机 3 步,你的线条就不适合这个新的立方体。

为了看到它,我建议将您的相机移动到您的原点附近:

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

或者通过建立正交投影来创建新的可视化体积

于 2017-10-27T16:50:18.363 回答