Børre Stenseth
Moduler>Grafikk>3D-OpenGL

OpenGL - 3D

Hva
Image1
Framstilling av en tekanne i 3D

Det er mange muligheter for å framstille scener i 3D, rommet under Windows .Net. Dette eksempelet er laget ved hjelp av det grafiske biblioteket OpenGL. Microsoft støtter ikke OpenGL aktivt, men ved hjelp av noen assemblies og noen koplinger kan vi få det til. OpenGL er interessant fordi det er et åpent grafisk bibliotek som kan brukes på de fleste plattformer. Du finner mer om dette på vevstedet Grafisk databehandling [1] .

Den koplingen som er brukt her er TAO [2] . Vi har dessuten valgt å bruke den enkle pakka glut, som setter opp sitt eget vindu. Det vi tegner er den berømte tekanna, "The Utah Teapot", [3] . Glut har en egen funksjon for dette.

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
    }
}
Referanser
  1. Grafisk databehandlingStenseth, Børre2009Ostfold Collegewww.it.hiof.no/~borres/gb14-03-2010
  1. The Tao Framework2009sourceforgesourceforge.net/projects/taoframework14-03-2010
  1. The History of The Teapot2009www.sjbaker.org/wiki/index.php?title=The_History_of_The_Teapot14-03-2010
  • Prosjekt:
    https://svn.hiof.no/svn/psource/Csharpspikes/ogl-TeaPot
Vedlikehold

B.Stenseth, desember 2005

(Velkommen) Moduler>Grafikk>3D-OpenGL (Databaser)