Come posso impedire ai corpi rigidi di muoversi l'uno attraverso l'altro usando la fisica integrata di Unity?


8

Sto cercando di creare un gioco in cui gli oggetti possano essere trascinati, ma ho problemi con la fisica. Con corpi rigidi che hanno masse simili, a volte si spingono l'un l'altro quando vengono trascinati e causano movimenti indesiderati. Ecco una demo .

Mi piacerebbe farlo usando solo la fisica integrata di Unity 3D .

Nella demo, è possibile utilizzare il mouse per fare clic e trascinare gli oggetti. I cilindri hanno tutti collettori di scatole e masse di 10000. Hanno anche vari vincoli a seconda del loro orientamento (nessuno può ruotare e tutti sono vincolati in x o y). La sfera ha una massa di 1, un collettore di sfere e un vincolo az.

La sfera e i cilindri interagiscono bene. Tuttavia, trascinare i cilindri l'uno sull'altro provoca l'intersezione. Non voglio questo!

I cilindri hanno interpolato impostato su "Interpolare" e il rilevamento delle collisioni impostato su "Continuo". Ho gettato lo script "DontGoThroughThings" su tutti i cilindri, ma non sembra fare nulla. Per quanto riguarda l'impostazione della velocità dei corpi rigidi, ho usato entrambe le seguenti linee con sostanzialmente lo stesso risultato:

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

Senza scrivere il mio codice di rilevamento delle collisioni, non ho idee. C'è un'impostazione semplice o qualcosa che mi sono perso?

Con il contesto spiegato, ecco una domanda più precisa: "Come posso fare in modo che i cilindri nella mia demo non si muovano l'uno nell'altro?"


Ridurre la massa dei cilindri fa differenza?
MGB,

No, credo che li farà passare più facilmente. Anche se la massa è simile alla sfera, anche la sfera inizierà a passare attraverso i cilindri.
Jeff,

Che cosa te lo fa pensare? È quando i rapporti di massa sono maggiori che il motore fisico ha più problemi con precisione.
MGB,

Perché l'ho provato: PI può caricare una demo in cui tutte le masse sono impostate su 1 se lo si desidera.
Jeff,

Una cosa che sto pensando è che potrebbe essere dovuto al modo in cui sto cambiando velocità. Proverò invece a cambiare per forzare
Jeff,

Risposte:


2

Senza guardare il tuo progetto / codice vorrei suggerire questo:

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

Ti consentirà di limitare la fisica ma nell'ambito e nel motore di fisica di Unity. Puoi destreggiarti con lo script per farlo bloccare solo un oggetto da spostare, ecc., Ma questo dovrebbe iniziare.


0

Si desidera impostare il rilevamento delle collisioni Continuous Dynamicper oggetti in rapido movimento. Continuousè usato per oggetti statici o lenti con cui gli Continuous Dynamicoggetti si scontrano. Vedi qui .

(Tieni presente che il rilevamento continuo delle collisioni è costoso, quindi usalo con parsimonia)


Ottengo gli stessi risultati quando imposto ciascuno dei cilindri su Continuous Dynamic. È quello che volevi dire?
Jeff,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.