如何变换glOrtho剪裁平面?

时间:2016-01-28 10:13:25

标签: c opengl geometry opentk clipping

我创建了一个OpenGL应用程序,我用glOrtho()定义了一个查看卷。然后我使用gluLookAt()来转换所有点。 问题是 - 一旦我这样做,所有的点都会从裁剪平面掉出来,因为它是“落后”的。我最终得到了黑屏。

如何通过gluLookAt()转换观察体积以使其对象仍然紧密?

以下是一些有助于更好地说明问题的代码:

Vector3d eyePos = new Vector3d(0.25, 0.25, 0.6);
Vector3d point = new Vector3d(0, 0, 0.001);            
Vector3d up = new Vector3d(0, 1,0);            
Matrix4d mat = Matrix4d.LookAt(eyePos, point, up);

GL.Viewport(0, 0, glControl1.Width, glControl1.Height);

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();  
GL.Ortho(0, 1, 0, 1, 0, 1);

GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();  

GL.LoadMatrix(ref mat);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.Enable(EnableCap.DepthTest);
GL.DepthMask(true);
GL.ClearDepth(1.0);
GL.Color3(Color.Yellow);
GL.Begin(PrimitiveType.Triangles);
GL.Vertex3(0.2, 0.3, 0.01);
GL.Vertex3(0, 0.600, 0.01);
GL.Vertex3(0.600, 0.600, 0.01);
GL.Color3(Color.Blue);
GL.Vertex3(0, 0.6, 0.01);
GL.Vertex3(0.2, 0.3, 0.01);
GL.Vertex3(0.7, 0.5, 0.03);
GL.Color3(Color.Red);
GL.Vertex3(0.100, 0.000, 0.01);
GL.Vertex3(0, 0.0, 0.01);
GL.Vertex3(0.600, 0.600, 0.03);

GL.End();
glControl1.SwapBuffers();

我想我的问题更简洁的修正是如何通过外观矩阵转换两个点?(在我的代码中为“mat”)

1 个答案:

答案 0 :(得分:0)

好的,我遇到了你的问题。

将摄像机位置设置为(0.25,0.25,0.6),并且查看视图方向的点为(-0.25,-0.25,-0.599)(必须标准化)。正如我在下面的评论中提到的那样,您正在视图方向的右上角绘制一个立方体。 因此两点(0.25,0.25,0.6)(摄像机位置)和摄像机位置和视图方向定义的点,向上矢量和右矢量(看看this)定义了立方体屏幕上显示的内容(两个点定义了立方体内的对角线)。不幸的是,你的所有要点都不在这个立方体内。

可能是这样,你把摄像机的位置与你想看的那个点混在了一起?两个值的变化应该可以解决您的问题。其余的代码似乎是正确的。您唯一要做的就是检查您的点是否在投影的剪辑空间内。另一种检查点数的方法是使用,例如:键盘输入,动态移动相机。