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ń:
Do tej pory próbowałem zwizualizować wektor strzelający i wektor kierunkowy do środka masy statku:
Niestety nie zaszedłem z tym daleko.
mathematics
physics
migimunz
źródło
źródło
Odpowiedzi:
Powodzenie! Oto jest i obraca się tak, jak powinien:
To, co zrobiłem, jest następujące: dla każdego steru strumieniowego obliczam wielkość momentu obrotowego w stosunku do środka masy.
Według wikipedii równanie dla wartości momentu obrotowego jest następujące
T = rF sin(theta)
: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 .
źródło
Ogólnym wyrażeniem 3D moment obrotowy jest iloczynem siły i przemieszczenia: T = R ⨯ C . 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:
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.
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.
źródło
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
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).
źródło