Como faço para calcular a rotação causada pelo atrito por ressalto?

15

Seguindo a minha pergunta anterior : Eu tenho a bola quicando de maneira bastante realista nas superfícies que bate. Agora eu gostaria de fazer girar a partir do atrito do golpe .

Mostrar isso é bastante simples: eu giro a bola pela sua velocidade angular a cada tick e aplico a mesma rotação quando é renderizada.

Quando uma bola bate em uma parede, eu sei que a velocidade de rotação é afetada por ...

  • velocidade inicial da bola ao atingir a superfície
  • os coeficientes de atrito da bola e da superfície (constantes físicas)
  • o ângulo de incidência (o ângulo entre o vetor de velocidade de entrada da bola e a superfície normal).

O ângulo de incidência é aproximado pelo produto escalar dos vetores de velocidade de impacto e velocidade de saída da bola. (1 significa giro alto, -1 significa que não giro e todo o resto relativamente)

Multiplicando todos os itens acima e certificando-se de que foram então transformados no intervalo de 0 a 1 e multiplicados pela velocidade máxima de rotação, a bola pareceu responder na velocidade de rotação conforme o esperado. Exceto por uma coisa: sempre rodava no sentido horário (devido a valores positivos).


Esse é um bom método? Você consegue pensar em uma maneira mais simples?

Se esse método parece bom, o que estou perdendo? Como sei quando a bola deve girar no sentido anti-horário?

codemonkey
fonte

Respostas:

2

Seu método é bom, porque é muito simples. Uma coisa que você pode precisar é depender da rotação anterior da bola, o que você não leva em consideração. A bola giratória representa energia rotacional; portanto, uma simulação realista provavelmente teria que conservá-la junto com as outras energias.

No entanto, se a bola não está girando com o impacto, não consigo imaginar uma situação em que ela comece a girar na direção do ângulo de incidência. Ou seja, "no sentido horário" ou "anti-horário" deve ser relativo ao lado do normal em que o ângulo de incidência é.

Eu acho que simplesmente multiplicar o resultado pelo vetor de direção x original (+1 se estiver viajando da esquerda para a direita, -1 se estiver viajando da direita para a esquerda) deve fazê-lo.

Editar: você pode usar o produto cruzado para isso. Incident cross normalfornece um vetor somente na direção Z (se estivermos no plano 2D xy). Observe o elemento z: se for positivo, a abordagem da bola deve fazer com que ela gire no sentido horário. Se for negativo, a bola deve girar no sentido anti-horário.

eli
fonte
Hey eli Em primeiro lugar, estou levando em consideração o giro original da bola, esqueci de mencioná-lo no meu post. Em segundo lugar, não acho que o sistema de direção x funcionaria. Eu tentei isso, mas se a bola bate na superfície de baixo em direção à esquerda, o vetor x seria -1, isso significaria a rotação anti-horário, quando na realidade ele deve ser girando no sentido horário
codemonkey
Como você leva em consideração o giro original da bola? Se estiver girando muito rápido, poderá se lançar em uma direção totalmente diferente. O problema com o produto escalar no seu caso é que ele usa o cosseno (uma função par). Você precisa de outra coisa para definir o sinal do relacionamento entre seus vetores (incidente e normal). Você pode usar um produto cruzado (produto vetorial) para essa finalidade. Editei minha resposta para incluir um método entre produtos.
eli
relendo a resposta após a edição eu gosto. Tentei e funcionou muito bem. Em relação à rotação original, eu só estava falando sobre fazer a mudança de rotação gradual ... como para girar originais afetando saída vetor, bem, isso é o meu próximo passo :)
codemonkey
Ai, a edição foi uma das três soluções diferentes que sugeri e expliquei por que você tinha que fazer isso (o ponto apenas dá magnitude, não a direção do ângulo). Infelizmente, deveria ser mais conciso, eu acho.
Kaj
desculpe por esse kaj, ele me escorregou ... sem ofensa pretendida :) #
687
3

Primeiro, obtenha a tangente da superfície da superfície normal: t = (ny, -nx)

Então você pode obter o componente de velocidade ao longo da superfície como vt = v ponto t .

Agora você pode calcular a rotação da bola: w = | ( normal * r) cruze vt |, onde r é o raio da bola.

