现在的位置: 首页 > 综合 > 正文

C# 的OpenGL控件CsGL基本用法

2013年10月21日 ⁄ 综合 ⁄ 共 4825字 ⁄ 字号 评论关闭

 

CsGL is OpenGL for the .Net Framework, providing support for OpenGL 1.1 - 1.4 and numerous extensions.

CsGL是.Net Framework平台下的OpenGL,对OpenGL 1.1 - 1.4提供支持和扩展。

发布站点:

 http://csgl.sourceforge.net/

下载地址:

http://sourceforge.net/projects/csgl/files/

本文所述环境是在CsGL 的1.4.1版本基础上写的:

主要文件列表如下:

 

GLViewer.1.1.src.tgz Platform-Independent 202.9 KiB Sun Nov 03 2002 00:00 Source .zip 9213  
GLViewer.1.1.bin.tgz i386 439.2 KiB Sun Nov 03 2002 00:00 Source .zip 13420  
CsGLExamples.0.9.1.zip i386 4.7 MiB Sun Nov 03 2002 00:00 .zip 45582  
csgl.1.4.1.doc.zip Platform-Independent 1.1 MiB Sun Nov 03 2002 00:00 .zip 51782  
csgl.1.4.1.src.zip Platform-Independent 504.2 KiB Sun Nov 03 2002 00:00 Source .zip 44544  
csgl.1.4.1.dll.zip i386 352.6 KiB Sun Nov 03 2002 00:00 .zip 98386

 

其中我用过以下两个文件:

csgl.1.4.1.dll.zip为动态链接库文件,将其下载引用即可进行OpenGL 3D编程

CsGLExamples.0.9.1.zip为一些示例的源代码和可执行文件,其中包括Nehe的CsGL源代码,不过实在GUN平台下建立的,Visual Studio 2008 无法直接应用,起初也是这个原因我转向SharpGL的。前段时间详细看了一下说明,知道了具体的用法。

 

Note:本说明的方法是在本人业余时间摸索下完成的,网上关于CsGL的例子和使用方法很少,没什么可参考的资料,虽然没什么技术含量,但是还是可以帮助相关的人少走弯路(也可能是误入歧途),所以代码的完整性和安全性都不能够保证,以下内容发现错误我会重新编辑,故禁止转载,以防误导他人。代码中的一切错误本人概不负责,如有任何意见、建议技术交流以及文中错误请联系我或者直接在这里留言。wanglei_wan@yahoo.com.cn

 

1.CsGLExamples.0.9.1.zip的解压文件中的CsGLExamples.0.9.1/CsGLExamples/src/NeHeLessons/src路径下面是CsGL的基本代码类,下面的代码就是CsGLExamples.0.9.1.zip中Nehe第一课的源代码。

其代码继承于CsGL中的Model类,这个类提供了CsGL运行的一个基本代码模板。具体代码效果在文件中可以找到。要是想在Visual Studio中改编的话需要在工程中引用CsGL.Basecode.dll。

先声明引用

using CsGL.Basecode;

然后像例子一样在代码中重写Draw()等函数就可以了。这种代码方式有个弊端就是可控性不高,优点是可以最快的建立OpenGL的应用程序。下图是这种方法产生的应用程序的询问对话框。

 

下图是执行效果:

我没有用这种方法产生的对话框,因为要改动窗体就要读其开发文档,以后再读吧!可以当成参考代码。

 

2.采用继承CsGL中的OpenGLControl类的方法

<1> 新建Form工程,添加一个新建的空类(本例为OpenGLBase)用于继承CsGL中的OpenGLControl类,继承后的OpenGLBase类就可以当OpenGL控件使用了。(这中做法的目的是因为C#中不允许多重继承,Form工程的主窗口继承了Form类就不能够再继承OpenGLBase类了)。添加CsGL的引用

<2> 修改空类,将新类继承与OpenGLControl 如下面代码

    class OpenGLBase : OpenGLControl

   {

    }

<3> 在OpenGLBase类中创建Timer用于定时刷新OpenGL窗口。(此Timer用的是Form类的)

        Timer Timer_GLupdate = new Timer();//窗口重绘计时器

<4> 修改OpenGLBase类的构造函数,构造函数主要初始化计时器的Tick事件的回调函数,如果需要对按键作出响应,则需要设置KeyDown事件的回调。具体构造函数基本代码的模板如下。

 

 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);
}

