Jak ustalić, które pędniki włączyć, aby obrócić statek?

47

Konfiguracja statku zmienia się dynamicznie, więc muszę określić, który pędnik ma się włączyć, gdy chcę obrócić statek w prawo lub w lewo. Pędniki są zawsze ustawione osiowo względem statku (nigdy pod kątem) i są włączone lub wyłączone. Oto jeden z możliwych ustawień:

http://i.stack.imgur.com/GSBSH.png

Do tej pory próbowałem zwizualizować wektor strzelający i wektor kierunkowy do środka masy statku:

http://i.stack.imgur.com/ZzNzi.png

Niestety nie zaszedłem z tym daleko.

migimunz
źródło
7
Kierujesz się we właściwym kierunku za pomocą wektorów siły. Spróbuj wyszukać wzory na KĄTOWĄ prędkość, ponieważ próbujesz obrócić statek wokół środka masy.
Amplify91,
Zapominam, jak dokładnie to zrobić, ale w zasadzie jego siły wymuszają na każdym punkcie en.wikipedia.org/wiki/Center_of_mass, a zwłaszcza en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex
1
Miałem dokładnie ten sam pomysł! Jedna wskazówka, która może ci to ułatwić, polega na tym, że musisz obliczyć przyspieszenie kątowe i liniowe tylko raz dla każdego steru strumieniowego, więc obliczenia mogą być tak złożone, jak chcesz.
Markus von Broady,
@ Amplify91, Twój komentarz pomógł mi to rozgryźć, dzięki!
migimunz
1
@migimunz Myślałem raczej o obliczeniu przyspieszeń na pędnik, a nie za naciśnięty klawisz (grupa pędników). Danie graczowi wyboru, które pędniki powinny zostać aktywowane, na który naciśnięty klawisz może być interesujące (niektórzy wymieniają się szybszymi obrotami za obracanie w miejscu)
Markus von Broady,

Odpowiedzi:

22

Powodzenie! Oto jest i obraca się tak, jak powinien: wprowadź opis zdjęcia tutaj

To, co zrobiłem, jest następujące: dla każdego steru strumieniowego obliczam wielkość momentu obrotowego w stosunku do środka masy.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Według wikipedii równanie dla wartości momentu obrotowego jest następujące T = rF sin(theta):

  • r to odległość między sterem strumieniowym a COM
  • F jest wielkością przyłożonej siły (pomijam to, udając, że jest tylko jedna, ponieważ zależy mi tylko na znaku).
  • theta to kąt między dwoma wektorami

Kiedy gracz naciska w lewo, sprawdzam znak momentu obrotowego dla tego pędnika - jeśli jest mniejszy niż zero, odpalam pędnik. Przeciwnie do skrętu w prawo.

Prawdopodobnie można to poprawić za pomocą iloczynu kropkowego do obliczenia cosinusa kąta między wektorami, ale to będzie musiało poczekać do jutra.

Wreszcie, oto demo na żywo .

migimunz
źródło
Myślę, że prawie tam. Wydaje się, że nie jest dokładnie w środku masy. Używając tylko strzałek w lewo / w prawo statek może łatwo wyjść z ekranu. Ale bardzo blisko. Być może punkt, z którego mierzysz, jest nieco wyłączony. Lub może to być problem z synchronizacją, ponieważ po pewnym czasie wydaje się stabilizować. Dobra robota.
MichaelHouse
Nie sądzę, żeby miało to coś wspólnego z tą logiką. Nie ma tu nic, co zapewniłoby, że pojazd nie otrzyma siły translacyjnej netto po wystrzeleniu zestawu thursterów wybranych przez ten mechanizm. Jeśli utrzymanie siły napędowej netto nie jest wymagane, będzie wymagać modulacji siły poszczególnych silników odrzutowych (i prawdopodobnie stanie się znacznie trudniejszym problemem do rozwiązania)
Trevor Powell,
@TrevorPowell, dokładnie. Ze względu na prostotę (i zabawę, ponieważ wydajność twojego statku będzie zależeć od tego, jak dobrze go zaprojektujesz), zdecydowałem, że pędniki są włączone lub wyłączone. Prawdopodobnie uwzględnię próg, aby te, które powodują zbyt mały moment obrotowy (a zatem zbyt duży ruch boczny) nie były włączone, ale dokładnie to, ile wynosi „zbyt dużo / mało”, zostanie prawdopodobnie ustalone metodą prób i błędów.
migimunz
3
Aby uniknąć obliczeń kąta, należy użyć iloczynu prostopadłego (wyprowadzonego z definicji iloczynu momentu T = r przecięcia F, jeśli używasz wektorów 3D o z = 0). Bierzesz wektor (-ry, rx), który jest prostopadły do ​​r o tej samej wielkości, i obliczasz iloczyn punktowy tego wektora za pomocą F. Wynikiem jest T = rx * Fy - ry * Fx. Wtedy abs (T) jest wielkością momentu obrotowego, a jego znak wskazuje kierunek: T> 0 jest przeciwny do ruchu wskazówek zegara, T <0 jest zgodny z ruchem wskazówek zegara.
Joren
1
Powód, dla którego działa, jest intuicyjny: r kropka F = r F cos θ. Jeśli obrócisz r o 90 stopni w lewo i weźmiesz iloczyn iloczynu, otrzymasz r F sin,, ponieważ cos (θ - 90˚) = sin (θ).
Joren
14

