ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Box2DSharp三种刚体类型与碰撞过滤实战:static、kinematic、dynamic怎么选?

Box2DSharp三种刚体类型与碰撞过滤实战:static、kinematic、dynamic怎么选? Box2DSharp三种刚体类型与碰撞过滤实战static、kinematic、dynamic怎么选【免费下载链接】Box2DSharpA C# port of Box2D项目地址: https://gitcode.com/gh_mirrors/bo/Box2DSharpBox2DSharp是一个基于 C# 的 Box2D 物理引擎移植项目它为 2D 游戏和应用提供刚体模拟、碰撞检测和碰撞过滤能力。很多新手在创建世界后第一个困惑就是刚体Body明明看起来差不多为什么有的会动、有的纹丝不动答案就在static、kinematic、dynamic三种刚体类型上。本文用一个清晰的对照表 实际用例帮你 5 分钟搞懂刚体类型怎么选以及碰撞过滤Collision Filtering如何控制谁和谁能撞。一、三种刚体类型速查表Box2DSharp 中的刚体类型定义在 src/Dynamics/Body.cs 的BodyType枚举中源码注释给出了最权威的一句话解释刚体类型质量速度谁来驱动它典型用途StaticBody静态零零手动移动地面、墙壁、不可破坏的障碍KinematicBody运动学零非零用户设定你写代码驱动传送带、自动门、玩家操控平台DynamicBody动力学正数由力决定物理引擎求解小球、箱子、角色、子弹一句话记忆法️static 摆在那儿谁也推不动kinematic 像电影镜头一样按你给的剧本走但会挡住别人dynamic 完全交给物理引擎重力、碰撞、力都影响它二、static 静态刚体场景的地基静态刚体质量为零、速度为零不参与受力计算因此开销最小。地面、天花板、固定障碍物都应该用它。在官方示例 test/Testbed.TestCases/CollisionFiltering.cs 中地面就是这样创建的默认BodyDef不指定类型时就是StaticBody再挂上一个EdgeShape边形状作为地面线。 注意静态刚体可以被手动改位置瞬移但物理引擎不会模拟它的运动所以不要用逐帧挪动静态刚体来模拟滑动平台——那是 kinematic 的活。三、kinematic 运动学刚体按剧本移动的演员运动学刚体是新手最容易用错的一种它质量为零不受力和碰撞的影响但你可以通过SetLinearVelocity给它指定速度然后由求解器带着它移动。项目自带了一个教科书级的演示 test/Testbed.TestCases/BodyTypes.cs一个悬挂的平台可以被按键切换成 dynamic / static / kinematic 三种类型实时对比。切到 kinematic 后平台在PreStep()中按自己设定的速度来回移动撞到球会把球带走但球却压不动它——这正是运动学刚体的精髓_platform.BodyType BodyType.KinematicBody; _platform.SetLinearVelocity(new Vector2(-_speed, 0.0f));典型场景来回移动的关卡平台传送带表面配合Friction摩擦力推物体玩家直接控制位移的传送门、电梯四、dynamic 动力学刚体完全交给物理引擎动力学刚体有正的质量质量 密度 × 形状面积它的速度完全由重力、外力、碰撞冲量共同决定。小球、箱子、角色都应该是 dynamic。创建时的关键在FixtureDef.Density密度定义于 src/Dynamics/Fixture.cs。密度为 0 的 dynamic 刚体会被引擎自动改为质量 1所以想悬浮不掉落时优先考虑把GravityScale设为 0 或改用 kinematic而不是玩密度的小聪明。另外一个实用开关BodyDef.Bullet。高速小物体容易穿过薄墙把 dynamic 刚体标记为 Bullet 可以开启连续碰撞检测但会增加计算开销官方注释也提醒应谨慎使用。五、碰撞过滤实战谁和谁会发生碰撞刚体类型解决怎么动碰撞过滤解决撞不撞。每个 Fixture 都有一个Filter包含三个字段定义在 src/Dynamics/Fixture.cs字段类型含义CategoryBitsushort位掩码我是什么占据若干位MaskBitsushort位掩码我能碰到什么GroupIndexshort同组特殊规则0 组内强制碰撞0 组内强制不碰判定逻辑写在 src/Dynamics/DefaultContactFilter.cs 的ShouldCollide中只有两步两个 shape 的GroupIndex相同且不为 0 → 正数碰、负数不碰直接返回否则要求双向位与都非零A.Mask B.Category ! 0且B.Mask A.Category ! 0两个方向都看得见才算碰撞。⚠️ 常见坑只改了 A 的 Mask 却忘了 B 的 Mask结果还是双向不可见以为过滤没生效。一个完整的过滤配置思路参考官方用例 test/Testbed.TestCases/CollisionFiltering.cs它定义了四种类别位private const ushort DefaultCategory 0x0001; private const ushort TriangleCategory 0x0002; private const ushort BoxCategory 0x0004; private const ushort CircleCategory 0x0008;再配合小组SmallGroup 1同组必碰和大组LargeGroup -1同组必不碰就可以做出小方块能穿过大三角形、但大三角形之间互相穿过这类精细规则。配置口诀先给每个逻辑类别分一个唯一的位0x01、0x02、0x04……别复用每个类别的MaskBits写成我能碰的所有类别的按位或同角色之间需要强规则必碰/必不碰时再上GroupIndex。六、选型决策清单按下面的顺序问自己基本不会选错它会受力、被重力影响、被碰撞推动吗 → 是DynamicBody它需要按脚本精确移动平台、传送带但不该被碰撞物顶走吗 → 是KinematicBody它永远静止不动吗 → 是StaticBody默认值最省事再叠加过滤规则只关心接触事件、不需要物理阻挡 → 把FixtureDef.IsSensor设为true传感器角色要和地面/道具/其他角色分通道碰撞 →CategoryBitsMaskBits同类物体必须或必须不互碰 →GroupIndex用 ±1七、小结Box2DSharp 的三种刚体类型本质上是谁掌握控制权的分工static 归场景、kinematic 归代码、dynamic 归引擎。而CategoryBits/MaskBits/GroupIndex这套位掩码过滤机制让你能在不改逻辑的前提下精确控制碰撞矩阵。理解了这张对照表和双向位与的判定规则传送带、传感器触发器、多层角色碰撞这些常见需求就都能落地了。上手建议直接打开 test/Testbed.TestCases/ 下的BodyTypes.cs、CollisionFiltering.cs、Sensors.cs三个用例运行调试比看文档更快建立直觉。【免费下载链接】Box2DSharpA C# port of Box2D项目地址: https://gitcode.com/gh_mirrors/bo/Box2DSharp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表