Calcular la fuerza de rotación de un sprite 2D


35

Me pregunto si alguien tiene una forma elegante de calcular el siguiente escenario.

Tengo un objeto de (n) número de cuadrados, formas aleatorias, pero fingiremos que son todos rectángulos.

No estamos tratando con la gravedad, así que considera el objeto en el espacio, desde una perspectiva de arriba hacia abajo. Estoy aplicando una fuerza al objeto en un cuadrado específico (como se ilustra a continuación).

Aplicando una fuerza

¿Cómo calculo el ángulo de rotación, en función de la fuerza que se aplica, en la ubicación que se aplica? Si se aplica en el cuadrado central, iría derecho. ¿Cómo debería comportarse cuanto más me muevo desde el centro? ¿Cómo calculo la velocidad de rotación?


¿Qué quieres que le suceda a la fuerza a través del tiempo a medida que el objeto gira? ¿Se aplica siempre al mismo cuadrado en la misma dirección? ¿Se "barre" a lo largo del borde del objeto? Con la información que está dando, solo puede obtener la fuerza de rotación correspondiente (también conocida como torque), pero si desea deducir una velocidad de rotación a partir de eso, deberá proporcionar un impulso (en lugar de una fuerza) o explicar cómo la fuerza debe aplicarse a medida que pasa el tiempo.
Sam Hocevar

Honestamente, esta probablemente sería una mejor pregunta para physics.stackexchange.com, ya que se trata completamente de una mecánica básica.
BlueRaja - Danny Pflughoeft

Respuestas:


44

Estás tratando de calcular el par. El par depende de la fuerza aplicada F, el punto de aplicación y el centro de masa del objeto.

1) Centro de misa . Definir el centro de masa del objeto.

2) Punto de aplicación : defina el punto en el que actúa la fuerza.

3) Brazo de momento : la distancia entre los dos puntos definidos anteriormente.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Fuerza angular : Divida su fuerza F en dos vectores ortogonales, uno Paralelo a la línea en 3) y uno Perpendicular. El componente paralelo no afecta el momento angular. El perpendicular lo hace. Puede calcular el componente paralelo por proyección vectorial. Puede restar eso del original para obtener el componente perpendicular. En pseudocódigo ( dotsignifica producto de punto)

Vector myForce
Vector momentArm

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

5) Par : El componente perpendicular de la fuerza multiplicado por la longitud del brazo del momento.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Para ir del par a la velocidad angular:

1) Momento de inercia : una definición de cuánta inercia rotacional tiene un objeto dado. Por ejemplo, se necesita más torque para rotar una barra larga que una esfera de la misma masa. Si no le preocupa el realismo, puede fingir que el momento de inercia es relativo a la masa, o puede ignorar por completo la forma y la masa del objeto.

2) aceleración angular :

Vector angularAcceleration = torque / momentOfInertia

3) Velocidad angular : la velocidad angular seguirá aumentando mientras se aplique el par. Entonces, una fórmula será aproximadamente "Velocidad angular en el momento T es la suma acumulativa de la aceleración angular hasta T ". Esto se expresa en pseudocódigo como

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

Gran información, sin embargo, la parte con la que no estoy más claro es cómo determinar cuál debería ser la fuerza de torque. Tengo todos los componentes en su lugar como usted ha descrito.
jgallant

@ Jon: tienes los componentes, lo que significa que tienes los pasos 1 a 3 y no sabes cómo calcular el paso 4. Ese es principalmente el paso complicado. Agregaré un poco más de detalle allí.
Jimmy

3
La orientación, que es la suma acumulativa de la velocidad angular, orientation += angularVelocity * elapsedSecondsestá mal porque sobreestima la velocidad a lo largo del paso del tiempo, lo que significa que diferentes velocidades de cuadro darán diferentes orientaciones. Una fórmula adecuada sería: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Además, como no hay gravedad, sugiero utilizar en su lugar "centro de masa". +1 por la muy buena explicación sin embargo.
sam hocevar

1
Parte de la fuerza perpendicular actuará para acelerar el centro de masa, y a medida que la fuerza se aplica más cerca del centro de masa, este factor aumenta. La respuesta es buena y muy clara, pero parece estar incompleta a este respecto.
Sam Watkins,

Para responder mi propio comentario, estoy leyendo los artículos de Chris Hecker sobre física: chrishecker.com/Rigid_body_dynamics . Resulta que una fuerza o impulso en cualquier punto tiene el efecto bien conocido en el centro de masa de acuerdo con F = ma o a2 = a1 + p, como si el cuerpo no pudiera girar. Esto se desprende de la ley de conservación del momento lineal. El componente de la fuerza perpendicular al radio también causa un par y un cambio en el momento angular, como se describe en la respuesta de Jimmy.
Sam Watkins

7

Si las fuerzas no son demasiado fuertes, es mucho más fácil simular la rotación utilizando múltiples puntos y resortes que los conectan. en ese caso, simplemente asume que su forma consiste en múltiples puntos conectados por resortes. cada punto representa la masa y todo lo demás en forma tiene una masa igual a cero.

primavera y puntos

en la imagen de arriba el punto negro representa masas y la línea roja representa resortes. luego, para aplicar la fuerza, solo tienes que aplicarla al punto más cercano y verás que tu objeto rotará como quieras. Para que su forma se vea como una estructura sólida, es mejor definir resortes con un alto valor de amortiguación y un alto valor k.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.