2011-10-10 60 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