# Bewegung eines Grafikobjektes



## Guest (12. Feb 2009)

Hallo,

ich arbeite gerade an einer Animation. In dieser soll sich ein Kreis völlig zufällig auf der Ebene bewegen.

Ich berechne auf Grundlage der momentanen Kreisposition und der per Math.random.... berechneten Zielposition eine Gerade durch diese beiden Punkte. Über diese Gerade berechne ich nun den jeweils nächsten y-Wert wobei ich den x-Wert des Kreises in jedem Durchlauf um 1 inkrementiere. Mein Problem ist nun, dass die Geschwindigkeit des Kreises bei höherer Steigung zunimmt, da bei einer Steigung von -sagen wir 85° für jede verschiebung von x um 1, der y-Wert sich um ein vielfaches von x erhöht. 

Meine erste Überlegung hierzu war, in jedem Durchlauf den kreis um 100px statt um 1px zu verschieben. Dadurch könnte man über einen Modifikator die verschiebung auf der x-Achse im verhältnis zur verschiebung auf der y-Achse anpassen. Leider wird die Animation dadurch sehr holperich. Hätte jemand eine idee, wie man dieses Problem lösen könnte?


----------



## Steev (12. Feb 2009)

Holprige Bewegungen sind so eine Geschichte bei Animationen. Optimieren kannst du das ganze folgendermaßen:

1) Verkleineren des sleep-Wertes in der Repaint-Schleife um eine höhere FPS-Rate zu erzeugen, damit wird dein Objekt schneller neugezeichnet und somit kannst du eine schnellere Bewegung in vielen Einzelschritten erzielen.

2) Wenn das nicht reicht, dann musst du größere Einzelschritte benutzen. Nur das alleine reicht aber nicht aus, da die Bewegung dann ja wieder ruckelig ist, also musst du entweder zwischen der alten und der neuen Position des Objekte den Abstand ermitteln und an dieser Position eine Verblasste Instanz deines Objektes zeichnen, oder eine Art Motion-Blur programmieren.


----------



## 0x7F800000 (12. Feb 2009)

Anonymous hat gesagt.:
			
		

> In dieser soll sich ein Kreis völlig zufällig auf der Ebene bewegen.


mit was machst du das denn, jogl, j3d oder eigenbau-software-rasterizer, oder ist das alles 2D?



> eine Gerade durch diese beiden Punkte.


Was für Punkte? ???:L 



> Mein Problem ist nun, dass die Geschwindigkeit des Kreises bei höherer Steigung zunimmt, da bei einer Steigung von -sagen wir 85° für jede verschiebung von x um 1, der y-Wert sich um ein vielfaches von x erhöht.


Ist das jetzt irgendwie doch 2D? Oder was meinst du mit "steigung"? Was machst du da überhaupt mit irgendwelchen Steigungen? :shock:

Irgendwie leuchtet mir absolut nicht ein, was das Problem ist. Random-walk in einer Ebene zu berechnen ist ja nichts abenteuerliches, die lokalen koordinaten samt der ebene irgendwohin schräg in den Raum zu transformieren auch nicht. Könntest du bitte präzisieren, was da überhaupt los ist?


----------



## Guest (12. Feb 2009)

erstmal vielen dank für die Antworten. Dann will ich mal versuchen etwas präzieser zu werden.
Es handelt sich hier um eine Bewegung in der Ebene. Ein Kreis der sich zu Anfang an einer Position (x1,y1) befindet soll sich an die Position (x2,y2) bewegen, mit allen nötigen zwischenschritten, damit es auch eine gleichförmige Bewegung ist. 

Sagen wir der Kreis befindet sich zu Anfang (1. durchlauf) an der Position (0,0) und soll sich auf die Position (100,100) begeben. Damit habe ich zwei Punkte und kann jeden Zwischenpunkt auf dem Weg zu (100,100) berechnen. Bei einer Geschwindigkeit von 1 pixel pro durchlauf, sieht das bei mir dann so aus. 

