Mantendo a rotação entre dois objetos

9

No meu jogo XNA, tenho dois objetos que colidem. Quando o primeiro objeto colide com o outro, ele é capaz de prendê-lo e movê-lo pelo mundo. Estou tendo um problema com a matemática aqui (matemática não é meu ponto forte). Atualmente, tenho o segundo objeto travado no primeiro e movo-o com ele, mas não consigo mantê-lo na direção original. Portanto, se o objeto estiver voltado para cima, ele deve manter essa direção em relação à forma como está sendo girado com o item original.

insira a descrição da imagem aqui

Alguma dica de como eu poderia conseguir isso?

user99
fonte
Eu acho que os dois objetos girariam em torno do eixo do centro do outro objeto.
MichaelHouse

Respostas:

3

No que diz respeito ao ângulo, basta manter o ângulo do segundo objeto igual ao ângulo do primeiro. Para posição, quando os dois objetos colidem, encontre a distância do segundo objeto a partir do primeiro usando a fórmula da distância.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Para encontrar a posição do segundo objeto em relação ao primeiro objeto:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)
tesselode
fonte
2

Além da resposta do @ tesselode, recomendo que você mantenha uma lista de objetos anexados para todos os objetos do mundo no seu jogo. Algo ao longo das linhas de List<WorldObject> AttachedObjects. Então, ao detectar uma colisão, você adicionaria o retângulo preto ao vermelho AttachedObjects. Depois disso, é apenas uma questão de atualizar as posições das crianças usando o método @ tesselode toda vez que você atualizar a posição dos pais.

Jesse Emond
fonte
2

Estou assumindo que um dos dois terá controle sobre o outro, como uma empilhadeira. No seu desenho, suponho que esse seja o preto e o vermelho o pacote. Você só mencionou que está tendo problemas com ângulos, então é isso que vou cobrir.

Quando os objetos se unem, você deve se lembrar da diferença de ângulo entre os dois (eu chamarei isso de Theta). Eu desenhei isso na figura 2 com as setas da primeira figura desenhadas uma sobre a outra. Até que os objetos sejam desbloqueados, o ângulo do objeto vermelho será determinado pelo ângulo do preto mais Theta, como mostra a figura 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Diferença de ângulo

John McDonald
fonte
1

Você pode implementar a capacidade de ter objetos filhos para um objeto (onde os objetos filhos seriam afetados automaticamente por alterações na posição / rotação do pai). Depois da colisão, quando eles devem trancar-se, você cria um objeto invisível e transforma os dois objetos anexos em filhos. Então, em vez de aplicar transformações (movimento, rotação) nos objetos individuais, você aplica no grande, OU ainda pode aplicar forças aos objetos filhos individuais, que marcariam "eu tenho um pai?" E se sim, a força seria enviada ao pai (que mesclaria forças de todos os objetos filhos em um vetor que se aplicaria a si mesmo).

Além disso, essa abordagem deve lidar adequadamente com sua rotação, se você calcular o centro de massa para o pai invisível de acordo com os pesos dos objetos travados, o que o método de John parece não realizar (o objeto unido gira em torno de seu novo centro de massa compartilhado, não em torno do centro de massa de um dos objetos) e você pode facilmente aninhar esse tipo de comportamento sem a necessidade de código adicional. Parece ser a abordagem mais robusta e flexível.

+ condição, se a força aplicada ao filho for forte o suficiente para quebrar a articulação, e você pode lidar com o "desbloqueio" dele simplesmente removendo o relacionamento pai-> filho. Se houver apenas um filho, você também o separa e também remove o pai invisível.

Posso fornecer mais detalhes (com fotos e pelo menos pseudocódigo e outros), se você estiver interessado.

código sh
fonte