Obliczanie siły obrotowej duszka 2D

35

Zastanawiam się, czy ktoś ma elegancki sposób obliczenia następującego scenariusza.

Mam obiekt o (n) liczbie kwadratów, losowych kształtów, ale będziemy udawać, że wszystkie są prostokątami.

Nie mamy do czynienia z grawitacją, więc rozważ obiekt w przestrzeni z góry na dół. Przykładam siłę do obiektu w określonym kwadracie (jak pokazano poniżej).

Przyłożenie siły

Jak obliczyć kąt obrotu w oparciu o przyłożoną siłę w przyłożonym miejscu. Jeśli zostanie zastosowany w środkowym kwadracie, poszedłby prosto. Jak powinien się zachowywać, gdy będę się przesuwać od środka? Jak obliczyć prędkość obrotową?

jgallant
źródło
Co chcesz zrobić z siłą w czasie, gdy obiekt się obraca? Czy zawsze odnosi się do tego samego kwadratu w tym samym kierunku? Czy „zamiata” wzdłuż krawędzi obiektu? Dzięki podanym informacjom możesz uzyskać tylko odpowiednią siłę obrotową (czyli moment obrotowy), ale jeśli chcesz z tego wywnioskować prędkość obrotową, musisz podać impuls (a nie siłę) lub wyjaśnić, w jaki sposób z czasem siłę należy przyłożyć.
sam hocevar,
Szczerze mówiąc, byłoby to prawdopodobnie lepsze pytanie dla physics.stackexchange.com, ponieważ jest to całkowicie kwestia podstawowej mechaniki.
BlueRaja - Danny Pflughoeft 10.11.11

Odpowiedzi:

44

Próbujesz obliczyć moment obrotowy. Moment obrotowy zależy od przyłożonej siły F, punktu przyłożenia i środka masy obiektu.

1) Centrum Mszy . Zdefiniuj środek masy obiektu.

2) Punkt zastosowania : Określ punkt, w którym działa siła.

3) Moment Arm : Odległość między dwoma punktami zdefiniowanymi powyżej.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Siła kątowa : Podziel swoją siłę F na dwa wektory ortogonalne, jeden równoległy do ​​linii w punkcie 3) i jeden prostopadły. Składnik równoległy nie wpływa na pęd kątowy. Prostopadły robi. Możesz obliczyć komponent równoległy przez rzutowanie wektorowe. Możesz odjąć to od oryginału, aby uzyskać komponent prostopadły. W pseudokodzie ( dotoznacza iloczyn iloczynu)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) Moment obrotowy : Prostopadły składnik siły pomnożony przez długość ramienia momentu.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Aby przejść od momentu obrotowego do prędkości kątowej:

1) Moment bezwładności : Definicja wielkości bezwładności obrotowej danego obiektu. Na przykład potrzeba więcej momentu obrotowego, aby obrócić długi pręt niż kula o tej samej masie. Jeśli nie przejmujesz się realizmem, możesz udawać, że moment bezwładności jest związany z masą, lub możesz całkowicie zignorować kształt i masę obiektu.

2) Przyspieszenie kątowe :

Vector angularAcceleration = torque / momentOfInertia

3) Prędkość kątowa : Prędkość kątowa będzie rosła tak długo, jak przyłożony zostanie moment obrotowy. Tak więc formuła będzie w przybliżeniu „Prędkość kątowa w czasie T jest skumulowaną sumą przyspieszenia kątowego aż do T ”. Jest to wyrażone w pseudokodzie jako

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;
Jimmy
źródło
Świetna informacja, jednak najbardziej niejasna jest kwestia tego, jak określić, jaka powinna być siła momentu obrotowego. Mam wszystkie elementy zgodnie z opisem.
jgallant
@Jon: masz składniki, co oznacza, że ​​masz kroki 1–3 i nie wiesz, jak obliczyć krok 4? To przede wszystkim trudny krok. Dodam tam trochę więcej szczegółów.
Jimmy,
3
Orientacja, będąca skumulowaną sumą prędkości kątowej, orientation += angularVelocity * elapsedSecondsjest błędna, ponieważ przecenia prędkość z upływem czasu, co oznacza, że ​​różne prędkości klatek dają różne orientacje. Odpowiedni wzór będzie: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Ponieważ nie ma grawitacji, sugeruję użycie zamiast tego „środka masy”. +1 za bardzo dobre wyjaśnienie.
sam hocevar,
1
Część siły prostopadłej będzie działać w celu przyspieszenia środka masy, a gdy siła zostanie przyłożona bliżej środka masy, czynnik ten wzrasta. Odpowiedź jest dobra i bardzo jasna, ale wydaje się niepełna w tym względzie.
Sam Watkins
Aby odpowiedzieć na mój komentarz, czytam artykuły Chrisa Heckera na temat fizyki: chrishecker.com/Rigid_body_dynamics . Okazuje się, że siła lub impuls w dowolnym punkcie ma dobrze znany wpływ na środek masy według F = ma lub a2 = a1 + p, tak jakby ciało nie mogło się obracać. Wynika to z prawa zachowania pędu liniowego. Składnik siły prostopadłej do promienia powoduje również moment obrotowy i zmianę momentu pędu, jak opisano w odpowiedzi Jimmy'ego.
Sam Watkins
7

jeśli siły nie są zbyt duże, znacznie łatwiej jest symulować obrót za pomocą wielu kropek i łączących je sprężyn . w takim przypadku zakładasz, że twój kształt składa się z wielu kropek połączonych sprężynami. każda kropka reprezentuje masę, a każda inna kształt ma masę równą zero.

wiosna i kropki

na powyższym obrazku czarny punkt reprezentuje masy, a czerwona linia reprezentuje sprężyny. następnie, aby zastosować siłę, wystarczy przyłożyć ją do najbliższej kropki, a zobaczysz, że Twój obiekt będzie się obracał tak, jak chcesz. aby twój kształt wyglądał jak solidna struktura, lepiej zdefiniować sprężyny o wysokiej wartości tłumienia i wysokiej wartości k.

Ali1S232
źródło