C# 基於CSGL opengl


        1.因為作四軸項目的需要(在上位機顯示飛行器姿態),找了點時間學習了一下OpenGl,什么是OpenGL,OpenGL是一個功能強大的

開放圖形Open Graphics Library。其前身是SGI公司為其圖形工作站開發的IRIS GL。為使其能夠更加容易地移植到不同的硬

件和操作系統,SGI開發了OpenGL從程序開發人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述

二維和三維幾何物體,並控制這些物體按某種方式繪制到顯示緩沖區中。OpenGLAPI集提供了物體描述、平移、旋轉、縮放、光照、

紋理、材質、像素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發二、三維圖形程序所需的各個方面。

      2.我這里用到的是CsGl框架,CsGLopenGL.NET下的包裝。可以在網上下載:目前關於CsGL的開發基本上已經停止,官方主頁上的

說法是認為CsGL對大多數應用而言已經足夠穩定了,目前CsGL開發工作基本上集中在Example程序的撰寫.主要文件列表如下:

  GLViewer.1.1.src.tgz
 GLViewer.1.1.bin.tgz
 CsGLExamples.0.9.1.zip
 csgl.1.4.1.doc.zip
 csgl.1.4.1.src.zip
 csgl.1.4.1.dll.zip
其中我用過以下兩個文件: csgl.1.4.1.dll.zip(轉到CSDN下載) 為動態鏈接庫文件,將其下載引用 即可進行OpenGL 3D程 CsGLExamples.0.9.1.zip(可從CSDN論壇下載) 為一 些示例的源代碼和可執行 文件,其中包括Nehe的CsGL源代碼,不過是在GUN平台下 建立的,通過一些簡單操作,可以加入到Visual studio 來, 我這里使用的是VS2008. 目前大概有兩種導入方法,我用的是繼承CsGL中的 OpenGLControl類的方法 . 步驟如下:
      1 新建Form工程,添加一個新建的空類(本例為 OpenGLBase),引用名稱空間 using CsGL.OpenGL; 用於繼 承CsGL中的OpenGLControl類,繼承后的OpenGLBase類就 可以當OpenGL控件使用了。(這中做法的目的是因為C# 中不允許多重繼承,Form工程的主窗口繼承了Form類就 不能夠再繼承OpenGLBase類了).最后添加dll文件的引 用.
注意: csgl.native.dll  這個程序是運行所需要的,需要添加到你 與編譯生成的  .exe文件在同一個目錄 .
 
 


 
     
添加 csgl.dll 引用
 

    2. 在Form 的構造函數加入下面代碼
 //捆綁到一個Form窗體上顯示
   OpenGLBase myGLView = new OpenGLBase();
    myGLView.Dock = DockStyle.Fill            myGLView.Location = new Point(0, 0);
    myGLView.Name = "OpenGLView1";
    myGLView.Visible = true;
    Controls.Add(myGLView);
    ResumeLayout(false);
//代碼具體作用 ,VS中有詳細說明
 
 
編程實例
 
 
轉動的幾何體:
 

 

代碼說明:這里主要是編寫OpenGLBase 這個類的代碼:
    
/// <summary>
    /// 新建一個類,因為C#不允許多重繼承
    /// </summary>
    class OpenGLBase : OpenGLControl
    {
    }
 
OpenGLBase類中主要包括下面一些方法:
 1.創建屏幕刷新計時器回調函數,每10ms刷新一次OpenGL窗口
    private void Timer_GLupdate_Tick(object sender, EventArgs e){
        this.Invalidate();
     }
2.創建按鍵響應計時器回調函數,(按照個人需求添加),響應按鍵信息,可以按需要修改.
    private void OpenGLBase_KeyDown(object sender, KeyEventArgs e){}
3.窗口大小改變時發生(窗體加載的時候會運行一次)
   protected override void OnSizeChanged(EventArgs e) {}
 
 
4. OpenGL初始化場景
    protected override void InitGLContext()
     {}
5. OpenGL繪制函數,繪圖代碼都在這里完成
    public override void glDraw()
     {}
 

 

 下面是完整 OpenGLBase類的原碼,代碼來自NEHE教程,緊供學習(

作者信息:

NeHe Lessons
NeHe Productions
http://nehe.gamedev.net

Contains ports of the lessons developed by Jeff Molofee (NeHe)
and contributors to his site.

)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CsGL.OpenGL;
using System.Windows.Forms;

namespace CsGl_Tri_squ
{
    /// <summary>
    /// 新建一個類,因為C#不允許多重繼承
    /// </summary>
    class OpenGLBase : OpenGLControl
    {
        //Timer Timer_GLupdate = new Timer();窗口重繪計時器
        Timer Timer_GLupdate = new Timer();//  窗口重繪計時器
        private static float rtri = 0;                                                    // Angle For The Triangle
        private static float rquad = 0;                                                    // Angle For The Quad

        public OpenGLBase()
        {
            this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
            this.Timer_GLupdate.Interval = 10;
            this.Timer_GLupdate.Start();
            this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);  //委托
        }
        //定時器觸發的方法
        private void Timer_GLupdate_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }
        private void OpenGLBase_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.D:
                    break;
                case Keys.A:
                    break;
                case Keys.S:
                    break;
                case Keys.W:
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// 重寫窗體大小 改變方法
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSizeChanged(EventArgs e)
        {
            
            GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);
            
            GL.glMatrixMode(GL.GL_PROJECTION);
            GL.glLoadIdentity();
            GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f);
            
            GL.glMatrixMode(GL.GL_MODELVIEW);
        }
        /// <summary>
        /// OnPaint方法處理Paint事件
        /// </summary>
        /// <param name="pevent"></param>
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
        {
            base.OnPaint(pevent);
            //ToDo:可加入自己的設計代碼
        }
        /// <summary>
        /// OpenGL初始化場景
        /// </summary>
        protected override void InitGLContext()
        {
            base.InitGLContext();
            GL.glEnable(GL.GL_DEPTH_TEST);                        // Enables Depth Testing
           // GL.glDepthFunc(GL.GL_LEQUAL);                        // The Type Of Depth Testing To Do
           // GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);    // Really Nice Perspective Calculations
            GL.glMatrixMode(GL.GL_PROJECTION);
            GL.glLoadIdentity();/
            GL.gluPerspective(50.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);
           GL.glMatrixMode(GL.GL_MODELVIEW);
            GL.glLoadIdentity();
            GL.glShadeModel(GL.GL_SMOOTH);    
             }

        
        public override void glDraw()
        {

            // Here's Where We Do All The Drawing
           GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);                            // Clear Screen And Depth Buffer
            GL.glLoadIdentity();                                                            // Reset The Current Modelview Matrix,單位化
         
            GL.glTranslatef(-1.5f, 0.0f, -6.0f);                                            // Move Left 1.5 Units And Into The Screen 

            GL.glRotatef(rtri, 0.0f, 1.0f, 0.0f);                                            // 繞Y軸旋轉金字塔  rtri是角度
            GL.glBegin(GL.GL_TRIANGLES);                                                        // Drawing Using Triangles
            //正對的面
            GL.glColor3f(1.0f, 0.0f, 0.0f);                                            // Red
            GL.glVertex3f(0.0f, 1.0f, 0.0f);                                            // Top Of Triangle (Front)
            GL.glColor3f(0.0f, 1.0f, 0.0f);                                            // Green
            GL.glVertex3f(-1.0f, -1.0f, 1.0f);                                            // Left Of Triangle (Front)
            GL.glColor3f(0.0f, 0.0f, 1.0f);                                            // Blue
            GL.glVertex3f(1.0f, -1.0f, 1.0f);                                            // Right Of Triangle (Front)
            //2
            GL.glColor3f(1.0f, 0.0f, 0.0f);                                        // Red
            GL.glVertex3f(0.0f, 1.0f, 0.0f);                                        // Top Of Triangle (Right)
            GL.glColor3f(0.0f, 0.0f, 1.0f);                                        // Blue
            GL.glVertex3f(1.0f, -1.0f, 1.0f);                                        // Left Of Triangle (Right)
            GL.glColor3f(0.0f, 1.0f, 0.0f);                                        // Green
            GL.glVertex3f(1.0f, -1.0f, -1.0f);                                        // Right Of Triangle (Right)
            //3
            GL.glColor3f(1.0f, 0.0f, 0.0f);                                        // Red
            GL.glVertex3f(0.0f, 1.0f, 0.0f);                                        // Top Of Triangle (Back)
            GL.glColor3f(0.0f, 1.0f, 0.0f);                                        // Green
            GL.glVertex3f(1.0f, -1.0f, -1.0f);                                        // Left Of Triangle (Back)
            GL.glColor3f(0.0f, 0.0f, 1.0f);                                        // Blue
            GL.glVertex3f(-1.0f, -1.0f, -1.0f);                                        // Right Of Triangle (Back)
            //4
            GL.glColor3f(1.0f, 0.0f, 0.0f);                                        // Red
            GL.glVertex3f(0.0f, 1.0f, 0.0f);                                        // Top Of Triangle (Left)
            GL.glColor3f(0.0f, 0.0f, 1.0f);                                        // Blue
            GL.glVertex3f(-1.0f, -1.0f, -1.0f);                                        // Left Of Triangle (Left)
            GL.glColor3f(0.0f, 1.0f, 0.0f);                                        // Green
            GL.glVertex3f(-1.0f, -1.0f, 1.0f);                                        // Right Of Triangle (Left)
            GL.glEnd();                                                                    // Finished Drawing The Pyramid

            GL.glLoadIdentity();                                                            // Reset The Current Modelview Matrix,回到中心位置
            GL.glTranslatef(1.5f, 0.0f, -7.0f);                                            // Move Right 1.5 Units And Into The Screen 7.0

            GL.glRotatef(rquad, 1.0f, 1.0f, 1.0f);                                            // Rotate The Quad On The X, Y, And Z Axes
            GL.glBegin(GL.GL_QUADS);                                                            // Draw A Quad
            //1
            GL.glColor3f(0.0f, 1.0f, 0.0f);                                            // Set The Color To Green
            GL.glVertex3f(1.0f, 1.0f, -1.0f);                                            // Top Right Of The Quad (Top)
            GL.glVertex3f(-1.0f, 1.0f, -1.0f);                                            // Top Left Of The Quad (Top)
            GL.glVertex3f(-1.0f, 1.0f, 1.0f);                                            // Bottom Left Of The Quad (Top)
            GL.glVertex3f(1.0f, 1.0f, 1.0f);                                            // Bottom Right Of The Quad (Top)
            //2
            GL.glColor3f(1.0f, 0.5f, 0.0f);                                        // Set The Color To Orange
            GL.glVertex3f(1.0f, -1.0f, 1.0f);                                        // Top Right Of The Quad (Bottom)
            GL.glVertex3f(-1.0f, -1.0f, 1.0f);                                        // Top Left Of The Quad (Bottom)
            GL.glVertex3f(-1.0f, -1.0f, -1.0f);                                        // Bottom Left Of The Quad (Bottom)
            GL.glVertex3f(1.0f, -1.0f, -1.0f);                                        // Bottom Right Of The Quad (Bottom)
            //3
            GL.glColor3f(1.0f, 0.0f, 0.0f);                                            // Set The Color To Red
            GL.glVertex3f(1.0f, 1.0f, 1.0f);                                            // Top Right Of The Quad (Front)
            GL.glVertex3f(-1.0f, 1.0f, 1.0f);                                            // Top Left Of The Quad (Front)
            GL.glVertex3f(-1.0f, -1.0f, 1.0f);                                            // Bottom Left Of The Quad (Front)
            GL.glVertex3f(1.0f, -1.0f, 1.0f);                                            // Bottom Right Of The Quad (Front)
            //4
            GL.glColor3f(1.0f, 1.0f, 0.0f);                                        // Set The Color To Yellow
            GL.glVertex3f(1.0f, -1.0f, -1.0f);                                        // Bottom Left Of The Quad (Back)
            GL.glVertex3f(-1.0f, -1.0f, -1.0f);                                        // Bottom Right Of The Quad (Back)
            GL.glVertex3f(-1.0f, 1.0f, -1.0f);                                        // Top Right Of The Quad (Back)
            GL.glVertex3f(1.0f, 1.0f, -1.0f);                                        // Top Left Of The Quad (Back)
            //5
            GL.glColor3f(0.0f, 0.0f, 1.0f);                                        // Set The Color To Blue
            GL.glVertex3f(-1.0f, 1.0f, 1.0f);                                        // Top Right Of The Quad (Left)
            GL.glVertex3f(-1.0f, 1.0f, -1.0f);                                        // Top Left Of The Quad (Left)
            GL.glVertex3f(-1.0f, -1.0f, -1.0f);                                        // Bottom Left Of The Quad (Left)
            GL.glVertex3f(-1.0f, -1.0f, 1.0f);                                        // Bottom Right Of The Quad (Left)
            //6
            GL.glColor3f(1.0f, 0.0f, 1.0f);                                                    // Set The Color To Violet
            GL.glVertex3f(1.0f, 1.0f, -1.0f);                                            // Top Right Of The Quad (Right)
            GL.glVertex3f(1.0f, 1.0f, 1.0f);                                            // Top Left Of The Quad (Right)
            GL.glVertex3f(1.0f, -1.0f, 1.0f);                                            // Bottom Left Of The Quad (Right)
            GL.glVertex3f(1.0f, -1.0f, -1.0f);                                            // Bottom Right Of The Quad (Right)
            GL.glEnd();                // Done Drawing The Cube
            rtri += 0.6f;                     // Increase The Rotation Variable For The Triangle
            rquad += 0.6f;            // Decrease The Rotation Variable For The Quad,單位是角度
          
           

        }

    }
}

 

 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM