如何使用调试渲染器可视化 PhysicsWorld / CollisionShape?
How to visualize PhysicsWorld / CollisionShape with debug renderer?
我的 Urho3D/Urhosharp 测试场景包含两个框(见屏幕截图)。
对于红色和绿色框,我添加了一个 RigidBody
和一个 CollisionShape
.
红色盒子的形状是球体,蓝色盒子的形状是盒子。我通过添加启用了调试可视化:
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);
碰撞有效,但我很想看看物理世界,因为它使实验更容易。
解决方案如下:Urho3D 渲染器的默认调试输出不包括物理组件。必须手动添加。
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);
}
});
为此,场景当然必须具有调试渲染器和物理组件:
app.Scene.GetOrCreateComponent<PhysicsWorld>();
app.Scene.GetOrCreateComponent<DebugRenderer>();
那么结果是符合预期的。下图中红框的碰撞形状为球形:
我注意到的一件好事:由于碰撞形状是实际节点的子节点,它将与节点一起缩放。这意味着如果创建的盒子或球体(或其他任何东西)的大小为 Vector3.One
,它将始终与实际节点大小相匹配。
我的 Urho3D/Urhosharp 测试场景包含两个框(见屏幕截图)。
对于红色和绿色框,我添加了一个 RigidBody
和一个 CollisionShape
.
红色盒子的形状是球体,蓝色盒子的形状是盒子。我通过添加启用了调试可视化:
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);
碰撞有效,但我很想看看物理世界,因为它使实验更容易。
解决方案如下:Urho3D 渲染器的默认调试输出不包括物理组件。必须手动添加。
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);
}
});
为此,场景当然必须具有调试渲染器和物理组件:
app.Scene.GetOrCreateComponent<PhysicsWorld>();
app.Scene.GetOrCreateComponent<DebugRenderer>();
那么结果是符合预期的。下图中红框的碰撞形状为球形:
我注意到的一件好事:由于碰撞形状是实际节点的子节点,它将与节点一起缩放。这意味着如果创建的盒子或球体(或其他任何东西)的大小为 Vector3.One
,它将始终与实际节点大小相匹配。