【问题标题】:Broken box2d body, locate specific fixtures, separate fixtures损坏的 box2d 主体,定位特定的夹具,单独的夹具
【发布时间】:2017-09-24 14:29:44
【问题描述】:

我已经尝试了几件事,包括: 传感器,光线投射,夹具距离,AABB,重叠夹具顶点,交叉点。不幸的是,我无法在这里展示一个几乎可以工作的代码示例。我也在寻找所有可能的来源,十次。

来自多个资源的切片/拆分方法并不完全符合我需要实现的目标,它是通过实际夹具的入口和出口点完成的。在我的情况下,需要“切割”的地方有空白。

图片:

destruction example 1

destruction example 2

你在这里看到的是一个三角形的物体,里面有几个固定装置。图片代表玩家切入后可能出现的状态。我正在使用 dermetfan 的 breakable 类来消除碰撞时的固定装置。

我想检测身体的各个部分(固定装置)何时松动/与每个人分开,而不是像图片上看到的那样在身体内部连接。由于身体物理在移除固定装置后仍然完好无损,因此它可以旋转和移动,因为它没有以任何方式损坏。

如果我有这些固定装置,我会克隆它们,破坏原始装置并创建一个新主体,以便让“破损”部分表现得像一个单独的部分。

更新: 请记住,可能有 X 个“边/片”,因为对破坏/路径没有限制。问题是识别那些在视觉上分离的固定装置的零件/集合。这不是一个初始的一次性冲动,每个夹具三角形一次被单独销毁一个。

【问题讨论】:

    标签: java libgdx box2d


    【解决方案1】:

    您似乎想要构建切片机制,为此,我不确定 breakeable 方法是否正确。你可能想看看这个article,看看你是否想对它采取不同的方法。但是,如果您正在使用固定装置网格,那么这是一种可能会有所帮助的通用方法。

    为了解决这个问题,我想找到一个可以帮助我解决问题的数据结构。为此,节点和边的图似乎是理想的。作为夹具和边的节点存在于仍连接的相邻夹具之间。

    我会在创建我的身体时构建这个图表,并使用我的装置中的用户数据来存储它。在“切片”时间用你的灯具的视觉重叠来构建它会更昂贵,而且可能更不稳定。

    在制作切片时,您可以破坏边,最后使用连通图查找算法来识别您的切片。谷歌搜索有很多结果,但here 是您可以开始的答案。

    一旦你有了你的作品,你就可以为每件作品创建新的身体和固定装置。如果您的新部件中有每个夹具的顶点,您可以使用this 方法来获取新的外边缘并以与构建父部件相同的方式构建部件。

    【讨论】:

    • 这(数据结构、节点和边图)是一种非常有趣的方法,并且在理论上似乎非常适合,我会研究一下。谢谢!
    • 感谢您的意见,终于能够实施解决方案。这并不完全是您提出的建议,但数据结构起到了作用。这是一条非常艰难、非常漫长但又充满挑战和乐趣的道路,我现在必须对其进行优化并添加一些额外的魔法。
    • @salty 很高兴听到! :D 当你构建一个像这样的非“开箱即用”机制时,我也经历过类似的过程。与许多事情一样,数据结构和算法可以帮助解决问题。是的,这是有益的!
    【解决方案2】:

    听起来您需要实现 post solve 方法并将该实现与世界挂钩。在 Box2D Testbed 演示的 Breakable 演示中有演示此的源代码。我不知道是否有演示的 Java 端口,但 C++ code for demoing breakable behavior is available。如果这还不是您看过的来源,我建议您这样做。

    无论如何,基本上,您实现了一个后求解方法并将其与世界挂钩。然后它会被调用联系信息和冲动信息。您可以解释该信息以识别与穿透体的固定装置(子弹或地面或任何您想用它破坏主体)接触的初始固定装置以及所涉及的脉冲量。您可能想要在计算最大 normal 脉冲量(与 tangent 脉冲量相反)方面执行类似于演示代码的操作,并且只开始休息如果该最大值高于阈值。

    如果您希望在超过冲动阈值的第一次接触时发生分离,那么您可以使用 post solve 方法中的联系信息来取出接触歧管并获得正常的联系人。在正常情况下,您可以编写一个算法来基本上遵循其通过主体的路径来确定破坏路径中的固定装置。可以移除这些固定装置,并将路径两侧的剩余固定装置克隆成两个新的独立主体,并移除旧主体。然后给这两个新物体一个小于原始压裂冲量一半的冲量,以及一点向外的冲量,以使分离具有一定的速度。只要你的最终组合脉冲不超过原始的破坏脉冲量,事情就应该看起来足够逼真。

    如果您希望仅在一个或多个灯具不再连接到其他灯具后才发生分离 - 根据您的编辑听起来就是这样 - 我可以看到完全使用另一种策略。与其将最初的可破坏对象创建为一个单一的物体,我会尝试让每个固定装置都已经在它自己的体内,并使用诸如距离接头之类的东西连接相邻的固定装置/物体。这将在计算上更加密集,但如果在每个阈值超过来自另一个身体的冲击时,这个集合中的一个身体被破坏,模拟最终会分离碎片,这是一个自然的结果,不再有约束将这些碎片连接在一起。当然,您必须在预期的硬件上进行尝试,看看这是否足以满足您的需求。

    根据我自己的建议,我对后一种策略进行了演示,以了解它的实际效果。我没有像你那样使用圆形图案的三角形,而只是简单地使用了 20 × 20 配置的 400 个正方形。我还使用 weld 关节而不是 distance 关节,因为 weld 关节使模拟看起来更像是整个物体被分解用炸弹。每个方形都属于它自己的身体,每个身体都通过焊接接头连接到它的直接邻居。模拟似乎从未低于 60 FPS,即使没有对新分离的部分施加任何额外的脉冲,我也很喜欢这个结果。

    以下是大型聚合对象被炸开后演示的屏幕截图:

    诚然,我这样做了within the Testbed of my own physics enginesource code for the demo is available online 也有帮助 - 虽然它在 C++ 中,但所有概念也应该适用于 Java Box2D。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的想法。我更新了我的初始帖子。在 libgdx 的接触监听接口中有一个 postsolve 方法。假设每次我击中/破坏身体内的固定装置时,我都会用正常的路径创建这样的路径,那么该算法将如何工作以检测剩余的固定装置?我可以像第一张图片一样用两块身体对其进行成像,但例如,如果只有 1/4(90 度)的部分从身体中脱落或任何其他不对称破坏?
    • @salty 顺便说一句,我不知道替代解决方案,但我想在检测到分离之前,必须有更好的执行算法来检测分离。就个人而言,第二种情况对我来说比第一种情况更有趣,现在我意识到这就是你要问的问题,我对你的问题投了赞成票,因为我想知道什么是可能的也是。
    猜你喜欢
    • 2017-12-16
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多