¿Cómo puedo evitar que cuerpos rígidos se muevan unos a otros usando la física incorporada de Unity?

8

Estoy tratando de crear un juego donde se puedan arrastrar objetos, pero tengo problemas con la física. Con cuerpos rígidos que tienen masas similares, a veces se empujan unos a otros cuando son arrastrados y causan movimientos no deseados. Aquí hay una demostración .

Me gustaría hacer esto usando solo la física incorporada de Unity 3D .

En la demostración, puede usar el mouse para hacer clic y arrastrar objetos. Todos los cilindros tienen colisionadores de caja y masas de 10000. También tienen varias restricciones dependiendo de su orientación (ninguno puede rotar, y todos están restringidos en x o y). La esfera tiene una masa de 1, un colisionador de esfera y una restricción az.

La esfera y los cilindros interactúan bien. Sin embargo, arrastrar los cilindros unos sobre otros provoca la intersección. ¡No quiero esto!

Los cilindros tienen interpolar configurado en 'Interpolar' y detección de colisión configurada en 'Continuo'. He lanzado el script 'DontGoThroughThings' en todos los cilindros, pero no parece hacer nada. En cuanto a establecer la velocidad de los cuerpos rígidos, he usado estas dos líneas siguientes con básicamente el mismo resultado:

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

Sin escribir mi propio código de detección de colisión, me quedo sin ideas. ¿Hay una configuración simple o algo que me haya perdido?

Con el contexto explicado, aquí hay una pregunta más precisa: "¿Cómo puedo hacer que los cilindros en mi demo no se muevan entre sí?"

Jeff
fuente
¿La reducción de la masa de los cilindros hace alguna diferencia?
MGB
No, creo que les hará pasar más fácilmente. Además, si la masa es similar a la esfera, la esfera también comenzará a atravesar los cilindros.
Jeff
¿Qué te hace pensar que esto? Cuando las relaciones de masa son mayores, el motor de física tiene más problemas con la precisión.
MGB
Porque lo probé: PI puede cargar una demostración donde todas las masas están configuradas en 1 si lo desea.
Jeff
Una cosa que estoy pensando es que puede deberse a la forma en que estoy cambiando la velocidad. Voy a intentar cambiar a la fuerza en su lugar
Jeff

Respuestas:

2

Sin mirar su proyecto / código, me gustaría sugerir esto:

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;
}

Le permitirá restringir la física pero dentro del alcance y el motor de física de Unity. Puede moverse con el script para que bloquee solo un objeto que se moverá, etc., pero esto debería ayudarlo a comenzar.

Tom 'Blue' Piddock
fuente
0

Desea que la detección de colisión esté configurada Continuous Dynamicpara objetos que se mueven rápidamente. Continuousse usa para objetos estáticos o de movimiento lento con los que Continuous Dynamicchocan los objetos. Ver aquí .

(Tenga en cuenta que la detección continua de colisiones es costosa, así que úsela con moderación)

BlueRaja - Danny Pflughoeft
fuente
Obtengo los mismos resultados cuando configuro cada uno de los cilindros en Continuous Dynamic. ¿Es eso lo que querías decir?
Jeff