x-Wert des Kreises um 1 erhöhen. Den neuen x-Wert in die Geradengleichung einsetzen um den resultierenden y-Wert zu bekommen. In diesem Fall wäre das der wert y= 1, im nächsten durchlauf y=2, usw. 

d.h. der kreis würde sich folgendermassen fortbewegen:

0. (0,0)
1. (1,1)
2. (2,2)
...

100 (100,100)

Nun sagen wir mal, der Zielpunkt ist nicht (100,100) sondern (1,100).
Dann würde der y-Wert beim ersten durchlauf (x=0+1) 100 sein. Der Kreis würde folglich sich auf der x-Achse um einen Pixel bewegen aber um 100 pixel auf der y_Achse. Genau das möchte ich nicht. Die Optimierungen werde ich mir mal anschauen.


----------



## Quaxli (12. Feb 2009)

2 Kommentare dazu:

1. Wenn man ein Objekt jeweils um einen fixen Wert bewegt, erhält man meist keine gleichförmige Bewegung, da die repaint-Schleife nicht immer gleich lange benötigt. Es empfiehlt sich daher einen Delta-Wert für x und y zu nehmen (10 Pixel pro Sekunde) und die Bewegung in Abhängigkeit der Zeit, die der letzte Schleifendurchlauf benötigt hat zu berechnen.

2. Damit wären wir auch schon bei Deinem 2. Problem, daß man da gleich miterschlagen kann. Auf die oben beschriebene Art kannst Du für x und y unterschiedliche Deltas setzen und damit in x- und y-Richtung unterschiedlich schnell bewegen.

Wenn Dir das hiflt: Klicke mal in meiner Signatur auf "Spiele-Tutorial", da ist diese Vorgehensweise ausführlich beschrieben.


----------



## 0x7F800000 (12. Feb 2009)

Anonymous hat gesagt.:
			
		

> Dann würde der y-Wert beim ersten durchlauf (x=0+1) 100 sein. Der Kreis würde folglich sich auf der x-Achse um einen Pixel bewegen aber um 100 pixel auf der y_Achse.


und was hindert dich daran, im ersten schritt den Kreis auf die Position (0.01,1) zu verschieben, wenn du das schon in 100 Schritten haben willst? ???:L Was die lineare Interpolation ist, ist hoffentlich bekannt? 

```
x(t)=a+t(b-a); // a,b Punkte in der ebene, t aus dem intervall [0,1] z.b in 0.01 Schritten
```

Allgemeine Bemerkung: sowas wie "Steigung" hat in irgendwelchen Animationen oder gar Spielen meistens überhaupt nichts verloren.


----------



## Guest (12. Feb 2009)

> Wenn Dir das hiflt: Klicke mal in meiner Signatur auf "Spiele-Tutorial", da ist diese Vorgehensweise ausführlich beschrieben.



ja, dass sieht sehr gut aus! Vielen, vielen Dank.



> Allgemeine Bemerkung: sowas wie "Steigung" hat in irgendwelchen Animationen oder gar Spielen meistens überhaupt nichts verloren.



Sehr wohl hat es das wenn es z.B. um Geometrie geht und die Veranschaulichung der Theorie. Und wenn ich mir Deine Antworten so ansehe, erkenne ich weniger den Willen zu helfen als vielmehr den Willen zu korrigieren und zu belehren. 



> Was die lineare Interpolation ist, ist hoffentlich bekannt


Aber natürlich! wo kämen wir denn da hin, wenn jemand der dieses Forum aufsucht nicht weiss was lineare Interpolation ist?! Kaum auszudenken!


----------



## 0x7F800000 (12. Feb 2009)

Anonymous hat gesagt.:
			
		

> Aber natürlich! wo kämen wir denn da hin, wenn jemand der dieses Forum aufsucht nicht weiss was lineare Interpolation ist?! Kaum auszudenken!


ich kann nur hoffen, dass das nicht sarkastisch gemeint war :roll:


----------

