2011-10-10 57 views
1

对于那些不知道的人,Tao.opengl,Tao.freeglut是C#控制台应用程序所必需的。使用C#在OpenGL中使用投影?

现在,对于我的问题:我的导师要求我们绘制4个矩形,所以我成功绘制了它们。

和复制/粘贴其他代码(其中我们的老师没有解释,由于时间不足)

下面的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Tao.FreeGlut; 
using Tao.OpenGl; 

namespace Homework_1 
{ 
    class Triangles 
    { 
     static void display() 
     { 
      Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 

      Gl.glColor3f(1.0f,1.0f,1.0f); 
      Gl.glBegin(Gl.GL_POLYGON); 
      Gl.glVertex3f(-1.0f,-1.0f,0.0f); 
      Gl.glVertex3f(1.0f, -1.0f, 0.0f); 
      Gl.glVertex3f(1.0f, 1.0f, 0.0f); 
      Gl.glVertex3f(-1.0f, 1.0f, 0.0f); 
      Gl.glEnd(); 

      Gl.glColor3f(1.0f, 1.0f, 1.0f); 
      Gl.glBegin(Gl.GL_POLYGON); 
      Gl.glVertex3f(2.0f, -1.0f, 0.0f); 
      Gl.glVertex3f(4.0f, -1.0f, 0.0f); 
      Gl.glVertex3f(4.0f, 1.0f, 0.0f); 
      Gl.glVertex3f(2.0f, 1.0f, 0.0f); 
      Gl.glEnd(); 

      Gl.glColor3f(1.0f, 1.0f, 1.0f); 
      Gl.glBegin(Gl.GL_POLYGON); 
      Gl.glVertex3f(2.0f, 2.0f, 0.0f); 
      Gl.glVertex3f(4.0f, 2.0f, 0.0f); 
      Gl.glVertex3f(4.0f, 4.0f, 0.0f); 
      Gl.glVertex3f(2.0f, 4.0f, 0.0f); 
      Gl.glEnd(); 

      Gl.glColor3f(1.0f, 1.0f, 1.0f); 
      Gl.glBegin(Gl.GL_POLYGON); 
      Gl.glVertex3f(-1.0f, 2.0f, 0.0f); 
      Gl.glVertex3f(1.0f, 2.0f, 0.0f); 
      Gl.glVertex3f(1.0f, 4.0f, 0.0f); 
      Gl.glVertex3f(-1.0f, 4.0f, 0.0f); 
      Gl.glEnd(); 


      Gl.glFlush(); 

     } 

     static void init() 
     { 

      Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
      Gl.glMatrixMode(Gl.GL_PROJECTION); 
      Gl.glLoadIdentity(); 
      Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 
     } 

     public static void Main(String[] argv) 
     { 
      Glut.glutInit(); 
      Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB); 
      Glut.glutInitWindowSize(1000, 1000); 
      Glut.glutInitWindowPosition(100, 100); 
      Glut.glutCreateWindow("hello"); 
      init(); 
      Glut.glutDisplayFunc(display); 
      Glut.glutMainLoop(); 
     } 
    } 
} 

运行应用程序时,所有它显示为白色,所以我100%肯定该错误是我复制的init()方法和粘贴,线条

Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

我100%肯定Gl.glOrtho的价值观必须改变内部的,但问题是,我不 知道如何使用它。

请更正我的错误,以便它可以显示我绘制的4个三角形,并且一个小的解释将使其更加明显和可接受。

+0

您应该阅读[NeHe教程](http://nehe.gamedev.net/tutorial/lessons_01__05/22004/)许多人抱怨说他们已经过时了,但他们涵盖了您正在使用的功能,非常好地解释它们,以及如何使用它们以及为什么。 –

+0

那么你是自己解决还是放弃问题,或者你对已经提出的答案还是有些不屑一顾?在formaer案件中,抛弃一个问题是非常糟糕的做法,在后一种情况下,可以自由地提出您可能对某个答案提出的任何问题。 –

回答

1

简而言之,调用glOrtho通常会确定您的世界可见的区域。所以在你的情况下,你只能看到[0,1] - 方形,它被第一个(白色)多边形(即[-1,1]方形)完全覆盖。因此,要查看所有多边形,您应该使用例如

glOrtho(-1.0, 4.0, -1.0, 4.0, -1.0, 1.0); //or maybe with some margin of +/- 0.1 

当使用不是标识或透视投影的模型视图矩阵(正交的一个)时,这一切都变得更加困难。我建议你更多地了解OpenGL的转换管道,以获取更多信息。也许对this question的答案有帮助。

也似乎忘了拨打电话,以

glViewport(0, 0, 1000, 1000); 

它决定了你视图渲染到帧缓冲区的区域,其范围应符合通常的窗口的范围。缺省情况下,上下文的视口与它所连接的窗口的大小相匹配,但最好是显式设置视口,特别是当窗口被调整大小时,因为在这种情况下视口不会自动更新。

顺便说一句,如果它们的颜色都相同,则不需要为每个多边形设置颜色,因为OpenGL是状态机

+0

愚蠢的问题 视口真的在做什么? 它是否使我绘制的东西看起来在3D方式? – Obzajd

+0

@Obzajd不,它只是确定在投影变换后(如果需要,在'glOrtho之后)得到的归一化设备坐标在[-1,1]中的缩放比例以组成像素坐标。通过这种方式,投影转换和剪切可以在通用空间([-1,1]立方体)中操作,而与事物窗口的实际分辨率无关。所以'glViewport'确定了你的世界被渲染到的framebuffer的范围,并且通常应该匹配你窗口的尺寸。 –

+0

伟大的问题分析 谢谢! – Obzajd

1

glVertex3已经过时了,你的老师甚至不应该承认它的存在,但很好。

void glOrtho(GLdouble left, 
      GLdouble right, 
      GLdouble bottom, 
      GLdouble top, 
      GLdouble nearVal, 
      GLdouble farVal); 

前两个参数指定了左和右剪切平面的坐标。 第三个和第四个参数指定底部和顶部剪切平面的坐标。

在当前的glOrtho中,第一个矩形覆盖整个屏幕,其他矩形覆盖屏幕。结合您的GlColor3f将绘图颜色设置为白色,整个屏幕变为白色。顺便说一句,你不需要重新指定它。

有它的工作将有一个glOrtho这样的方式:

Gl.glOrtho(-5.0, 5.0, -5.0, -5.0, -1.0, 1.0); 

你也可以modifiy你glVertex方法绘制一个较小的矩形。

+0

WOW 你好像只是OpenGL的百科全书! – Obzajd