如何使用调试渲染器可视化PhysicsWorld / CollisionShape?

时间:2017-03-19 12:43:49

标签: urhosharp urho3d

我的Urho3D / Urhosharp测试场景包含两个方框(见截图)。 对于红色和绿色框,我添加了RigidBodyCollisionShape

enter image description here

红色框的形状是一个球体,蓝色的形状是一个盒子。我通过添加:

启用了调试可视化
app.Engine.SubscribeToPostRenderUpdate(args => {
    app.Renderer.DrawDebugGeometry(false);
});

但是,这不会渲染碰撞形状,只会渲染对象的线框(绿线)。

这是蓝色节点的代码:

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

红色的那个:

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

碰撞有效,但我喜欢看物理世界,因为这样可以更容易实验。

1 个答案:

答案 0 :(得分:4)

这是解决方案:Urho3D渲染器的默认调试输出不包括物理组件。它必须手动添加。

\
   \libraries
      \lib1
      \lib2
   \source
      \proy1
      \proy2

为了使其工作,场景当然必须有一个调试渲染器和一个物理组件:

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

然后结果如预期。在下面的图像中,红色框具有球形碰撞形状:

Physics debug rendering

我注意到的好处是:由于碰撞形状是实际节点的子节点,它将与节点一起缩放。这意味着如果创建大小为app.Scene.GetOrCreateComponent<PhysicsWorld>(); app.Scene.GetOrCreateComponent<DebugRenderer>(); 的框或球(或其他),它将始终与实际节点大小匹配。