SharpGL
OpenGL通常使用C++,如果想用C#来使用OpenGL呢?当然了,这也是没有问题的!我们可以使用SharpGL来完成。SharpGL是C#的OpenGL控件,利用它可以在.NET环境下调用OpenGL的API做三维图像。下面是sharpgl的简介(http://www.codeproject.com/Articles/3144/SharpGL-a-C-OpenGL-class-library)
SharpGL控件
要想使用该控件,当然需要相应的library了!以WPF开发为例,需要SharpGL.dll,SharpGL.SceneGraph.dll以及SharpGL.WPF.dll。那么如何下载都这些dll呢?其实很简单,如果你的开发环境是VS2013,那你只需要在tools下面的Library package manager中选择Manage NuGet package,在打开的窗口中搜索你所需要的sharpgl安装即可。安装好相应的之后library之后,一定要记得加上相应的命名空间。至此,sharpgl的控件就可以使用了。
SharpGL 控件的使用
仍然在WPF中使用SharpGL控件,下面给出了使用该控件的例子。其中,OpenGLDraw函数相当于opengl中的display()函数,且不需要glutmainloop函数就可以自动重绘。
<Windows:xmlns:wpf="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF"/>
<wpf:OpenGLControl
Name="openGLControl" OpenGLDraw="openGLControl_OpenGLDraw"
OpenGLInitialized="openGLControl_OpenGLInitialized" Resized="openGLControl_Resized"
RenderContextType="FBO" FrameRate="50" MouseMove="openGLControl_MouseMove" Margin="300,72,300,223" MouseLeftButtonUp="openGLControl_MouseLeftButtonUp" MouseLeftButtonDown="openGLControl_MouseLeftButtonDown" />
private void openGLControl_OpenGLDraw(object sender, OpenGLEventArgs args)
{
OpenGL gl = openGLControl.OpenGL;
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gl.LoadIdentity();
gl.MatrixMode(OpenGL.GL_MODELVIEW);
gl.Scale(8, 8, 8);
gl.Rotate(cameraAngleX, 0.0f, 1.0f, 0.0f);
gl.Begin(OpenGL.GL_TRIANGLES);
int i = 0;
int tempcount = p;
while (tempcount > 0)
{
gl.Color(color[3 * triangele[i + 2]], color[3 * triangele[i + 2] + 1], color[3 * triangele[i + 2] + 2]);
gl.Vertex(vertex[3 * triangele[i + 2]], vertex[3 * triangele[i + 2] + 1], vertex[3 * triangele[i + 2] + 2]);
gl.Color(color[3 * triangele[i + 1]], color[3 * triangele[i + 1] + 1], color[3 * triangele[i + 1] + 2]);
gl.Vertex(vertex[3 * triangele[i + 1]], vertex[3 * triangele[i + 1] + 1], vertex[3 * triangele[i + 1] + 2]);
gl.Color(color[3 * triangele[i]], color[3 * triangele[i] + 1], color[3 * triangele[i] + 2]);
gl.Vertex(vertex[3 * triangele[i]], vertex[3 * triangele[i] + 1], vertex[3 * triangele[i] + 2]);
tempcount--;
i = i + 3;
}
gl.End();
}
private void openGLControl_OpenGLInitialized(object sender, OpenGLEventArgs args)
{
OpenGL gl = openGLControl.OpenGL;
gl.ClearColor(0 / 225.0f, 113 / 255.0f, 197 / 255.0f, 1.0f);
gl.Enable(OpenGL.GL_DEPTH_TEST);
gl.ShadeModel(OpenGL.GL_SMOOTH);
}
private void openGLControl_Resized(object sender, OpenGLEventArgs args)
{
OpenGL gl = openGLControl.OpenGL;
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}
下面的函数实现了简单的鼠标交互(拖动鼠标实现旋转)。
private void openGLControl_MouseMove(object sender, MouseEventArgs e)
{
if (left == true)
{
cameraAngleX += (float)((e.GetPosition(this.openGLControl).X - oldmx));
oldmx = e.GetPosition(this.openGLControl).X;
oldmy = e.GetPosition(this.openGLControl).Y;
if (cameraAngleX < -90.0f)
{
cameraAngleX = -90.0f;
}
if (cameraAngleX > 90.0f)
{
cameraAngleX = 90.0f;
}
}
}
private void openGLControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
left = false;
}
private void openGLControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
left = true;
oldmx = e.GetPosition(this.openGLControl).X;
oldmy = e.GetPosition(this.openGLControl).Y;
}