Como posso impedir que corpos rígidos se movam usando a física interna do Unity?

8

Estou tentando criar um jogo onde objetos podem ser arrastados, mas estou tendo problemas com a física. Com corpos rígidos com massas semelhantes, às vezes eles se empurram quando arrastados e causam movimentos indesejados. Aqui está uma demonstração .

Eu gostaria de fazer isso usando apenas a física interna do Unity 3D .

Na demonstração, você pode usar o mouse para clicar e arrastar objetos. Todos os cilindros têm coletores de caixas e massas de 10000. Eles também têm várias restrições, dependendo de sua orientação (nenhum pode girar e todos são restritos em x ou y). A esfera tem uma massa de 1, um colisor de esferas e uma restrição de az.

A esfera e os cilindros interagem bem. No entanto, arrastar os cilindros um sobre o outro causa interseção. Eu não quero isso!

Os cilindros têm interpolado definido como 'Interpolado' e a detecção de colisão definida como 'Contínua'. Eu joguei o script 'DontGoThroughThings' em todos os cilindros, mas ele parece não fazer nada. Quanto ao ajuste da velocidade dos corpos rígidos, usei as duas linhas a seguir com basicamente o mesmo resultado:

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

Sem escrever meu próprio código de detecção de colisão, estou sem ideias. Existe uma configuração simples ou algo que eu perdi?

Com o contexto explicado, aqui está uma pergunta mais precisa: "Como faço para que os cilindros na minha demonstração não se movam entre si?"

Jeff
fonte
Reduzir a massa dos cilindros faz alguma diferença?
MGB
Não, isso fará com que eles passem com mais facilidade, eu acho. Além disso, se a massa for semelhante à esfera, ela também passará pelos cilindros.
20414 Jeff
O que faz você pensar isso? É quando as proporções de massa são maiores que o mecanismo de física tem mais problemas com precisão.
MGB
Porque eu tentei: o PI pode fazer upload de uma demonstração em que todas as massas estão definidas como 1, se você quiser.
21414 Jeff Jeff
Uma coisa que estou pensando é que pode ser devido à maneira como estou mudando a velocidade. Vou tentar mudar à força, em vez
Jeff

Respostas:

2

Sem olhar para o seu projeto / código, eu gostaria de sugerir isso:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Isso permitirá que você restrinja a física, mas dentro do escopo e do mecanismo de física da Unity. Você pode mexer com o script para fazer com que ele bloqueie apenas um objeto a ser movido etc, mas isso deve ajudá-lo a começar.

Tom 'Blue' Piddock
fonte
0

Você deseja definir a detecção de colisão Continuous Dynamicpara objetos em movimento rápido. Continuousé usado para objetos estáticos ou de movimento lento com os quais os Continuous Dynamicobjetos colidem. Veja aqui .

(Lembre-se de que a detecção contínua de colisões é cara, use-a com moderação)

BlueRaja - Danny Pflughoeft
fonte
Eu obtenho os mesmos resultados quando defino cada um dos cilindros para Dinâmica contínua. É isso que você quis dizer?
Jeff