<5> 创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口

 private void Timer_GLupdate_Tick(object sender, EventArgs e)
{

    this.Invalidate();
}

<6> 创建按键响应计时器回调函数,(按照个人需求添加),响应按键信息,可以按需要修改

  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;

      }
  }

<7> 重写OpenGLControl类的以下几个函数:

        OnSizeChanged();//窗口大小改变时发生(窗体加载的时候会运行一次)

        InitGLContext();//OpenGL初始化场景

        glDraw();       //OpenGL绘制函数,绘图代码都在这里完成

<8> 在主Form类中添加对象

     OpenGLBase myGLView = new OpenGLBase();

<9> 在Form类的构造函数中添加以下代码,主要将myGLView作为控件显示于Form窗口

            myGLView.Dock = DockStyle.Fill;
            myGLView.Location = new Point(0, 0);
            myGLView.Name = "OpenGLView1";
            myGLView.Visible = true;
            Controls.Add(myGLView);
            ResumeLayout(false);

          

<10> 代码的模板下载,可以直接运行

      OpenGL窗体的基本模板代码:  下载
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~20090724~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.建立多边形
        1三角形,其他代码不用更改,重写glDraw()的代码如下:
        public override void glDraw()
        {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);   // 清除屏幕及深度缓存
            GL.glLoadIdentity();
            GL.glTranslatef(0f,0f,-6f);
            GL.glBegin(GL.GL_TRIANGLES);
            GL.glVertex3f(0.0f, 1.0f, 0.0f);
            GL.glVertex3f(-1.0f, -1.0f, 0.0f);       
            GL.glVertex3f(1.0f, -1.0f, 0.0f);
            GL.glEnd();
            GL.glFlush();    
         
        }
 
           产生如下效果:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~20090908~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面是我改编或自己编写的一些例子:
 
 

 
 

 

 

CsGLModelv1.0_Nehe_Walx_exp4_Triangles And Quads Color Rotate

4  CsGLModelv1.0_Nehe_Walx_exp5_3D Cubic Rotate

5_1  CsGLModelv1.0_Nehe_Walx_exp6_1_3D Cubic Rotate_texture map

 

5_2  CsGLModelv1.0_Nehe_Walx_exp6_2_3D Cubic Rotate_texture map

 

 
 
 

 6   CsGLModelv1.0_Nehe_Walx_exp7_3D Cubic Rotate_texture map Light and Key

     只有W,S键可用于拉近和拉远距离

 

 

 

7   CsGLModelv1.0_Nehe_Walx_exp8_3D Cubic Rotate_texture map Light and Key and Admixture注:

键盘映射

WSAD,QE----立方体的上下左右,前后

IKJL,UO----光源的上下左右,前后

B-Admixture开关(混合)

Space-Light开光(光源)

运行代码后开启Admixture,调整光源位置可得下图

关闭Admixture可得下图

 

关闭光源

移动光源(Admixture此时是开着的)

移动立方体

8 CsGLModelv1.0_Nehe_WL_exp9_3D Star

 

 

CsGLModelv1.0_Nehe_WL_exp10_Loading And Moving Through A 3D World

WSAD---第一视角前后移动左右转动

注:我的压缩文件夹命名太长了,运行时会出错,所以下载后把压缩文件的文件名删去一部分在解压!

(像不像打CS啊,嘻嘻)

 

10  CsGLModelv1.0_Nehe_Walx_exp11_Flag Effect(Waving Texture)

 

 

 

 

 

下接:C# 的OpenGL控件CsGL基本用法(2)

抱歉!评论已关闭.