Ogólnym wyrażeniem 3D moment obrotowy jest iloczynem siły i przemieszczenia: T = RC . W dwóch wymiarach wystarczy wartość skalarna momentu obrotowego, a biorąc pod uwagę tylko cztery orientacje ortogonalne dla pędników, możemy napisać w formie częściowej:

  • Siła w kierunku + x: T = F * (-ry)
  • Siła w kierunku -x: T = F * (ry)
  • Siła w kierunku + y: T = F * (rx)
  • Siła w kierunku -y: T = F * (-rx)

W tym przypadku F jest wielkością siły generowanej przez pędniki, rx i ry są składowymi x i y wektora od punktu obrotu do pędnika. Pozytywne momenty obrotowe mają tendencję do obracania statku przeciwnie do ruchu wskazówek zegara. Korzystając z czterech powyższych wzorów, nie jest łatwo wydedukować znak momentu obrotowego wytwarzanego przez każdy ster strumieniowy.

Aby skromnie dokładne odwzorowanie fizyki wymagało nie tylko znaku ciągu, ale także jego całkowitej wielkości i bezwładności obrotowej. Co więcej, możesz nie chcieć po prostu aktywować wszystkie odpowiednio ustawione pędniki, aby wykonać obrót.

Statek kosmiczny

Zgodnie z rysunkiem, pełna moc na pędnikach B, D i E zmaksymalizuje obrót, ale także przyspieszy statek w prawo. Wyłączenie D zapobiegnie temu. Jeśli zamiast tego planowane jest przyspieszenie w prawo, ale nie jest obrót w prawo, najskuteczniejszym sposobem jest włączenie C i F przy dwóch trzecich pełnej mocy wraz z D.

Jeśli nie wykracza to poza to, co próbujesz zrobić, musisz napisać jakiś solver dla równań ruchu, co oczywiście nie jest prostym zadaniem.

Marcks Thomas
źródło
7

Kilka różnych rzeczy. Po pierwsze, musimy uznać, że jest to problem o ograniczonym ograniczeniu. Oznacza to, że istnieje wiele różnych kombinacji silników odrzutowych, które mogą strzelać, powodując obrót w tym samym kierunku. Zakładam, że w twojej sytuacji istnieją tylko dwa stany dla pędników, „włączony” i „wyłączony”, i wszystkie pędniki wytwarzają równą siłę.

Po drugie, patrząc na model, wygląda na to, że „środek masy” nie jest tak naprawdę środkiem masy. Na szczęście nie wpłynie to na twoje obliczenia momentu obrotowego. Wpłynie to jednak na twoje obliczenia dla środka przemieszczenia masy. Nie jestem jednak pewien, czy zależy ci na dokładności na tym poziomie, ponieważ „środek masy” jest co najmniej najbliższy kwadratowi do prawdziwego środka masy.

Po trzecie, jeśli chcesz obliczyć, w jaki sposób określony pędnik wpłynie na obrót, masz rację, chociaż używasz nieefektywnej formuły. Moment obrotowy można obliczyć jako r x F, który ma wielkość r*F*sin(theta). Jednak obliczanie kątów w tym przypadku jest nieefektywną metodą. Zamiast tego należy bezpośrednio zastosować definicję momentu obrotowego dla różnych produktów, ponieważ będzie to o wiele prostsze przy użyciu posiadanych reprezentacji. Ponieważ wszystkie wektory nie mają składnika Z, formuła dla iloczynu krzyżowego znacznie się upraszcza.

