1 /****************************************************************************
2 **
3 ** Kamera.cpp Stefan Disch, Tobias Nopper, Martina Welte 2001
4 **
5 *****************************************************************************/
6
7 #include <math.h>
8 #include <stdio.h> //2CHANGE wieder raus wenn kein printf mehr drin
9 #include "Kugel.h"
10 #include "Kamera.h"
11
12 #ifndef M_PI
13 #define M_PI 3.14159265358979323846
14 #endif
15
16 GLfloat BewegFaktor=.3;
17 GLfloat DrehFaktor=.3;
18 GLfloat Positionen[12][6]; // Array zum Abspeichern der Kamerapositionen
19
20 /* --------- Konstruktor ---------- */
Kamera()21 Kamera::Kamera() {
22 // Generieren der vordefinierten Kamerapositionen
23 Alpha=60.0;Beta=60.0;
24 Pos_x=-100.0;Pos_y=-50.0;Pos_z=50.0;
25 FOV=38.6;
26 speicherePosition(0);
27
28 Alpha=0;Beta=0;
29 Pos_x=0;Pos_y=0;Pos_z=400;
30 FOV=30.7;
31 speicherePosition(1);
32
33 Alpha=80;Beta=90;
34 Pos_x=-170;Pos_y=0;Pos_z=30;
35 FOV=38.6;
36 speicherePosition(2);
37
38 Alpha=80;Beta=-90;
39 Pos_x=170;Pos_y=0;Pos_z=30;
40 FOV=38.6;
41 speicherePosition(3);
42
43 Alpha=53;Beta=90;
44 Pos_x=-220;Pos_y=0;Pos_z=120;
45 FOV=38.6;
46 speicherePosition(4);
47
48 Alpha=53;Beta=-90;
49 Pos_x=220;Pos_y=0;Pos_z=120;
50 FOV=38.6;
51 speicherePosition(5);
52
53 Alpha=48;Beta=123.5;
54 Pos_x=-229;Pos_y=121;Pos_z=176;
55 FOV=38.6;
56 speicherePosition(7);
57
58 Alpha=48;Beta=56.5;
59 Pos_x=-229;Pos_y=-121;Pos_z=176;
60 FOV=38.6;
61 speicherePosition(6);
62
63 Soll_Pos_x=-60;
64 Soll_Pos_y=-30;
65 Rundflug(0);
66 Alpha=Soll_Alpha;
67 Beta=Soll_Beta;
68 Pos_x=Soll_Pos_x;
69 Pos_y=Soll_Pos_y;
70 Pos_z=Soll_Pos_z;
71
72 Aspekt=1.333333;
73
74 Verfolgung=-1;
75
76 Alpha=100;Beta=0;
77 Pos_x=0;Pos_y=-200;Pos_z=20;
78 FOV=38.6;
79
80 }
81
82
male()83 void Kamera::male() {
84 glMatrixMode(GL_PROJECTION); // Kameraparameter!
85 glLoadIdentity(); // zuruecksetzen
86 gluPerspective(FOV,Aspekt,Nah,Fern);
87
88 glMatrixMode(GL_MODELVIEW); // Blickpunkt!
89 glLoadIdentity(); // Kamera an den Ursprung setzen
90
91 glRotatef(Alpha,-1,0,0); // um Alpha nach oben und Beta nach Rechts drehen
92 glRotatef(Beta,0,0,1);
93 // an die gewuenschte Position setzen
94 glTranslatef(-Pos_x,-Pos_y,-Pos_z);
95
96 //glEnable(GL_LIGHTING);
97 }
98
99 //setzt die Kamera an eine neue Position
neuePosition(GLfloat Position[])100 void Kamera::neuePosition(GLfloat Position[]) {
101 Soll_Pos_x = Position[0];
102 Soll_Pos_y = Position[1];
103 Soll_Pos_z = Position[2];
104 Soll_Alpha = Position[3];
105 Soll_Beta = Position[4];
106 Soll_FOV = Position[5];
107 BlickTiefeNeuBestimmen();
108 Verfolgung=-1;
109 }
110
111 //gibt die aktuelle Kameraposition zur"uck
112 //GLfloat* Kamera::Position() {
113 // GLfloat temp[] ={Soll_Pos_x,Soll_Pos_y,Soll_Pos_z,Soll_Alpha,Soll_Beta,Soll_FOV};
114 // return temp;
115 //}
116
Pos_xCM()117 GLfloat Kamera::Pos_xCM() {
118 return Pos_x;
119 }
120
Pos_yCM()121 GLfloat Kamera::Pos_yCM() {
122 return Pos_y;
123 }
124
Pos_zCM()125 GLfloat Kamera::Pos_zCM() {
126 return Pos_z;
127 }
128
129 //schreibt die aktuelle Kameraposition in die Tabelle ab
speicherePosition(GLint Platz)130 void Kamera::speicherePosition(GLint Platz) {
131 Positionen[Platz][0]=Pos_x;
132 Positionen[Platz][1]=Pos_y;
133 Positionen[Platz][2]=Pos_z;
134 Positionen[Platz][3]=Alpha;
135 Positionen[Platz][4]=Beta;
136 Positionen[Platz][5]=FOV;
137 //2DEL
138 //printf("%i: %f %f %f %f %f %f \n",Platz,Pos_x,Pos_y,Pos_z,Alpha,Beta,FOV);
139 }
140
141 // l"adt eine Kameraposition aus der Tabelle
ladePosition(GLint Platz)142 void Kamera::ladePosition(GLint Platz) {
143 setzeSollPosition(Positionen[Platz]);
144 Verfolgung=-1;
145 }
146
147 // Bewegt die Kamera in Blickrichtung
Beweg_Rein(GLfloat Faktor)148 void Kamera::Beweg_Rein(GLfloat Faktor) {
149 Soll_Pos_x+=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*sin(Soll_Beta/57.29578);
150 Soll_Pos_y+=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*cos(Soll_Beta/57.29578);
151 Soll_Pos_z-=2*BewegFaktor*Faktor*cos(Soll_Alpha/57.29578);
152 // if (Pos_z>400) {Pos_z=400;}
153 if (Soll_Pos_z<2.8) {Soll_Pos_z=2.9;}
154 BlickTiefeNeuBestimmen();
155 Verfolgung=-1;
156 }
157
158 // Bewegt die Kamera gegen die Blickrichtung
Beweg_Raus(GLfloat Faktor)159 void Kamera::Beweg_Raus(GLfloat Faktor) {
160 Soll_Pos_x-=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*sin(Soll_Beta/57.29578);
161 Soll_Pos_y-=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*cos(Soll_Beta/57.29578);
162 Soll_Pos_z+=2*BewegFaktor*Faktor*cos(Soll_Alpha/57.29578);
163 // if (Pos_z>400) {Pos_z=400;}
164 if (Soll_Pos_z<2.8) {Soll_Pos_z=2.8;}
165 BlickTiefeNeuBestimmen();
166 Verfolgung=-1;
167 }
168
169 // Bewegt die Kamera in Blickrichtung, aber unter Beibehaltung der H"ohe
Beweg_Vor(GLfloat Faktor)170 void Kamera::Beweg_Vor(GLfloat Faktor) {
171 Soll_Pos_x+=2*BewegFaktor*Faktor*sin(Soll_Beta/57.29578);
172 Soll_Pos_y+=2*BewegFaktor*Faktor*cos(Soll_Beta/57.29578);
173 BlickTiefeNeuBestimmen();
174 Verfolgung=-1;
175 }
176
177 // Bewegt die Kamera gegen die Blickrichtung, aber unter Beibehaltung der H"ohe
Beweg_Zurueck(GLfloat Faktor)178 void Kamera::Beweg_Zurueck(GLfloat Faktor) {
179 Soll_Pos_x-=2*BewegFaktor*Faktor*sin(Soll_Beta/57.29578);
180 Soll_Pos_y-=2*BewegFaktor*Faktor*cos(Soll_Beta/57.29578);
181 BlickTiefeNeuBestimmen();
182 Verfolgung=-1;
183 }
184
185 // Bewegt die Kamera nach rechts
Beweg_Rechts(GLfloat Faktor)186 void Kamera::Beweg_Rechts(GLfloat Faktor) {
187 Soll_Pos_x+=BewegFaktor*Faktor*cos(Soll_Beta/57.29578);
188 Soll_Pos_y-=BewegFaktor*Faktor*sin(Soll_Beta/57.29578);
189 BlickTiefeNeuBestimmen();
190 Verfolgung=-1;
191 }
192
193 // Bewegt die Kamera nach links
Beweg_Links(GLfloat Faktor)194 void Kamera::Beweg_Links(GLfloat Faktor) {
195 Soll_Pos_x-=BewegFaktor*Faktor*cos(Soll_Beta/57.29578);
196 Soll_Pos_y+=BewegFaktor*Faktor*sin(Soll_Beta/57.29578);
197 BlickTiefeNeuBestimmen();
198 Verfolgung=-1;
199 }
200
201 // Bewegt die Kamera nach oben
Beweg_Hoch(GLfloat Faktor)202 void Kamera::Beweg_Hoch(GLfloat Faktor) {
203 Soll_Pos_z+=BewegFaktor*Faktor;
204 // if (Pos_z>400) {Pos_z=400;}
205 BlickTiefeNeuBestimmen();
206 Verfolgung=-1;
207 }
208
209 // Bewegt die Kamera nach unten
Beweg_Runter(GLfloat Faktor)210 void Kamera::Beweg_Runter(GLfloat Faktor) {
211 Soll_Pos_z-=BewegFaktor*Faktor;
212 if (Soll_Pos_z<2.8) {Soll_Pos_z=2.8;}
213 BlickTiefeNeuBestimmen();
214 Verfolgung=-1;
215 }
216
217 // Vergr"o"sert den Zoom
Zoom_Rein(GLfloat Faktor)218 void Kamera::Zoom_Rein(GLfloat Faktor) {
219 Soll_FOV-=BewegFaktor*Faktor;
220 if (Soll_FOV<1) {Soll_FOV=1;}
221 Verfolgung=-1;
222 }
223
224 // Verkleinert den Zoom
Zoom_Raus(GLfloat Faktor)225 void Kamera::Zoom_Raus(GLfloat Faktor) {
226 Soll_FOV+=BewegFaktor*Faktor;
227 Verfolgung=-1;
228 }
229
230 // Vergr"o"sert den Vertigo
Vertigo_Rein(GLfloat Faktor)231 void Kamera::Vertigo_Rein(GLfloat Faktor) {
232 Soll_Pos_x-=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*sin(Soll_Beta/57.29578);
233 Soll_Pos_y-=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*cos(Soll_Beta/57.29578);
234 Soll_Pos_z+=2*BewegFaktor*Faktor*cos(Soll_Alpha/57.29578);
235 Soll_FOV=2077*cos(Soll_Alpha/57.29578)/Soll_Pos_z;
236 if (Soll_FOV<1) {Soll_FOV=1;}
237 Verfolgung=-1;
238 }
239
240 // Verkleinert den Vertigo
Vertigo_Raus(GLfloat Faktor)241 void Kamera::Vertigo_Raus(GLfloat Faktor) {
242 Soll_Pos_x+=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*sin(Soll_Beta/57.29578);
243 Soll_Pos_y+=2*BewegFaktor*Faktor*sin(Soll_Alpha/57.29578)*cos(Soll_Beta/57.29578);
244 Soll_Pos_z-=2*BewegFaktor*Faktor*cos(Soll_Alpha/57.29578);
245 Soll_FOV=2077*cos(Soll_Alpha/57.29578)/Soll_Pos_z;
246 Verfolgung=-1;
247 }
248
249 // Dreht die Kamera nach rechts
Dreh_Rechts(GLfloat Faktor)250 void Kamera::Dreh_Rechts(GLfloat Faktor) {
251 Soll_Beta+=Faktor*DrehFaktor;
252 Verfolgung=-1;
253 }
254
255 // Dreht die Kamera nach links
Dreh_Links(GLfloat Faktor)256 void Kamera::Dreh_Links(GLfloat Faktor) {
257 Soll_Beta-=Faktor*DrehFaktor;
258 Verfolgung=-1;
259 }
260
261 // Dreht die Kamera nach oben
Dreh_Hoch(GLfloat Faktor)262 void Kamera::Dreh_Hoch(GLfloat Faktor) {
263 Soll_Alpha+=Faktor*DrehFaktor;
264 if (Soll_Alpha>90) {Soll_Alpha=90;}
265 if (Soll_Alpha<0) {Soll_Alpha=0;}
266 Verfolgung=-1;
267 }
268
269 // Dreht die Kamera nach unten
Dreh_Runter(GLfloat Faktor)270 void Kamera::Dreh_Runter(GLfloat Faktor) {
271 Soll_Alpha-=Faktor*DrehFaktor;
272 if (Soll_Alpha>90) {Soll_Alpha=90;}
273 if (Soll_Alpha<0) {Soll_Alpha=0;}
274 Verfolgung=-1;
275 }
276
Schwenk_Links(GLfloat Faktor,GLfloat Mitte_x,GLfloat Mitte_y)277 void Kamera::Schwenk_Links(GLfloat Faktor, GLfloat Mitte_x, GLfloat Mitte_y) {
278 GLfloat Abstand=sqrt((Mitte_x-Soll_Pos_x)*(Mitte_x-Soll_Pos_x)+(Mitte_y-Soll_Pos_y)*(Mitte_y-Soll_Pos_y));
279 if (Abstand<5) Abstand=5;
280 Soll_Beta+=Faktor*DrehFaktor*7.338/sqrt(Abstand);
281 Soll_Pos_x=Mitte_x-Abstand*sin(Soll_Beta/57.29578);
282 Soll_Pos_y=Mitte_y-Abstand*cos(Soll_Beta/57.29578);
283 BlickTiefeNeuBestimmen();
284 Verfolgung=-1;
285 }
286
Schwenk_Rechts(GLfloat Faktor,GLfloat Mitte_x,GLfloat Mitte_y)287 void Kamera::Schwenk_Rechts(GLfloat Faktor, GLfloat Mitte_x, GLfloat Mitte_y) {
288 GLfloat Abstand=sqrt((Mitte_x-Soll_Pos_x)*(Mitte_x-Soll_Pos_x)+(Mitte_y-Soll_Pos_y)*(Mitte_y-Soll_Pos_y));
289 if (Abstand<5) Abstand=5;
290 Soll_Beta-=Faktor*DrehFaktor*7.338/sqrt(Abstand);
291 Soll_Pos_x=Mitte_x-Abstand*sin(Soll_Beta/57.29578);
292 Soll_Pos_y=Mitte_y-Abstand*cos(Soll_Beta/57.29578);
293 BlickTiefeNeuBestimmen();
294 Verfolgung=-1;
295 }
296
Schwenk_Hoch(GLfloat Faktor,GLfloat Mitte_x,GLfloat Mitte_y)297 void Kamera::Schwenk_Hoch(GLfloat Faktor, GLfloat Mitte_x, GLfloat Mitte_y) {
298 GLfloat Abstand=sqrt((Mitte_x-Soll_Pos_x)*(Mitte_x-Soll_Pos_x)+(Mitte_y-Soll_Pos_y)*(Mitte_y-Soll_Pos_y)+(Soll_Pos_z-2.8)*(Soll_Pos_z-2.8));
299 if (Abstand==0) {
300 Soll_Alpha=0;
301 } else {
302 Soll_Alpha+=Faktor*DrehFaktor*7.338/sqrt(Abstand);
303 if (Soll_Alpha<0) {Soll_Alpha=0;}
304 if (Soll_Alpha>90) {Soll_Alpha=90;}
305 }
306 Soll_Pos_x=Mitte_x-Abstand*sin(Soll_Beta/57.29578)*sin(Soll_Alpha/57.29578);
307 Soll_Pos_y=Mitte_y-Abstand*cos(Soll_Beta/57.29578)*sin(Soll_Alpha/57.29578);
308 Soll_Pos_z=2.8+Abstand*cos(Soll_Alpha/57.29578);
309 // if (Pos_z>400) {Pos_z=400;}
310 if (Soll_Pos_z<2.8) {Soll_Pos_z=2.8;}
311 BlickTiefeNeuBestimmen();
312 Verfolgung=-1;
313 }
314
Schwenk_Runter(GLfloat Faktor,GLfloat Mitte_x,GLfloat Mitte_y)315 void Kamera::Schwenk_Runter(GLfloat Faktor, GLfloat Mitte_x, GLfloat Mitte_y) {
316 GLfloat Abstand=sqrt((Mitte_x-Soll_Pos_x)*(Mitte_x-Soll_Pos_x)+(Mitte_y-Soll_Pos_y)*(Mitte_y-Soll_Pos_y)+(Soll_Pos_z-2.8)*(Soll_Pos_z-2.8));
317 if (Abstand==0) {
318 Soll_Alpha=0;
319 } else {
320 Soll_Alpha-=Faktor*DrehFaktor*7.338/sqrt(Abstand);
321 if (Soll_Alpha<0) {Soll_Alpha=0;}
322 if (Soll_Alpha>90) {Soll_Alpha=90;}
323 }
324 Soll_Pos_x=Mitte_x-Abstand*sin(Soll_Beta/57.29578)*sin(Soll_Alpha/57.29578);
325 Soll_Pos_y=Mitte_y-Abstand*cos(Soll_Beta/57.29578)*sin(Soll_Alpha/57.29578);
326 Soll_Pos_z=2.8+Abstand*cos(Soll_Alpha/57.29578);
327 // if (Pos_z>400) {Pos_z=400;}
328 if (Soll_Pos_z<2.8) {Soll_Pos_z=2.8;}
329 BlickTiefeNeuBestimmen();
330 Verfolgung=-1;
331 }
332
setzeSollPosition(GLfloat Soll_Pos[6])333 void Kamera::setzeSollPosition(GLfloat Soll_Pos[6]) {
334 Soll_Pos_x = Soll_Pos[0];
335 Soll_Pos_y = Soll_Pos[1];
336 Soll_Pos_z = Soll_Pos[2];
337 Soll_Alpha = Soll_Pos[3];
338 Soll_Beta = Soll_Pos[4];
339 Soll_FOV = Soll_Pos[5];
340
341 Beta=fmod(Beta,360);
342 Soll_Beta=fmod(Soll_Beta,360);
343
344 if (Soll_Beta>Beta+180) {Soll_Beta-=360;}
345 if (Soll_Beta<Beta-180) {Soll_Beta+=360;}
346 BlickTiefeNeuBestimmen();
347 Verfolgung=-1;
348 }
349
setzeSollPosition(GLfloat SollPosx,GLfloat SollPosy,GLfloat SollPosz,GLfloat SollAlpha,GLfloat SollBeta,GLfloat SollFOV)350 void Kamera::setzeSollPosition(GLfloat SollPosx,
351 GLfloat SollPosy,
352 GLfloat SollPosz,
353 GLfloat SollAlpha,
354 GLfloat SollBeta,
355 GLfloat SollFOV) {
356 Soll_Pos_x = SollPosx;
357 Soll_Pos_y = SollPosy;
358 Soll_Pos_z = SollPosz;
359 Soll_Alpha = SollAlpha;
360 Soll_Beta = SollBeta;
361 Soll_FOV = SollFOV;
362
363 Beta=fmod(Beta,360);
364 Soll_Beta=fmod(Soll_Beta,360);
365
366 if (Soll_Beta>Beta+180) {Soll_Beta-=360;}
367 if (Soll_Beta<Beta-180) {Soll_Beta+=360;}
368 Verfolgung=-1;
369 }
370
BlickeAuf(GLfloat Blickpunkt[2])371 void Kamera::BlickeAuf(GLfloat Blickpunkt[2]) {
372 BlickeAuf(Blickpunkt[0],Blickpunkt[1]);
373 }
374
BlickeAuf(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y)375 void Kamera::BlickeAuf(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y) {
376 GLfloat SollPosx=50*(Pos_x-Blickpunkt_x)/
377 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
378 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
379 Blickpunkt_x;
380 GLfloat SollPosy=50*(Pos_y-Blickpunkt_y)/
381 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
382 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
383 Blickpunkt_y;
384 GLfloat SollPosz=20;
385 GLfloat SollAlpha=71.0167;
386 GLfloat SollBeta=atan((Blickpunkt_x-SollPosx)/(Blickpunkt_y-SollPosy))*180/M_PI;
387 if (SollPosy>Blickpunkt_y) {SollBeta-=180;}
388 GLfloat SollFOV=38.6;
389
390 setzeSollPosition(SollPosx,SollPosy,SollPosz,SollAlpha,SollBeta,SollFOV);
391 Verfolgung=-1;
392 }
393
BlickeAuf2(GLfloat Blickpunkt[2])394 void Kamera::BlickeAuf2(GLfloat Blickpunkt[2]) {
395 BlickeAuf2(Blickpunkt[0],Blickpunkt[1]);
396 }
397
BlickeAuf2(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y)398 void Kamera::BlickeAuf2(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y) {
399 GLfloat SollPosx=80*(Pos_x-Blickpunkt_x)/
400 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
401 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
402 Blickpunkt_x;
403 GLfloat SollPosy=80*(Pos_y-Blickpunkt_y)/
404 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
405 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
406 Blickpunkt_y;
407 GLfloat SollPosz=50;
408 GLfloat SollAlpha=72;
409 GLfloat SollBeta=atan((Blickpunkt_x-SollPosx)/(Blickpunkt_y-SollPosy))*180/M_PI;
410 if (SollPosy>Blickpunkt_y) {SollBeta-=180;}
411 GLfloat SollFOV=38.6;
412
413 setzeSollPosition(SollPosx,SollPosy,SollPosz,SollAlpha,SollBeta,SollFOV);
414 Verfolgung=-1;
415 }
416
BlickeAuf3(GLfloat Blickpunkt[2])417 void Kamera::BlickeAuf3(GLfloat Blickpunkt[2]) {
418 BlickeAuf3(Blickpunkt[0],Blickpunkt[1]);
419 }
420
BlickeAuf3(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y)421 void Kamera::BlickeAuf3(GLfloat Blickpunkt_x,GLfloat Blickpunkt_y) {
422 GLfloat SollPosx=80*(Pos_x-Blickpunkt_x)/
423 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
424 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
425 Blickpunkt_x;
426 GLfloat SollPosy=80*(Pos_y-Blickpunkt_y)/
427 sqrt((Blickpunkt_x-Pos_x)*(Blickpunkt_x-Pos_x)+
428 (Blickpunkt_y-Pos_y)*(Blickpunkt_y-Pos_y))+
429 Blickpunkt_y;
430 GLfloat SollPosz=50;
431 GLfloat SollAlpha=58;
432 GLfloat SollBeta=atan((Blickpunkt_x-SollPosx)/(Blickpunkt_y-SollPosy))*180/M_PI;
433 if (SollPosy>Blickpunkt_y) {SollBeta-=180;}
434 GLfloat SollFOV=38.6;
435
436 setzeSollPosition(SollPosx,SollPosy,SollPosz,SollAlpha,SollBeta,SollFOV);
437 Verfolgung=-1;
438 }
439
Fahrt(GLfloat Faktor)440 void Kamera::Fahrt(GLfloat Faktor) {
441 if (Verfolgung!=-1) {
442 if (Kugel[Verfolgung].Pos_x()==3000.0) {
443 Verfolgung=-1;
444 } else {
445 GLint Verfolgung2=Verfolgung;
446 BlickeAuf3(Kugel[Verfolgung].Pos_xCM(),Kugel[Verfolgung].Pos_yCM());
447 Verfolgung=Verfolgung2;
448 }
449 }
450
451 for (int i=0;i<Faktor;i++) {
452
453 if (Soll_Beta-Beta<-180){Beta-=360;}
454 if (Soll_Beta-Beta> 180){Beta+=360;}
455
456 d_Pos_x = d_Pos_x * 0.9 + 0.003 * (Soll_Pos_x-Pos_x);
457 d_Pos_y = d_Pos_y * 0.9 + 0.003 * (Soll_Pos_y-Pos_y);
458 d_Pos_z = d_Pos_z * 0.9 + 0.003 * (Soll_Pos_z-Pos_z);
459 d_Alpha = d_Alpha * 0.9 + 0.003 * (Soll_Alpha-Alpha);
460 d_Beta = d_Beta * 0.9 + 0.003 * (Soll_Beta-Beta);
461 d_FOV = d_FOV * 0.9 + 0.003 * (Soll_FOV-FOV);
462
463 Pos_x += d_Pos_x;
464 Pos_y += d_Pos_y;
465 Pos_z += d_Pos_z;
466 Alpha += d_Alpha;
467 Beta += d_Beta;
468 FOV += d_FOV;
469
470 BlickTiefeNeuBestimmen();
471
472 }
473 }
474
Verfolge(GLint Kugel)475 void Kamera::Verfolge(GLint Kugel) {
476 Verfolgung=Kugel;
477 }
478
BlickTiefeNeuBestimmen()479 void Kamera::BlickTiefeNeuBestimmen() {
480 GLfloat ax=fabs(Pos_x),ay=fabs(Pos_y),az=Pos_z;
481
482 if (ax<150) {
483 if (ay<80) {
484 Nah=az-5;
485 } else {
486 Nah=sqrt((ay-80)*(ay-80)+(az-5)*(az-5));
487 }
488 } else {
489 if (ay<80) {
490 Nah=sqrt((ax-150)*(ax-150)+(az-5)*(az-5));
491 } else {
492 Nah=sqrt((ax-150)*(ax-150)+(ay-80)*(ay-80)+(az-5)*(az-5));
493 }
494 }
495
496 Nah*=.8;
497
498 if (Nah<1) {Nah=1;}
499
500 Fern=sqrt((ax+150)*(ax+150)+(ay+80)*(ay+80)+az*az);
501 // printf ("Nah: %f\nFern: %f\n\n",Nah,Fern); 2DEL
502
503 }
504
Rundflug(GLint Faktor)505 void Kamera::Rundflug(GLint Faktor){
506 if (Soll_Pos_y==0) {Soll_Pos_y=.00001;}
507 //Soll_Beta=Faktor*.1+atan(Soll_Pos_x/Soll_Pos_y)*180/M_PI;
508 //if (Soll_Pos_y>0) {Soll_Beta-=180;}
509 Soll_Beta+=.1*Faktor;
510 Soll_Pos_x=(-30*sin(Soll_Beta*M_PI/180)-280)*sin(Soll_Beta*M_PI/180);
511 Soll_Pos_y=(-30*sin(Soll_Beta*M_PI/180)-280)*cos(Soll_Beta*M_PI/180);
512 Soll_Pos_z=100-50*sin(Soll_Beta*M_PI/180);
513 Soll_FOV=36.8;
514 Soll_Alpha=atan(sqrt(Soll_Pos_x*Soll_Pos_x+
515 Soll_Pos_y*Soll_Pos_y)/
516 Soll_Pos_z)*180/M_PI;
517 }
518