Suponho que a bola não tenha inércia de rotação e comece a girar instantaneamente na velocidade que faria se rolasse pela superfície. Você pode usar um coeficiente de atrito para torná-lo mais realista e, se desejar, levar em consideração a inércia rotacional da bola.

Danik
fonte
Obrigado pela resposta Danik. Já estou levando em consideração a inércia rotacional da bola (adicionando-a à nova rotação) e também o atrito da superfície como um coeficiente a ser multiplicado pela velocidade total de rotação. Quanto mais o atrito, maior a velocidade de rotação, certo?
codemonkey
2

Ok, isso pode parecer estúpido, mas você não está usando o produto escalar do vetor de bola e a superfície normal e apenas fazendo um arco para calcular o ângulo, não é? Porque então o ângulo seria positivo, seja positivo (até 90 graus) ou negativo (idem), pois o cosseno é simétrico em torno de 0.
Se esse for o caso, em vez de usar o normal do plano, use a própria direção do plano e subtraia 90 graus do ângulo, de modo que 0 a 180 se tornará de -90 a +90 graus (ou -p PI a + meio PI se você estiver inclinado radialmente).

Kaj
fonte
Bem, considere este caso: x + ve está certo, y + ive está baixo; Vetor de superfície S = (1,0); temos dois vetores de velocidade de impacto V1 = (3,4) batendo de cima, deve girar a bola no sentido horário & V2 = (3, -4) batendo de baixo, deve girar a bola no sentido anti-horário. Agora, os normais para ambos os vetores seriam (3 / 5,4 / 5) e (3/5, -4 / 5), respectivamente. Agora, o produto escalar para ambos os vetores seria 3/5. O ângulo gerado seria arccos (3/5) = 53 graus para os dois vetores. O que é verdade, mas em lados opostos! por isso, se eu usar esse método, ainda terminarei causando a rotação no sentido horário. Está vendo meu dilema?
Codemonkey
3 soluções possíveis. 1) Não use o normal, mas a direção do lado e subtraia 90 graus como mencionado acima. 2) Simule o mesmo trocando xey do normal e invertendo (multiplique por -1). 3) Multiplique o ângulo com o sinal do produto cruzado dos dois vetores, pois o produto cruzado representa o pecado do ângulo que não é simétrico em torno de 0 graus.
Kaj
O produto escalar não fornece o ângulo, apenas a magnitude do ângulo, você também precisa da direção do ângulo. Todas as três maneiras acima simulam o uso do seno, dando a você o lado. Você também pode usar trigonometria básica para obter o ângulo. Sin (alfa) = lado oposto do comprimento / lado inclinado do comprimento (com base em um triângulo com um ângulo de 90 graus entre o lado oposto e o lado inclinado). Isso e Pitágoras para calcular os comprimentos dos lados servirão.
Kaj
A propósito, releia minha resposta original, pois resolve o dilema tomando o ângulo com o plano em vez dos normais e subtraindo 90 graus.
Kaj
0

A primeira coisa que você precisa abordar é se a velocidade de rotação ou rotação antes de bater na parede; digamos Si; é maior, igual ou menor que o valor necessário para manter o mesmo giro após atingir, digamos Ss. Com isso, você pode obter o valor real depois de girar, digamos Se, usando um valor de atrito entre a bola e a superfície

Obtenha o componente de velocidade através da superfície de salto Vxi = Vi ponto Vx, sendo Vx um vetor paralelo à superfície com magnitude 1.

O valor que você está procurando é Ss = Vxi / r, isto é, transformar Vxi em velocidade angular. Se Si for menor que Ss, a bola deve girar positivamente. Se Si for igual a Ss, a bola deve manter aproximadamente o mesmo giro, sobre isso mais tarde. Se Si for maior que Ss, a bola deve perder rotação

as perdas e ganhos de velocidade dependem do valor de atrito Pe. Na verdade, é um cruzamento entre o raio e a força de atrito, mas você pode definir esse valor como desejar.

Você também deve observar que, além do coeficiente de rebote, a bola perde energia devido a um atrito entre a bola e a superfície, portanto Vxi é afetado negativamente. Eu diria que o coeficiente de ressalto afeta Vy e o atrito afeta Vx.

Você deve levar em conta a deformação da bola. Isso afetará o tempo ou os quadros em que a bola ficará grudada na parede, assim a força de fricção exercerá por um tempo mais longo, afetando a velocidade de rotação e saída. Essa deformação depende de como você deseja que seu modelo seja.

Aprah
fonte