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 ( dot
oznacza 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;