Como implementar o atrito em um mecanismo de física baseado em "Física Avançada de Caracteres"

8

Eu implementei um mecanismo de física baseado nos conceitos do texto clássico Advanced Character Physics, de Thomas Jakobsen. A fricção é discutida apenas muito brevemente no artigo e o próprio Jakobsen observa como "outros e melhores modelos de fricção que isso podem e devem ser implementados".

Geralmente, como se poderia implementar um modelo de atrito crível sobre os conceitos do artigo mencionado? E como o atrito encontrado pode ser traduzido em rotação em um círculo?


Não quero que essa pergunta seja sobre minha implementação específica, mas sobre como combinar as idéias de Jakobsens com um ótimo sistema de atrito em geral. Mas aqui está uma demonstração ao vivo mostrando o estado atual do meu mecanismo que não lida com atrito de forma alguma: http://jsfiddle.net/Z7ECB/embedded/result/


Abaixo está uma figura mostrando e um exemplo de como a detecção de colisão poderia funcionar em um mecanismo baseado no artigo. Na integração Verlet, a posição atual e a anterior são sempre armazenadas. Com base nisso, uma nova posição é calculada. Em cada quadro, calculo a distância entre os círculos e as linhas. Se essa distância for menor que o raio de um círculo, ocorreu uma colisão e o círculo é projetado perpendicularmente à linha ofensiva, de acordo com o tamanho da sobreposição (deslocamento na imagem).

A velocidade está implícita devido à integração do Verlet, portanto, mudar de posição também altera a velocidade. O que eu preciso saber é determinar de alguma forma a quantidade de atrito no círculo e movê-lo para trás paralelamente à linha, a fim de reduzir sua velocidade. foto mostrando como ocorre a colisão

paldepind
fonte
Artigo muito bom! Como é o seu atrito agora?
Mikael Högström
Sim. É um ótimo artigo. É muito simples, mas ainda tenho um mecanismo inteiro adequado para o meu propósito de trabalhar com base nele. Excepto atrito;)
paldepind
E bom vídeo também. Parece promissor!
Mikael Högström

Respostas:

4

Você deve dar uma olhada no artigo de "dinâmica baseada em posição" de Mathias Mueller et all. É basicamente o mesmo que o artigo de Jacobsons e ele pode fornecer mais informações sobre atrito.

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

Eles afirmam que o atrito está basicamente amortecendo a velocidade da partícula no plano da colisão por algum valor escalar.

Observe que isso não fornece efeitos de atrito de coulomb (a quantidade de momento na colisão não afeta a magnitude da força de atrito), mas você pode conseguir isso considerando a velocidade da partícula no plano de colisão.

Cholesky
fonte
11
E se, ao aplicar um impulso a um corpo parado, você verifique um determinado limite. Se o componente do impulso na superfície de contato for inferior a esse limite, você poderá defini-lo como zero para imitar os efeitos do atrito estático . A partir de então, o atrito dinâmico é exatamente como você o descreveu. +1
teodron
0

Em um motor de corpo rígido "normal", você modelaria o atrito como impulsos perpendiculares ao normal. Eu diria que, nesse contexto, isso significaria, em vez de impulsos, definir adequadamente a posição da partícula afetada. Com as restrições em vigor, se eu entender o artigo corretamente, deve atingir iterativamente um estado em que o atrito também afetou a rotação. Estou supondo que, por "modelo melhor", o autor significa melhor maneira de determinar a quantidade de atrito do que uma projeção linear de interpenetração. No entanto, isso é um palpite do meu lado, pois eu nunca implementei a física por essa abordagem.

EDITAR:

Para calcular o tamanho das forças de atrito, você tem o valor de deslocamento na sua imagem. Como você está usando verlet com timestap fixo, sabemos que esse deslocamento é na verdade a velocidade que o contato teve na direção do contato normal (bem, não exatamente, e acho que é isso que o autor quer dizer com uma melhor aproximação do atrito) ) Conhecer a velocidade ao longo do contato normal é essencial, pois podemos usá-la para determinar o impulso. A melhor maneira é aplicar o atrito na forma de impulsos em cada quadro em que houver um contato. O tamanho da fricção nos eixos paralelamente ao plano de contato é determinado pelo coeficiente de fricção (determinado pelos materiais, por exemplo, 0,7 para fricção bastante alta). O atrito máximo que você pode ter é o coeficiente de atrito multiplicado pelo deslocamento. Observe que esse valor pode ser maior que a velocidade real ao longo de um dos eixos. Nesse caso, você tem atrito estático e a partícula não deve se mover nesse eixo. Se o valor for menor que isso, a partícula se moverá um pouco, mas ficará mais lenta, ou seja, atrito dinâmico.

Mikael Högström
fonte
Você está certo. A parte complicada, pelo menos para mim, é determinar como "definir a posição da partícula afetada adequadamente".
usar o seguinte código
Ahh ok, então eu vejo onde você está. Eu tenho uma idéia para uma solução, eu vou editar a resposta
Mikael Högström
Essa é exatamente a técnica descrita no artigo;). Acho que vou tentar implementá-lo e, se for bom o suficiente para o meu projeto.
paldepind
Ahh, acho que sim ... Parece que o método é quase o mesmo que para um motor de carroceria rígida, basta levar em conta a integração do verlet e aplicar impulsos conforme a posição muda.
Mikael Högström