Skocz do zawartości

W którą stronę obraca się najoptymalniej


 Udostępnij

Rekomendowane odpowiedzi

Potrzebuję napisać wydawało by się prostą funkcję, ale nie mogę z jakiegoś powodu napisać jej dobrze. W dodatku nie mam pojęcia pod jakim hasłem to Google'ować.

Potrzebuję wykonać funkcję która na podstawie danych:

a) obrót aktualny w stopniach

b) obrót docelowy w stopniach

c) siła obrotu w stopniach

Obliczy jak obrócić się w stronę danego obiektu o daną ilość stopni.

 

Ma to spowodować efekt nienadążania za szybko ruszającymi się celami. Taką funkcję myślę, że stosuję się też np przy pisaniu obrotu "ociężałej" lufy czołgu.

Ja chcę go użyć do czego innego, ale funkcja będzie ta sama(tak mi się przynajmniej wydaję.

 

Chodzi o to, że jeśli siła obrotu wynosi 5, to skrypt ma właściwie obliczyć kąt docelowy. Czyli kąt A(kąt aktualny) dodać siłę np. 5 stopni(niebieski kolor strzałka i napis) daje kąt b(obrót docelowy). Czyli jakby obrócił o 5 stopni, ale czy w stronę wskazówek zegara, czy w przeciwną to właściwe to co ma obliczyć mi ten skrypt.

 

Będę mega wdzięczny za pomoc.

 

PS.: wiem, że rysunki są przecudne ❤️ 

 

 

image.png.b4f100ea6e00917406de05ecc0fd0b08.png

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jestem pewien, czy dobrze rozumiem... Zakładam, że chodzi o coś takiego: sprawdź, jaki obrót (w lewo czy w prawo) najszybciej dotrze do kąta docelowego, i obróć się w tym kierunku?

 

Odpowiedni kod wyglądałaby mniej więcej następująco (w GML'u nic nie robiłem od dawna, więc nie gwarantuję, że zadziała:)

current_angle = kąt obecny

target_angle = kąt docelowy

turn_speed = siła obrotu

if (current_angle != target_angle)
{
	turn_dir = sign(sin(pi*(target_angle-current_angle)/180));
	if (turn_dir == 0) turn_dir == 1; // Avoid the rotation stopping if current and target angle are at exactly opposite sides
	current_angle += turn_dir * turn_speed;
}

Aha, kąty na twoim obrazku są chyba niepoprawne (w GM:S 0 stopni = prawo, 90 stopni = góra) - taki szczegół.

 

EDIT: Kod nieco dłuższy, ale pewnie bardziej wydajny (bo unikamy obliczania sin):

if (current_angle != target_angle)
{
	angle_diff = target_angle - current_angle;
    if (angle_diff > 180) angle_diff = angle_diff - 360;  
    if (angle_diff < -180) angle_diff = angle_diff + 360;
    turn_dir = sign(angle_diff);
	if (turn_dir == 0) turn_dir == 1; // Avoid the rotation stopping if current and target angle are at exactly opposite sides
	current_angle += turn_dir * turn_speed;
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...