Zoom & Kamerabewegungkuddelmuddel

J

Joschua Fink

Hallo,
ich schreibe gerade in Java ein Programm, mit dem ich 2D-Fraktale u.a. erzeugen und als Animation ausgeben kann. Um diese darzustellen nutze ich eine "2D-Kamera". Soweit klappt alles ganz gut.
Mein Problem liegt in einer eigentlich logischen Folge der Kamera: Wenn ich die Kamera über mein Fraktal (meine Bildfläche) bewege, wirkt die Bewegung schneller, wenn ich "näher" an mein Objekt gezoomt hat. Das ist logisch, weil die Kamera ja wenn sie ein kleineres Sichtfenster hat (eingezoomt) bei gleicher Strecke proportional mehr Bildausschnitte von sich selber passieren muss, als wenn sie ein größeres Sichtfenster hat. Wenn ich jetzt mit der Kamera zoome und sie gleichzeitig bewege wechselt der Bildausschnitt immer schneller und es wirkt so, als würde die Kamera sich beschleunigen. Das ist mein Problem. Hoffentlich einigermaßen verständlich.

Den Sichtfensterausschnitt definiere ich folgendermaßen:
Code:
Sichtfensterausschnitt = Bildbreite * e ^ Zoom
Bildbreite ist die Anzahl der Pixel, die hinterher mein angezeigtes Bild breit ist, allerdings ist das höchstwahrscheinlich unwichtig.
e ist die eulerische Zahl und die benutze ich, weil Java den Logarithmus dazu kann, also einfacher zu rechnen. Außerdem ist e als Basis für die Wahl meines Bildauschnitts besser.
Zoom ist ein beliebiger Wert, der letztendlich die Sichtfensterbreite regelt.

Um die Kamerabewegung proportional zum aktuellen Zoomwert zu machen habe ich folgenden Code geschrieben:
Code:
protected double WerteVerlaufZoomProportional (int Höhe, int Keyframe1, int Keyframe2, int Frame) {

double ZoomJetzt = 0d;
double ZoomNull = 0d;
double ZoomGesamt = 0d;
double ZoomVormals = 0d;
double [] Werte;

for(int i = Keyframe1; i <= Keyframe2; i++){
  Werte = ladeFrameAusAnimation(i, 2);
   if(Werte[1] == 1){
      ZoomGesamt 	+= Werte[0];
      if(i == 0){ ZoomNull = ZoomGesamt; }
      if(i == Frame-1){ ZoomJetzt = ZoomGesamt; }
   }
}

ZoomJetzt  -= ZoomNull;
ZoomGesamt -= ZoomNull;
double V = (((dKamera)T.Datenraum).Animation[Keyframe2][Höhe]-((dKamera)T.Datenraum).Animation[Keyframe1][Höhe]);
double T1 = ZoomJetzt/ZoomGesamt*V+((dKamera)T.Datenraum).Animation[Keyframe1][Höhe];

return T1;
}

Der Code selber ist natürlich etwas unsauber, weil ich gerade am experimentieren bin. Zur Erläuterung:
Die Funktion wird aufgerufen, wenn ein Frame aus der Animation geladen wird. Bestimmte Frames sind Keyframes, also von mir bestimmte Frames. Die Frames dazwischen werden vom Computer (falsch) berechnet.
Keyframe1 ist der Keyframe vor dem Frame an dem ich mich befinde und Keyframe2 der Frame dannach.
Mit der for-Schleife versuche ich den Integral des Zooms zu bilden. Diesen verwurste ich dann über den Strahlensatz.
Das klappt fast gut. Nur sind mein Problem Vorzeichenwechsel des Zoomwerts. Die Bewegung stimmt, nur die Vorzeichenwechsel machen mir zu schaffen. Sie sind für den Rest des Programms wichtig, aber bei dieser Funktion nerven sie.

Tut mir leid, wenn ich es gerade nicht besser beschreiben kann. Ich kapier es gerade selber nicht mehr ganz.

Gruß Joschua Fink
 
Hallo,
ich habe das Problem gelößt:
Code:
	protected double WerteVerlaufZoomProportional (int Höhe, int Keyframe1, int Keyframe2, int Frame) {
		double [] Werte;
		double S = ((dKamera)T.Datenraum).Animation[Keyframe2][Höhe]-((dKamera)T.Datenraum).Animation[Keyframe1][Höhe];
		double Bn = 0;
		double Bj = 0;
		
		for(int i = Keyframe1; i <= Keyframe2; i++){
			Werte = ladeFrameAusAnimation(i, 2);
			if(Werte[1] == 1){
				Bn 	+= S/Math.pow(Math.E, Werte[0]);
				if(i == Frame-1){ Bj = Bn; }
			}
		}

		return Bj * S / Bn + ((dKamera)T.Datenraum).Animation[Keyframe1][Höhe];
	}

Gruß Joschua Fink
 
Zurück