Wie kann ich mithilfe der in Unity integrierten Physik verhindern, dass sich starre Körper durcheinander bewegen?

8

Ich versuche ein Spiel zu erstellen, in dem Objekte gezogen werden können, aber ich habe Probleme mit der Physik. Bei starren Körpern mit ähnlichen Massen drücken sie sich beim Ziehen manchmal gegenseitig durch und verursachen unerwünschte Bewegungen. Hier ist eine Demo .

Ich möchte dies nur mit der in Unity 3D integrierten Physik tun .

In der Demo können Sie mit der Maus auf Objekte klicken und diese ziehen. Die Zylinder haben alle Kastenkollider und Massen von 10000. Sie haben auch verschiedene Einschränkungen in Abhängigkeit von ihrer Ausrichtung (keiner kann sich drehen und alle sind in x oder y eingeschränkt). Die Kugel hat eine Masse von 1, einen Kugelkollider und eine Az-Bedingung.

Die Kugel und die Zylinder interagieren gut. Das Übereinanderziehen der Zylinder führt jedoch zu einer Überschneidung. Ich will das nicht!

Bei den Zylindern ist die Interpolation auf "Interpolieren" und die Kollisionserkennung auf "Kontinuierlich" eingestellt. Ich habe das Skript 'DontGoThroughThings' auf alle Zylinder geworfen , aber es scheint nichts zu bewirken . Für die Einstellung der Geschwindigkeit der Starrkörper habe ich beide folgenden Zeilen mit im Grunde dem gleichen Ergebnis verwendet:

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

Ohne meinen eigenen Kollisionserkennungscode zu schreiben, habe ich keine Ideen mehr. Gibt es eine einfache Einstellung oder etwas, das ich verpasst habe?

Im Zusammenhang mit dem erläuterten Kontext ist hier eine genauere Frage: "Wie kann ich die Zylinder in meiner Demo dazu bringen, sich nicht gegenseitig zu bewegen?"

Jeff
quelle
Macht es einen Unterschied, die Masse der Zylinder zu reduzieren?
MGB
Nein, es wird sie leichter durchgehen lassen, denke ich. Auch wenn die Masse der Kugel ähnlich ist, beginnt die Kugel auch durch die Zylinder zu laufen.
Jeff
Was lässt dich das denken? Wenn die Massenverhältnisse größer sind, hat die Physik-Engine mehr Probleme mit der Präzision.
MGB
Weil ich es versucht habe: PI kann eine Demo hochladen, in der alle Massen auf 1 gesetzt sind, wenn Sie möchten.
Jeff
Eine Sache, die ich denke, ist möglicherweise, dass ich die Geschwindigkeit ändere. Ich werde versuchen, stattdessen zu zwingen, zu zwingen
Jeff

Antworten:

2

Ohne auf Ihr Projekt / Ihren Code zu schauen, möchte ich Folgendes vorschlagen:

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

Damit können Sie die Physik einschränken, jedoch innerhalb des Bereichs und der Physik-Engine von Unity. Sie können mit dem Skript herumwackeln, damit nur ein zu verschiebendes Objekt usw. gesperrt wird. Dies sollte Ihnen jedoch den Einstieg erleichtern.

Tom 'Blue' Piddock
quelle
0

Sie möchten, dass die Kollisionserkennung Continuous Dynamicfür sich schnell bewegende Objekte eingestellt ist. Continuouswird für statische oder sich langsam bewegende Objekte verwendet, mit denen Continuous DynamicObjekte kollidieren. Siehe hier .

(Beachten Sie, dass die kontinuierliche Kollisionserkennung teuer ist. Verwenden Sie sie daher sparsam.)

BlueRaja - Danny Pflughoeft
quelle
Ich erhalte die gleichen Ergebnisse, wenn ich jeden Zylinder auf Continuous Dynamic stelle. Ist es das, was du meintest?
Jeff