OpenGL - 3D
Koden er gjengitt i sin helhet nedenfor. Du ser at det er satt op Callback funksjoner som tar seg av brukerinitierte begiveheter og en timer. Siden 3D-grafikk ikke er noe sentralt tema i dette materialet, går vi ikke nærmere inn på detaljer.
Prosjektet forutesetter TAO Framework [2] installert i Program Files på din maskin. Du kan selvsagt installere hvor du vil, og endre references i prosjektet.
using System; using System.Collections.Generic; using System.Text; using Tao.FreeGlut; using Tao.OpenGl; namespace glut1 { class Program { static float rotx; static float rotz; static void Main(string[] args) { Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_SINGLE); Glut.glutInitWindowSize(320, 320); Glut.glutInitWindowPosition(50, 50); Glut.glutCreateWindow("Teapot"); // once in a lifetime Init(); // define callbacks Glut.glutDisplayFunc(new Glut.DisplayCallback(Display)); Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape)); Glut.glutTimerFunc(100, new Glut.TimerCallback(Timer), 7); // start the glut main loop Glut.glutMainLoop(); } private static void Init(){ // set up material float[] mat_ambient ={ 0.3f, 0.3f, 0.0f, 1.0f }; float[] mat_diffuse ={ 1.0f, 1.0f, 0.5f, 1.0f }; float[] spec={0.6f,0.6f,0.5f,1.0f}; Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat_ambient); Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat_diffuse); // set up light float[] ambient = { 0.2f, 0.2f, 0.2f, 1.0f }; float[] diffuse = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] position = { 200.0f, 300.0f, 100.0f, 0.0f }; Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuse); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position); Gl.glEnable(Gl.GL_LIGHT0); Gl.glEnable(Gl.GL_LIGHTING); // enable light Gl.glEnable(Gl.GL_LIGHTING); Gl.glEnable(Gl.GL_LIGHT0); // depth sorting Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glDepthFunc(Gl.GL_LESS); // background Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); } #region callbacks // callbacks private static void Timer(int t) { rotx += 1.0f; rotz += 1.0f; Display(); Glut.glutTimerFunc(50, new Glut.TimerCallback(Timer), 7); } private static void Display() { Gl.glClear( Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_ACCUM_BUFFER_BIT); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); Glu.gluLookAt(0, 0, 5, // eyepos 0, 0, 0, // look at 0, 1, 0);// up-vector Gl.glRotatef(rotx, 1.0f, 0.0f, 0.0f); Gl.glRotatef(rotz, 0.0f, 0.0f, 1.0f); Glut.glutSolidTeapot(0.9f); Gl.glFlush(); Glut.glutSwapBuffers(); } private static void Reshape(int width, int height) { Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Gl.glViewport(0, 0, width, height); Glu.gluPerspective(30.0f, (double)width/height, 0.1f, 70.0f); Gl.glMatrixMode(Gl.GL_MODELVIEW); } #endregion callbacks } }