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