-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain_drone.cpp
More file actions
212 lines (187 loc) · 6.29 KB
/
main_drone.cpp
File metadata and controls
212 lines (187 loc) · 6.29 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include <iostream>
#include <GL/freeglut.h>
#include "Wuerfel.h"
#include "Drone.h"
#define DRONE_N 4
//Vier Drohnen
Drone drones[DRONE_N];
//Variablen für Kameraperspektive
Vector cameraPos, cameraLookAt, cameraUp;
void Init()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glClearDepth(1.0);
glClearColor(0, 0, 0.8, 1);
//Initiale Kameraperspektive setzen
cameraPos.set(0, 10, 25);
cameraLookAt.set(0, 10, 0);
cameraUp.set(0, 1, 0);
//Initiale Positionen der Drohnen setzen
drones[0].move(Vector(0, 10, 10));
drones[1].move(Vector(6, 5, 0));
drones[2].move(Vector(-6, 4, 2));
drones[3].move(Vector(-3, 8, -3));
//2D-Textur generieren
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
//Parameter für Texturen setzen
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLfloat pixels[] = {
0.87, 0.72, 0.53, 1, 1, 1, 0.87, 0.72, 0.53, 1, 1, 1,
1, 1, 1, 0.87, 0.72, 0.53, 1, 1, 1, 0.87, 0.72, 0.53,
0.87, 0.72, 0.53, 1, 1, 1, 0.87, 0.72, 0.53, 1, 1, 1,
1, 1, 1, 0.87, 0.72, 0.53, 1, 1, 1, 0.87, 0.72, 0.53
};
glTexImage2D(GL_TEXTURE_2D, // 2D Textur
0, // Detailsstufe (für Mipmaps)
GL_RGB, // internes Format
4, // Breite
4, // Höhe
0, // Rand (Muss 0 sein)
GL_RGB, // format des pixel buffer
GL_FLOAT, // Datentyp der Komponenten
pixels); // Pixel-Puffer
}
void RenderScene() //Zeichenfunktion
{
glLoadIdentity (); //Aktuelle Model-/View-Transformations-Matrix zuruecksetzen
gluLookAt(cameraPos.getX(), cameraPos.getY(), cameraPos.getZ(),
cameraLookAt.getX(), cameraLookAt.getY(), cameraLookAt.getZ(),
cameraUp.getX(), cameraUp.getY(), cameraUp.getZ());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Den Boden zeichnen (Mit Textur)
glBegin(GL_POLYGON);
glColor3f(0.87, 0.72, 0.53);
glTexCoord2f(0, 0);
glVertex3f(-100, 0, 100);
glTexCoord2f(0, 200);
glVertex3f(-100, 0, -100);
glTexCoord2f(200, 200);
glVertex3f(100, 0, -100);
glTexCoord2f(200, 0);
glVertex3f(100, 0, 100);
glEnd();
//Die Drohnen zeichnen
for(Drone& drone : drones)
drone.draw();
glutSwapBuffers();
}
void Reshape(int width,int height)
{
// Matrix für Transformation: Frustum->viewport
glMatrixMode(GL_PROJECTION);
// Aktuelle Transformations-Matrix zuruecksetzen
glLoadIdentity ();
// Viewport definieren
glViewport(0,0,width,height);
// Frustum definieren
gluPerspective(45, 1, 0.1, 50.0);
// Matrix für Modellierung/Viewing
glMatrixMode(GL_MODELVIEW);
}
void Animate (int value)
{
//Die Position und andere Variablen der Drohnen aktualisieren
for(Drone& drone : drones)
drone.step();
// RenderScene aufrufen
glutPostRedisplay();
// Timer wieder registrieren - Animate wird so nach 10 msec mit value+=1 aufgerufen.
int wait_msec = 10;
glutTimerFunc(wait_msec, Animate, ++value);
}
//Handler für das Runterdrücken von Tasten
void keyboard(unsigned char key, int x, int y) {
switch(key) {
case 'w':
drones[0].addImpulse(Vector(0, 0, -0.1));
break;
case 's':
drones[0].addImpulse(Vector(0, 0, 0.1));
break;
case 'a':
drones[0].addImpulse(Vector(-0.1, 0, 0));
break;
case 'd':
drones[0].addImpulse(Vector(0.1, 0, 0));
break;
case ' ':
drones[0].addImpulse(Vector(0, 0.1, 0));
break;
case 'y':
drones[0].addImpulse(Vector(0, -0.1, 0));
break;
case '1':
cameraPos.set(0, 10, 25);
cameraUp.set(0, 1, 0);
break;
case '2':
cameraPos.set(25, 10, 0);
cameraUp.set(0, 1, 0);
break;
case '3':
cameraPos.set(-25, 10, 0);
cameraUp.set(0, 1, 0);
break;
case '4':
cameraPos.set(0, 49, 0);
cameraUp.set(0, 0, -1);
break;
case '+':
drones[0].setRotorRotationSpeed(drones[0].getRotorRotationSpeed()+1);
break;
case '-':
drones[0].setRotorRotationSpeed(drones[0].getRotorRotationSpeed()-1);
break;
default:
break;
}
}
//Handler für das Loslassen von Tasten
void keyboardUp(unsigned char key, int x, int y) {
switch(key) {
case 'w':
drones[0].addImpulse(Vector(0, 0, 0.1));
break;
case 's':
drones[0].addImpulse(Vector(0, 0, -0.1));
break;
case 'a':
drones[0].addImpulse(Vector(0.1, 0, 0));
break;
case 'd':
drones[0].addImpulse(Vector(-0.1, 0, 0));
break;
case ' ':
drones[0].addImpulse(Vector(0, -0.1, 0));
break;
case 'y':
drones[0].addImpulse(Vector(0, 0.1, 0));
break;
default:
break;
}
}
int main(int argc, char **argv)
{
// GLUT initialisieren
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowSize( 600, 600 ); // Fenster-Konfiguration
glutCreateWindow( "Denis Hirt; Tim Christen" ); // Fenster-Erzeugung
glutDisplayFunc( RenderScene ); // Zeichenfunktion registrieren
glutReshapeFunc( Reshape ); //Reshape-Funktion registrieren
// TimerCallback registrieren; wird nach 10 msec aufgerufen mit Parameter 0
glutTimerFunc( 10, Animate, 0);
//Handler für Tastatureingaben registrieren
glutKeyboardFunc(keyboard);
glutKeyboardUpFunc(keyboardUp);
Init();
glutMainLoop();
return 0;
}