首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用调试呈现器可视化PhysicsWorld / CollisionShape?

如何使用调试呈现器可视化PhysicsWorld / CollisionShape?
EN

Stack Overflow用户
提问于 2017-03-19 12:43:48
回答 1查看 569关注 0票数 3

我的Urho3D/Urhosharp测试场景包含两个框(见屏幕截图)。无论是红色还是绿色,我都添加了一个RigidBody和一个CollisionShape

红色盒子的形状是球体,蓝色盒子是球体。我通过添加以下内容启用了调试可视化:

代码语言:javascript
复制
app.Engine.SubscribeToPostRenderUpdate(args => {
    app.Renderer.DrawDebugGeometry(false);
});

然而,这并不呈现碰撞形状,而只是对象的线框(绿线)。

以下是蓝色节点的代码:

代码语言:javascript
复制
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);

至于红色的:

代码语言:javascript
复制
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);

碰撞起作用了,但我很想看看物理世界,因为它使实验变得更容易。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 18:56:55

解决方案如下: Urho3D呈现器的默认调试输出不包括物理组件。必须手动添加。

代码语言:javascript
复制
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);
    }
});

为此,场景当然必须有一个调试渲染器和一个物理组件:

代码语言:javascript
复制
app.Scene.GetOrCreateComponent<PhysicsWorld>();
app.Scene.GetOrCreateComponent<DebugRenderer>();

结果和预期的一样。在红色方框下面的图像中,有一个球形碰撞形状:

我注意到的好处是:由于碰撞形状是实际节点的子节点,它将与节点一起缩放。这意味着,如果以Vector3.One大小创建的框或球体(或其他任何东西),则始终与实际节点大小相匹配。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42886727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档