微软提供较少的标准支持,对于和他们竞争的东西—比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)。 不过在C#中实现Opengl也并非没有可能,有很多很好的第3方库可以使用,这里列举2个。 (1)CsGL http://csgl.sourceforge.net/index.html 名气较大的opengl库,有稳定版本。sf上的项目地址http://sourceforge.net/project/showfiles.php?group_id=33241。 目前有多个3D引擎项目使用的这个库。
(2)CSopenGL http://www.ia.hiof.no/gb/ptools/csharp/p-csharp.html 有较详细的文档和例子。sf上的项目地址http://sourceforge.net/project/showfiles.php?group_id=54966&package_id=49782。
CSopenGL的一个例子(我在VS2005上编译) -------form1.cs------- #region Using directives
using System; using System.Collections.Generic; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using CSOpenGL; #endregion
namespace opentest { partial class Form1 : System.Windows.Forms.Form { //private System.ComponentModel.Container components = null; private GLView view;
public Form1() { InitializeComponent();
view = new GLView(); view.Parent = this; view.CreateControl(); view.Dock = DockStyle.Fill; view._OnPaint = new Painter();
}
/* protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } view.Dispose(); } base.Dispose(disposing); } */
private void Form1_Load(object sender, EventArgs e) { }
}
public class Painter : GLViewPainter { public Painter() { }
public override void Paint(GLView view) { glViewport(0, 0, view.Width, view.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, 1.0f, 0.1f, 100.0f); glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //drawPyramid(); //drawSphere(); drawCube(); glFlush(); }
private void drawPyramid() { glLoadIdentity(); glTranslatef(-0.2f, 0.3f, -4.0f); glRotatef(45.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
// front face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);
// right face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);
//back face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
// left face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd(); }
private void drawCube() { // enable color blending: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLoadIdentity();
glTranslatef(0.0f, 0.2f, -6.0f); glRotatef(45.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS); // tegner først de sidene som ikke skal være gjennomsiktige: //the back: glColor4f(1.0f, 1.0f, 0.0f, 1.0f); // yellow glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
//the bottom: glColor4f(1.0f, 0.5f, 0.0f, 1.0f); // orange glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
//the right face: glColor4f(1.0f, 0.0f, 1.0f, 0.75f); // cyan glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);
// de sidene som skal være gjennomsiktige: // setter DepthBuffer read-only: glDepthMask(0); //the front: glColor4f(1.0f, 0.0f, 0.0f, 0.75f); // red glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);
//the top: glColor4f(0.0f, 1.0f, 0.0f, 0.75f); // green glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
//the left face: glColor4f(0.0f, 0.0f, 1.0f, 0.75f); // blue glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd();
glDepthMask(1); glDisable(GL_BLEND); }
private void drawSphere() { float[] ambient = { 1.0f, 1.0f, 0.0f, 1.0f }; float[] diffuse = { 1.0f, 1.0f, 0.0f, 1.0f }; float[] specular = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] position = { 4.0f, 0.0f, 6.0f, 0.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING);
gluLookAt(-4.0, -5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
IntPtr hdc = gluNewQuadric(); gluSphere(hdc, 2.0, 40, 40); gluDeleteQuadric(hdc); } }
}
-------------program.cs-------------- #region Using directives
using System; using System.Collections.Generic; using System.Windows.Forms;
#endregion
namespace opentest { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.EnableRTLMirroring(); Application.Run(new Form1()); } } } 
|