F
kompilieren tu ich mit:
gcc -I .-c Teapot.c
gcc -o Teapot.out Teapot.o -lGL -lGL -lglut -lGLU
//Teapot.c
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
//Zustandsvariablen für die Mausbewegung
int mousemotion;
int mousex, mousey;
//Initialisierung Modellorientierung
GLfloat xangle = 4; /*In Drehung im */
GLfloat yangle = 120;
//Modellposition
GLfloat posx = 0, posy = 0, posz = 0;
//Eigenen Initialisierung (Licht etc.)
void myinit()
{
GLfloat light_position[] = {0.0, 0.0, -1.0, 1.0 };
//erstes GL-Light setzen
glLightfv(GL_LIGHT0, GL_POSITION, light_position );
//Licht aktivieren
glEnable(GL_LIGHT0);
//z-Puffer aktivieren
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
}
//Callback Reaktion auf Mausbewegung
void mouse(int button,int state, int x, int y)
{
if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
mousemotion = 1;
mousex = x;
mousey = y;
}
if( button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
mousemotion = 0;
}
}
void motion(int x, int y)
{
if(mousemotion)
{
xangle = xangle - (y - mousey);
yangle = yangle - (x - mousex);
mousex = x;
mousey = y;
//Szene neu zeichnen
glutPostRedisplay();
}
}
void keyb(unsigned char keyPressed, int x, int y)
{
switch(keyPressed)
{
case 'l':
case 'L':
//Licht aktivieren
glEnable(GL_LIGHTING);
glutPostRedisplay();
break;
case 'o':
case 'O':
//Licht deaktivieren
glDisable(GL_LIGHTING);
glutPostRedisplay();
break;
}
}
void recalcModelPos(void)
{
glLoadIdentity();
glTranslatef(posx, posy, posz);
glRotatef(xangle, 1.0, 0.0, 0.0);
glRotatef(yangle, 0.0, 1.0, 0.0);
}
void DrawScene(void)
{
//Puffer löschen
glClearColor(0.5, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//neue Modellkoordinaten berechnen
recalcModelPos();
//Teekanne malen
glutSolidTeapot(0.6);
//Vorder und Hintergrund Puffer wechesln
glutSwapBuffers();
}
//Main Funktion
int main(int argc, char *argv[])
{
//glut initialisieren, Fenster setzen
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
//eigene Initialisierung
myinit();
//Callbacks setzen: Reaktion auf Mausklicks und Bewegungen, Tastaturaktivitäten
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyb);
//Callback zum Zeichnen der GL-Funktionen
glutDisplayFunc(DrawScene);
glutMainLoop();
return EXIT_SUCCESS;
}