1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#include <stdlib.h>
#include <iostream>
#include <gl/glut.h>
#include <math.h>
using namespace std;
int WindowWidth = 800;
int WindowHeight = 600;
float angle[2]={0.0f, 0.0f};//1. x-Achse, 2.Y-Achse
float PositionTranslatef[3]={0.0f, 0.0f, -15.0f};
int MousePosX, MousePosY;
POINT CursorPos;
float schrittlaenge=0.1f;
float pi=3.141592654f;
float pi_180=pi/180;
void handleKeypress(unsigned char key, int x, int y)
{
switch (key)
{
case 27: //Escape-Taste:27
exit(0);
break;
}
}
void MouseMove(void)
{
GetCursorPos(&CursorPos);
int tempPosX=CursorPos.x;
int tempPosY=CursorPos.y;
int diffX=MousePosX-tempPosX;
int diffY=MousePosY-tempPosY;
angle[0]-=diffX;
angle[1]-=diffY;
SetCursorPos(100, 100); //Maus an die Position setzen, damit maus nicht den Rand berührt.
MousePosX=100;
MousePosY=100;
}
void Moves(int value)
{
MouseMove();
if(GetAsyncKeyState(0x26)){ PositionTranslatef[0]+=schrittlaenge*cos(pi_180*angle[0]+pi_180*90); PositionTranslatef[2]+=schrittlaenge*sin(pi_180*angle[0]+pi_180*90);}//Up
if(GetAsyncKeyState(0x28)){ PositionTranslatef[0]+=schrittlaenge*cos(pi_180*angle[0]-pi_180*90); PositionTranslatef[2]+=schrittlaenge*sin(pi_180*angle[0]-pi_180*90);}//Down
if(GetAsyncKeyState(0x25)){ PositionTranslatef[0]+=schrittlaenge*cos(pi_180*angle[0]); PositionTranslatef[2]+=schrittlaenge*sin(pi_180*angle[0]);}//Left
if(GetAsyncKeyState(0x27)){ PositionTranslatef[0]+=schrittlaenge*cos(pi_180*angle[0]+pi_180*180); PositionTranslatef[2]+=schrittlaenge*sin(pi_180*angle[0]+pi_180*180);}//Right
glutPostRedisplay();
glutTimerFunc(25, Moves, 0);
}
void initRendering()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
}
void handleResize(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (double) w/(double) h, 0.5, 200.0);
}
void DrawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(2.0f, 2.0f, 2.0f, 0.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat ambientColor[] = {0.2f, 0.2f, 0.2f, 1.0f};//Farbe
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);
GLfloat lightColor0[] = {0.5f, 0.5f, 0.5f, 1.0f}; //Helligkeit
GLfloat lightPos0[] = {0.0f, 0.0f, 0.0f, 1.0f}; //Position
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);
glPushMatrix();
glRotatef(angle[0], 0.0f, 1.0f, 0.0f);
glRotatef(angle[1], 1.0f, 0.0f, 0.0f);
glTranslatef(PositionTranslatef[0], PositionTranslatef[1], PositionTranslatef[2]);
glTranslatef(-0.7f, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(0.5, 50, 50);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WindowWidth, WindowHeight);
glutCreateWindow("");
initRendering();
//glutFullScreen(); //Falls Vollbild
glutSetCursor(GLUT_CURSOR_NONE); //Falls kein Cursor im Bild sein soll
glutDisplayFunc(DrawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
SetCursorPos(100, 100); //Maus an die Position setzen, damit maus nicht den Rand berührt.
GetCursorPos(&CursorPos);
MousePosX=CursorPos.x;
MousePosY=CursorPos.y;
glutTimerFunc(25, Moves, 0);// Update alle 25 millisekunden
glutMainLoop();
return 0;
}
|