2017-03-19 4 views
2

Meine Testszene für Urho3D/Urhosharp enthält zwei Boxen (siehe Screenshot). Für beide, die rote und die grüne Box habe ich eine RigidBody und eine CollisionShape hinzugefügt.Wie visualisiert man PhysicsWorld/CollisionShape mit Debug-Renderer?

enter image description here

Die Form für das rote Feld ist eine Kugel und die blauen eine Box. Ich habe Debug-Visualisierung aktiviert durch Zugabe:

app.Engine.SubscribeToPostRenderUpdate(args => { 
    app.Renderer.DrawDebugGeometry(false); 
}); 

Dies ist jedoch nicht die Kollision Formen nicht machen, sondern nur das Drahtmodell der Objekte (grüne Linien).

Hier ist der Code für den blauen Knoten:

var floorNode = app.RootNode.CreateChild("Floor"); 
    floorNode.Position = Vector3.Zero; 
    floorNode.Scale = new Vector3(10, 1, 10); 
    var floorComp = floorNode.CreateComponent<Box>(); 
    floorComp.SetMaterial(Material.FromColor(new Color(0, 0, 1, 0.5f))); 

var rigidBody = floorNode.CreateComponent<RigidBody>(); 
    rigidBody.Mass = 0; 
    var collNode = floorNode.CreateComponent<CollisionShape>(); 
    collNode.SetBox(Vector3.One, Vector3.Zero, Quaternion.Identity); 

Und für die roten:

var boxNode = app.RootNode.CreateChild("Box"); 
    boxNode.SetScale(2f); 
    var boxComp = boxNode.CreateComponent<Box>(); 
    boxComp.Color = Color.Red; 
    boxComp.SetMaterial(Material.FromColor(Color.Red)); 

var rigidBody = boxNode.CreateComponent<RigidBody>(); 
    rigidBody.Mass = 0f; 
    var collNode = boxNode.CreateComponent<CollisionShape>(); 

    collNode.SetBox(Vector3.One, Vector3.Zero, Quaternion.Identity); 
    collNode.SetSphere(3f, Vector3.Zero, Quaternion.Identity); 

die Kollision funktioniert, aber ich würde gerne die Welt der Physik zu sehen, weil es einfacher macht experimentieren.

Antwort

3

Und hier ist die Lösung: Die Standard-Debug-Ausgabe des Urho3D-Renderers enthält nicht die Physik-Komponenten. Es muss manuell hinzugefügt werden.

app.Engine.SubscribeToPostRenderUpdate(args => { 
    // Default debug rendering. 
    app.Renderer.DrawDebugGeometry(false); 

    // Use debug renderer to output physics world debug. 
    var debugRendererComp = app.Scene.GetComponent<DebugRenderer>(); 
    var physicsComp = app.Scene.GetComponent<PhysicsWorld>(); 
    if(physicsComp != null) 
    { 
     physicsComp.DrawDebugGeometry(debugRendererComp, false); 
    } 
}); 

Dazu die Szene einen Debug-Renderer und eine Physik-Komponente natürlich arbeiten müssen:

wie erwartet
app.Scene.GetOrCreateComponent<PhysicsWorld>(); 
app.Scene.GetOrCreateComponent<DebugRenderer>(); 

Dann wird das Ergebnis. Im Bild unten die roten Box hat eine sphärische Form Kollision bekommt:

Physics debug rendering

Die nette Sache, die ich bemerkte: da die Kollisionsform ein Kind-Knoten des aktuellen Knotens ist, wird es zusammen mit dem Knoten skalieren. Das bedeutet, wenn die Box oder Kugel (oder was auch immer) mit einer Größe von Vector3.One erstellt wird, wird sie immer der tatsächlichen Knotengröße entsprechen.

Verwandte Themen