Cálculo da força rotacional de um sprite 2D

35

Gostaria de saber se alguém tem uma maneira elegante de calcular o cenário a seguir.

Eu tenho um objeto de (n) número de quadrados, formas aleatórias, mas vamos fingir que são todos retângulos.

Como estamos lidando sem gravidade, considere o objeto no espaço, de uma perspectiva de cima para baixo. Estou aplicando uma força ao objeto em um quadrado específico (como ilustrado abaixo).

Aplicando uma força

Como faço para calcular o ângulo de rotação, com base na força a ser aplicada, no local a ser aplicado. Se aplicado no quadrado central, seguiria em frente. Como deve se comportar quanto mais me afastar do centro? Como calculo a velocidade rotacional?

jgallant
fonte
O que você quer que aconteça com a força ao longo do tempo enquanto o objeto gira? Isso sempre se aplica ao mesmo quadrado na mesma direção? Ele "varre" ao longo da borda do objeto? Com as informações que você está fornecendo, você só pode obter a força de rotação correspondente (também conhecida como torque), mas se quiser deduzir uma velocidade de rotação, precisará fornecer um impulso (em vez de uma força) ou explicar como a força deve ser aplicada com o passar do tempo.
10135 Samu Hocevar
Honestamente, essa provavelmente seria uma pergunta melhor para physics.stackexchange.com, pois é inteiramente uma questão de mecânica básica.
BlueRaja - Danny Pflughoeft 10/11/11

Respostas:

44

Você está tentando calcular o torque. O torque depende da força aplicada F, do ponto de aplicação e do centro de massa do objeto.

1) Centro de massa . Defina o centro de massa do objeto.

2) Ponto de Aplicação : Defina o ponto em que a força atua.

3) Braço do momento : a distância entre os dois pontos definidos acima.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Força angular : divida sua força F em dois vetores ortogonais, um paralelo à linha em 3) e um perpendicular. O componente paralelo não afeta o momento angular. O perpendicular faz. Você pode calcular o componente paralelo por projeção vetorial. Você pode subtrair isso do original para obter o componente perpendicular. No pseudocódigo ( dotsignifica produto escalar)

Vector myForce
Vector momentArm

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

5) Torque : O componente perpendicular da força multiplicado pelo comprimento do braço do momento.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Para passar do torque para a velocidade angular:

1) Momento de inércia : Uma definição de quanta inércia rotacional um determinado objeto possui. Por exemplo, é preciso mais torque para girar uma barra longa do que uma esfera da mesma massa. Se você não está preocupado com o realismo, pode fingir que o momento de inércia é relativo à massa ou pode ignorar completamente a forma e a massa do objeto.

2) Aceleração angular :

Vector angularAcceleration = torque / momentOfInertia

3) Velocidade angular : a velocidade angular continuará aumentando enquanto o torque estiver sendo aplicado. Portanto, uma fórmula será aproximadamente "Velocidade angular no momento T é a soma cumulativa da aceleração angular até T. " Isso é expresso em pseudocódigo como

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;
Jimmy
fonte
Ótimas informações, no entanto, a parte com a qual eu não sou mais clara é como determinar qual deve ser a força de torque. Eu tenho todos os componentes no lugar, como você descreveu.
jgallant
@ Jon: você tem os componentes, o que significa que você tem as etapas 1 a 3 e não consegue descobrir como calcular a etapa 4? Esse é basicamente o passo complicado. Vou adicionar um pouco mais de detalhes lá.
Jimmy
3
A orientação, sendo a soma cumulativa da velocidade angular, orientation += angularVelocity * elapsedSecondsestá errada porque superestima a velocidade ao longo do tempo, o que significa que diferentes taxas de quadros fornecerão orientações diferentes. A fórmula adequada seria: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Além disso, como não há gravidade, sugiro usar o "centro de massa". +1 para a explicação muito boa.
Sam Hocevar
11
Parte da força perpendicular atuará para acelerar o centro de massa e, à medida que a força é aplicada mais próxima ao centro de massa, esse fator aumenta. A resposta é boa e muito clara, mas parece incompleta a esse respeito.
Sam Watkins
Para responder meu próprio comentário, estou lendo os artigos de Chris Hecker sobre física: chrishecker.com/Rigid_body_dynamics . Acontece que uma força ou impulso em qualquer ponto tem o efeito bem conhecido no centro de massa de acordo com F = ma ou a2 = a1 + p, como se o corpo não pudesse girar. Isso decorre da lei de conservação do momento linear. O componente da força perpendicular ao raio também causa um torque e uma mudança no momento angular, conforme descrito na resposta de Jimmy.
Sam Watkins
7

se as forças não são muito fortes, é muito mais fácil simular a rotação usando vários pontos e molas conectando-os. nesse caso, você apenas assume sua forma consiste em vários pontos conectados por molas. cada ponto representa massa e qualquer outra coisa em forma tem massa igual a zero.

primavera e pontos

na figura acima, o ponto preto representa massas e a linha vermelha representa as molas. então, para aplicar a força, basta aplicá-la ao ponto mais próximo e você verá que seu objeto girará da maneira que desejar. Para fazer com que sua forma pareça uma estrutura sólida, é melhor definir molas com alto valor de amortecimento e alto valor de k.

Ali1S232
fonte