# Rotationsberechnung



## Shadowlauch (7. Jan 2013)

Ich hoffe ich kann mein Problem gut genug beschreiben, habe schon an dem Titel 3 Jahre überlegt und es ist sowas dabei rausgekommen.

Erstmal danke schonmal und Hallo (bin das erste mal hier aber bestimmt nicht das letzte mal)

Ich habe mich vor einigen Tagen an die Arbeit gemacht und ein bisschen rumprobiert ein Spiel zu entwickeln, nicht um jmd zu unterhalten eher um Erfahung zu sammeln usw.

Um einfach anzufangen (dachte ich mir) wollte ich ein Spacespiel in der Form von SPAZ machen (Sicht von oben 2D). Das Schiff (welches zentriert in der Mitte ist) richtet sich nach der Maus aus. 

Beim Maus ausrichten liegt das Problem bzw. beim langsamen ausrichten, denn damit es nicht total "unrealistisch" wird passt sich das Schiff nicht direkt dem Winkel zur Maus an sondern verkleinert in langsam, sprich das Schiff dreht sich langsam zur Maus. Das Problem dabei ist, dass die Zahlen von -90 bis 270 gehen und er mit meiner Berechnung immer den Weg "oben rum nimmt" 

Hier ein Video zur Veranschaulichung: Java Slick 2d Rotate Problem - YouTube


```
double dif = 0;
double oldrot = owner.getRotation();
dif = oldrot - erg;
float z=0;
if(Math.abs(dif)<.5f){
        owner.setRotation((float) erg);
	z=(float) erg;
}
else{
	z=(float) (oldrot - dif/(rotspeed/delta));
	owner.setRotation(z);
}
```

owner.getRotation() -> holt die jetzige Rotation des Schiffes
erg -> ist der Winkel zur Maus (wird direkt vorher berechnet)
owner.setRotation() -> setzt die Rotation des Schiffes
rotspeed -> Variable die gesetzt wird um die Geschwindigkeit bei der rotation zu verändern
delta -> Zeit zwischen Frames

Ich habe vieles ausprobiert aber kein Ansatz brachte ein gutes Ergebnis und ich drehe langsam durch.

Versteht mich nicht falsch ihr sollt mir keinen Code schreiben aber vielleicht habt ihr eine Idee denn meine gehen mir aus.

Vielen Dank nochmal.

Gruß, Lars


----------



## JCODA (8. Jan 2013)

Zufällig hatte ich das letztes Jahr schonmal programmiert. 

Die wichtigen Zeilen sind folgende: 


```
if(target!=null){
			Vec targetDirection = this.pos.sub(target).norm();		
								
			double phi = delta*speed/3000.0*Math.signum(targetDirection.getRadianAngle()-direction.getRadianAngle());
			
			if(Math.abs(targetDirection.getRadianAngle()-direction.getRadianAngle())>Math.PI){
				phi*=-1;
			}
			
			direction = direction.rotate(phi);
			if(Math.abs(targetDirection.getRadianAngle()-direction.getRadianAngle())<Math.toRadians(1)){
				target = null;
				direction=targetDirection.norm();
			}
		}
```

Ich behaupte nicht, dass der Code besonders toll bzw leicht verständlich ist, aber bei Verständnisschwierigkeiten kann ich morgen dazu etwas mehr sagen. Jetzt erstmal :gaen: .


----------



## Shadowlauch (8. Jan 2013)

Vielen Dank. Ich glaube mein fehler liegt in der Berechnung des Cursor Winkels.


----------



## Shadowlauch (9. Jan 2013)

Shadowlauch hat gesagt.:


> Vielen Dank. Ich glaube mein fehler liegt in der Berechnung des Cursor Winkels.



Nochmals vielen Dank. Der Fehler lag bei mir und in der Rotationsberechnung ist nun behoben und es funktioniert wie geölt.


----------

