Editar
Problema resolvido (consulte a resposta de Drackir). Aqui está uma demonstração do que eu estava tentando alcançar com essa articulação. Mais informações sobre o cenário nesta outra questão .
Problema
Estou tentando criar um tipo muito específico de junta no Farseer que se comporta assim:
- Objectos deve sempre manter a mesma distância entre eles em ambos os eixos X e Y.
- Tradução - Uma colisão com um dos objetos deve mover o grupo inteiro, mas o grupo não deve girar - apenas os objetos individuais podem girar em torno de seus centros como resultado do torque.
- Rotação - Os objetos devem sempre ter a mesma rotação. Uma colisão com um dos objetos deve fazer com que todos os outros giram exatamente a mesma quantidade.
Aqui está uma foto:
Se não há como conseguir isso com o Farseer pronto para uso, como eu o estenderia para criar um novo tipo de junção que funciona assim? Basicamente, quero que cada corpo se comporte como um "clone" dos outros, mas com um deslocamento fixo entre eles.
xna
farseer-physics-engine
David Gouveia
fonte
fonte
Respostas:
Ok, depois de duas horas de conserto, consegui fazer isso, mas é preciso adicionar alguns corpos extras. Você provavelmente desejará extrair essas coisas em um método / classe, mas a idéia básica é a seguinte:
Crie o que chamo de corpos "detentores" para seus objetos. Esses corpos compartilham o tamanho e a posição dos seus "objetos", mas não participam de colisões. Essencialmente, eles são clones.
Anexe cada suporte ao "mainHolder" usando a
WeldJoint
. Isso impedirá que eles se afastem um do outro. OFixedRotation
no suporte principal impede que eles girem. Não sei se há um bug no clarividente, mas se você adicionar umWeldJoint
e os dois corpos tiveremFixedRotation == true
, a articulação não funcionará corretamente. É por isso que apenas o titular principal possui.FixedRotation = true
.Anexe seus corpos de "objetos" aos respectivos proprietários usando
RevoluteJoint
s. Isso bloqueia seus objetos nos suportes, mas permite que eles girem livremente.Faça as rotações dos seus objetos reais se encaixarem, anexando uma junta angular. Nota: você não precisa anexar uma junta angular a cada par de objetos. Basta adicionar uma junta angular ao corpo principal e ao outro corpo e as rotações serão traduzidas em todos os objetos.
É isso aí! Basta adicionar o código extra para o outro objeto / suporte de objeto que você deseja e ele cuidará do resto. Aqui está uma imagem para ilustrar meu teste:
Aqui você verá que os corpos verdes são os detentores. Eles não giram ou colidem e são soldados juntos. Os corpos amarelo e vermelho são seus "objetos" (o amarelo é o principal). Você pode ver que eles são girados na mesma quantidade e estão girando em torno de seus respectivos suportes. Além disso, apenas os corpos vermelho e amarelo participam de colisões. Acredito que isso atenda às três condições acima.
Exemplo de trabalho
Se você carregar a solução Farseer "Samples XNA" e encontrar o SimpleDemo1.cs (projeto "Samples XNA"> pasta "Samples"), eu o reescrevi ( código aqui ) para testar.
Espero que isto ajude. Deixe-me saber se você tiver alguma dúvida.
fonte
Vector2
diferença entre a posição do corpo e o corpo principal). Em seguida, reposicione a principal e apenas atualize suas posições em relação à principal.Infelizmente, não posso verificar esta resposta, pois estou em um telefone agora, então peço desculpas se não funcionar como eu esperava.
Eu acho que você poderia usar várias articulações existentes para conseguir o que deseja. Crie um corpo sem geometria de colisão no canto do triângulo e, em seguida, use três juntas de distância para obter a tradução desejada. Então, se você conectar os dois corpos colidíveis com uma junta de ângulo fixo, eles girarão juntos.
fonte