为什么调用透视功能会给我留下黑屏?

sda*_*das 4 opengl haskell

我正在使用Haskell和OpenGL来构建3D地形.地形和照明很好,但是我在调​​整摄像机/视图时遇到了一些困难.

当我在我的display函数中运行以下代码时:

matrixMode $= Projection
loadIdentity
-- perspective 45 1 0.1 100

matrixMode $= ModelView 0
loadIdentity
lookAt (Vertex3 0 0 0) (Vertex3 0 1 2) (Vector3 0 1 0)
Run Code Online (Sandbox Code Playgroud)

我收到以下图片:

在此输入图像描述

但是当我取消注释时

perspective 45 1 0.1 100
Run Code Online (Sandbox Code Playgroud)

我只是得到一个黑屏.

我的点数组非常大,但这里是从ghci以下位置复制的最后几点:

(1.0,0.0,0.76),(1.0,0.0,0.8),(1.0,0.0,0.84),(1.0,0.0,0.88),(1.0,0.0,0.92),(1.0,0.0,0.96),(1.0 ,0.0,1.0)

我觉得好像:

  1. 我错误地指定了透视平面?要么...
  2. 我不应该反复调用这些功能中的一个或多个?

joz*_*yqk 5

默认的投影/观看体积是正交的(实际上是立方体),中心位于原点.在透视投影中,所有观察光线会聚到原点,该原点位于近平面的后面.由于您的原点位于您正在绘制的平面上,因此所有顶点将在屏幕上形成一条线并且不会产生任何碎片.正如KarolisJuodelė所说,调整lookAt功能使相机不在飞机上......

在此输入图像描述