Problem mit smooth (falsche Richtung)

Posted By: Vampir

Problem mit smooth (falsche Richtung) - 04/06/09 19:37

Hi
Ich drehe mein Charakter mit smooth (Point&Click Steuerung):

//target = Zielvektor zu dem gelaufen wird
vec_to_angle(my.pan,target);
my.tilt = 0;
my.pan = smooth(my.pan, 0.95);

Jetzt hab ich das Problem, dass der Player nicht immer
wie es logisch wäre, den kürzesten Weg zum drehen nimmt,
sondern er nimmt immer den Weg von 0 - 360 oder umgekehrt.
Jedoch dreht er nie über die 0.

Wenn also player.pan = 10 ist und der Ziel Winkel = 350.

Dann dreht er den langen Weg von 10 -> 350 statt 350 <- 10.

Wie ihr seht kenn ich das Problem, aber ich weiss nicht wie
ich das elegant löse.

Hab schon einiges probiert mit Winkelkorrektur ang() usw

Thx
Vampir
Posted By: Vampir

Re: Problem mit smooth (falsche Richtung) - 04/07/09 17:35

Dann erkläre ich es mal so, dass ihr mein Problem vielleicht besser versteht.

Hier erst mal ein Bild (klick für vergrösserung):


Der braune Pfeil ist der Mauszeiger.
Wenn ich mit der Maus klicke, dreht sich der Char mit smooth()
richtung Mauszeiger (gelber Pfeil).
Aber er dreht sich nicht in richtung des grünen Pfeils,
sondern nimmt den langen Weg (roter Pfeil).
Also er dreht sich nie über die 180° hinaus.

Wie kann ich das ändern? Ich kann ja smooth keine Richtung
angeben!

Danke für Eure hilfe.

mfg
Vampir
Posted By: Saturnus

Re: Problem mit smooth (falsche Richtung) - 04/07/09 19:23

Wie man es mit smooth macht, weiß ich nicht.
Ich könnte dir nur eine klassische Alternative anbieten. smile

Dieser Code berechnet einen Richtungsvektor von my zu einem Zielvektor (hier target genannt). my wird nach links oder rechts rotiert, abhängig davon, ob die Differenz zwischen dem pan des Richtungsvektors und dem pan von my positiv oder negativ ist. Die "maximale" Roationsgeschwindigkeit (ohne time_step-Korrektur) beträgt 5 und wird am Ende der Rotation gegen 0 "gesmoothed". (Code ungetestet, sollte aber grundsätzlich funktionieren)
Code:
VECTOR to_target_ang;
vec_to_angle(to_target_ang, vec_diff(NULL, target, my->x));
var angle_diff = ang(to_target_ang.pan - my->pan);

if (angle_diff > 0)
	my->pan += minv(angle_diff,  5) * time_step;
else
	my->pan += maxv(angle_diff, -5) * time_step;

© 2023 lite-C Forums