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).
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ą?
Odpowiedzi:
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.
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 (
dot
oznacza iloczyn iloczynu)5) Moment obrotowy : Prostopadły składnik siły pomnożony przez długość ramienia momentu.
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 :
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
źródło
orientation += angularVelocity * elapsedSeconds
jest 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.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.
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.
źródło