Bez zmiany wyników obliczeń, możemy po prostu zaktualizować kod

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

To o wiele ładniejsze (i szybsze).

Sugerujesz we własnej odpowiedzi, że Twoim rozwiązaniem jest odpalenie wszystkich silników odrzutowych momentem obrotowym we właściwym kierunku. To właściwie rozwiązuje pytanie, które zadałeś. Spodziewam się jednak, że w pewnym momencie na linii okaże się, że twoja strategia nie jest tak zadowalająca, jeśli użytkownik przytrzyma przycisk „obróć”, a wszystkie pędniki z dodatnim momentem obrotowym obrócą się, potencjalnie przenosząc je na górę obracania ich (nie jestem pewien poziomu szczegółowości twojej symulacji, jeśli faktycznie obliczasz siły z silników odrzutowych, lub jeśli tylko wizualnie pokazujesz, jak odpalają, a następnie obracasz model ze stałym przyspieszeniem lub coś w tym rodzaju. sposób, chcesz, aby pędniki strzelały co najmniej w przybliżeniu dokładnie).

Nie bierze się pod uwagę siły netto na statku. Jeśli masz dowolną liczbę sterów, może to zmienić się w dość skomplikowany problem. Ponieważ jednak nasze silniki odrzutowe mają tylko dwa stany, analizowanie jest dość proste. Nie jestem do końca pewien, jaki jest nasz cel, więc mogłem sobie wyobrazić dwa różne: po pierwsze, chcemy zminimalizować całkowitą siłę, jednocześnie utrzymując moment obrotowy we właściwym kierunku. Po drugie, chcemy zmaksymalizować stosunek momentu obrotowego do siły całkowitej.

Nawiasem mówiąc, jeśli można sobie wyobrazić dodatkową kontrolę „głośności steru strumieniowego”, która wpływa na moc wszystkich silników strumieniowych jednocześnie, można ustawić tę kontrolę, aby oba rozwiązania miały równy moment obrotowy, i widać, że drugie rozwiązanie może mieć tylko mniejsze przesunięcie niż pierwsze. Musimy jednak pamiętać, że jeśli możliwe jest odpalenie silników odrzutowych, abyś tylko obracał się i nie poruszał się wcale, oba rozwiązania będą takie same.

Przejdźmy zatem do drugiego rozwiązania opartego na argumentach z poprzedniego akapitu. Teraz, analizując całkowitą siłę, możemy po prostu zauważyć, że tylko cztery kierunki mogą wskazywać silniki. Zatem całkowita siła w kierunku x to tylko liczba silników odrzutowych skierowanych w lewo minus liczba skierowana w prawo, i podobnie dla kierunku y.

Po napisaniu do tej pory muszę jeszcze trochę przemyśleć algorytm, aby go zoptymalizować. Myślę, że reszta mojego posta jest pomocna w obecnej formie, więc publikuję ją, ale zaktualizuję ją, gdy wymyślę najlepszy sposób optymalizacji tej konfiguracji (zastanawiałem się nad kilkoma sposobami uzyskania przybliżonych odpowiedzi, ale żaden z nich nie jest dokładny).

Jeremy Salwen
źródło
Dziękujemy za odpowiedź (i szybsze i czystsze rozwiązanie do obliczania momentu obrotowego). Czerwone koło nie jest jednak COM statku, lecz rdzeniem mocy. Używam silnika fizyki i po prostu przykładam lokalny impuls do statku. Nie mam nic przeciwko temu rozwiązaniu, które nie jest idealne, ponieważ sprawia, że ​​zabawa z różnymi konfiguracjami sprawia przyjemność, ale chciałbym wiedzieć, co wymyślisz.
migimunz
1
Możesz obliczyć moment obrotowy z dowolnego punktu odniesienia. Wynikowa liczba zmieni się, ale dopóki obrócisz statek wokół tego punktu, który nie musi być środkiem masy, fizyczne zachowanie się nie zmieni. W rzeczywistości bez informacji o rozkładzie masy środek masy jest sam w sobie arbitralny i nie może być obliczony jako taki.
Marcks Thomas