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.
fonte
Respostas:
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.
fonte
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.
fonte