Aby zakończyć ten rozdział, spróbujmy czegoś odrobinę bardziej skomplikowanego i zdecydowanie przydatniejszego. Będziemy dynamicznie obliczać przyspieszenie obiektu zgodnie z regułą opisaną w Algorytmie 3 — obiekt przyspiesza w kierunku kursora.
Za każdym razem, gdy chcemy obliczyć wektor w oparciu o regułę lub wzór, musimy obliczyć dwie rzeczy: moduł i kierunek. Zacznijmy od kierunku. Wiemy, że wektor przyspieszenia powinien wskazywać od położenia obiektu na położenie kursora. Powiedzmy, że obiekt znajduje się w punkcie (x,y), a kursor w (mouseX,mouseY).
Z rysunku wynika, że możemy uzyskać wektor (dx,dy) poprzez odjęcie położenia obiektu od położenia kursora:
  • dx = mouseX - x
  • dy = mouseY - y
Przepiszmy powyższe używając składni PVector. Zakładając, że jesteśmy w definicji obiektu Mover i dzięki temu mamy dostęp do położenia obiektu PVector, otrzymujemy:
var mouse = new PVector(mouseX, mouseY);
// Look! We’re using the static sub() because we want a completely new PVector
var dir = PVector.sub(mouse, position);
Teraz mamy obiekt PVector, który wskazuje od położenia movera aż do kursora. Jeśli obiekt miałby przyspieszać zgodnie z tym wektorem, natychmiast pojawiłby się w położeniu kursora. Oczywiście nie czyni to dobrej animacji i to, co chcemy teraz zrobić, to zdecydować jak szybko ten obiekt powinien przyspieszać w stronę kursora.
Aby ustawić moduł (jakikolwiek by był) naszego PVectora przyspieszenia, musimy najpierw ___ ten wektor kierunkowy. Właśnie tak, powiedziałeś to. Znormalizować. Jeśli możemy zmniejszyć wektor do jego wektora jednostkowego (o długości równej jeden), to mamy wektor, który mówi nam o kierunku i może być łatwo przeskalowany do każdej wartości. Jeden pomnożone przez cokolwiek daje cokolwiek.
var anything = ??;
dir.normalize();
dir.mult(anything);
Podsumowując, wykonujemy następujące kroki:
  1. Oblicz wektor, który wskazuje z obiektu na docelowe położenie (kursor)
  2. Znormalizuj ten wektor (zmniejszając jego długość do 1)
  3. Przeskaluj ten wektor do odpowiedniej wartości (mnożąc go przez pewną wartość)
  4. Przypisz ten wektor do przyspieszenia
Oto jak wygląda ten program ze wszystkimi, w pełni zaimplementowanymi krokami:
Być może zastanawiasz się, dlaczego koło nie zatrzymuje się, gdy dotrze do celu. Ważne jest, aby zauważyć, że poruszający się obiekt nie wie o tym, że ma zatrzymać się w punkcie docelowym; wie tylko gdzie jest cel i stara się dotrzeć tam tak szybko jak to możliwe. Poruszanie się tak szybko jak to możliwe oznacza, że niechybnie minie punkt docelowy i musi zawrócić, znowu przemieszczając się tak szybko jak to możliwe w kierunku celu, przekraczając go ponownie, i tak dalej. Zostań z nami; w kolejnych rozdziałach nauczymy się jak zaprogramować obiekt, aby osiągał dane położenie (zwalniał w miarę zbliżania się).
Ten przykład jest niezwykle bliski pojęciu przyciągania grawitacyjnego (gdy obiekt przyciągany jest do położenia kursora). Przyciąganie grawitacyjne będzie opisane bardziej szczegółowo w następnym rozdziale. Jednakże, brakuje tu jednej rzeczy: siła grawitacji (moduł przyspieszenia) jest odwrotnie proporcjonalna do odległości. To oznacza, że im bliżej kursora jest obiekt, tym bardziej przyspiesza.
Zobaczmy jak ten przykład będzie wyglądać z tablicą moverów (więcej niż jednym).

Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.
Ładowanie