Como implementar um efeito físico no SimCity 5, que um edifício oscila quando está sendo movido?

É difícil descrever em texto simples, então gravei um GIF para demonstrar.

https://public.lightpic.info/image/2B1F_582465841.gif

Atualmente, estou trabalhando em um projeto que exige esse efeito. Até agora, terminei um efeito semelhante no iOS com o SpriteKit, no entanto, infelizmente, o resultado não é satisfatório.

Este é o meu trabalho: no meu projeto, há um objeto com uma forma irregular, uma força constante é aplicada em algum lugar abaixo do centro de gravidade do objeto e sua direção é descendente. Eu estabeleci uma regra de que a coordenada do objeto não pode ser alterada pela força, para que o objeto não seja puxado para baixo pela força. Quando o objeto é inclinado, sua inércia e a força resultam em um momento angular, o que torna o objeto na vertical. Detalhes:

E quando o objeto está sendo manipulado, o ponto de ação é maior que o centro de gravidade. Como resultado da combinação da inércia do objeto e da força, um momento angular torna o objeto inclinado.

No entanto, nada provou que estou certo, porque o resultado que obtive do mecanismo de física do SpriteKit é que, o objeto acaba sendo um pêndulo simples. Mas a intuição me diz que eu não estava errado, de fato, não prendi o centro de gravidade do objeto ao fundo, e o que realmente fiz foi colocar o objeto de volta à posição original toda vez que a física é simulada. Mas o resultado deu um tapa no meu rosto com muita força :(. Portanto, o pêndulo oscila e oscila, o efeito físico final é uma merda.

Depois, elaborei uma solução temporária: multiplicar a velocidade angular por 0,95 toda vez que a física é simulada. Essa solução claramente não é a ideal, porque quando o ângulo de rotação tende a ser horizontal, a velocidade angular não é alta o suficiente e fica ereta lentamente. No entanto, há um avanço: pelo menos o objeto é capaz de parar de balançar finalmente.

Minha solução adicional é que a força aplicada ao objeto muda com o nível de inclinação. Quando o objeto tende a ser horizontal, a força tende a ser grande e, quando o objeto tende a ser vertical, a força tende a ser pequena. Uma função simples a descreveria bem: F = 1000N × | sin [graus de rotação] |. Isso ajuda bastante, mas infelizmente o efeito do resultado não parece físico.

Conclusão: após muitos dias de estudo, não consegui implementar o efeito demonstrado no GIF e sinto muita vergonha disso. Eu realmente espero que alguém com grande habilidade me ajude. Obrigado por ler minha longa descrição, eu realmente aprecio sua paciência.

Adição:

Há uma captura de tela que mostra minha abordagem para implementar esse efeito.

Adição 2:

Fiz upload da minha implementação, que é um arquivo do Swift Playground. Faça o download em:http://www.mediafire.com/file/qrct5sty2cyvwsy/Swing.playground.zip

PS. Como minha língua nativa não é o inglês, perdoe minha gramática ruim.

questionAnswers(1)

yourAnswerToTheQuestion