损坏的 box2d body,定位特定的固定装置,分离固定装置
Broken box2d body, locate specific fixtures, separate fixtures
我已经尝试了几件事,包括:
传感器、光线投射、灯具距离、AABB、重叠灯具顶点、相交。不幸的是,我无法在这里展示一个几乎可以工作的代码示例。我也在寻找所有可能的来源,十次。
来自多个资源的 slicing/splitting 方法并不完全符合我需要实现的目标,它是通过一个实际夹具的入口和出口点完成的。在我的例子中, space 需要 "cut" 的地方是空的。
图片:
destruction example 1
destruction example 2
您在这里看到的是一个 body,它是三角测量的,里面有几个固定装置。这些图片代表了玩家切入后的可能状态。我正在使用 dermetfan 的易碎 class 以摆脱碰撞时的固定装置。
我想检测 body(固定装置)的片段何时来自 eachoder loose/apart,而不是在 body 内部连接就像在照片上看到的一样。由于 body 物理在移除固定装置后仍然完好无损,它会旋转和移动,因为它没有以任何方式损坏。
如果我有这些固定装置,我会克隆它们破坏原来的并创建一个新的 body 以便让 "broken" 部分作为一个单独的部分运行。
更新:
请记住,可能有 X "sides/pieces",因为 destruction/paths 没有限制。问题是识别那些 parts/collection 视觉分离的固定装置。不是最初的一次性冲动,每个夹具三角形一次单独销毁一个。
听起来您需要实施 post solve 方法并将该实施挂钩到世界中。在 Box2D Testbed 演示的 Breakable 演示中有演示此功能的源代码。我不知道演示是否有 Java 端口,但 C++ code for demoing breakable behavior is available。如果这不是您看过的来源,我建议您这样做。
无论如何,基本上,您实现一个 post 解决方法并将其连接到世界。然后它将被调用并提供联系信息和冲动信息。您可以解释该信息以识别诸如与穿透物体的固定装置(子弹或地面或您想要破坏主体的任何东西)接触的初始固定装置以及所涉及的冲量。在计算最大 normal 脉冲量(与 tangent 脉冲量相对)方面,您可能想要做一些类似于演示代码的事情) 并且仅在最大值高于阈值时才开始休息。
如果你希望你的分离发生在第一次接触超过你的冲动阈值时,那么你可以使用你的post解决方法中的联系信息来获得离开接触歧管并获得接触的法线。对于法线,您可以编写一个算法来基本上跟随它通过主体的路径来确定 破坏路径 中的固定装置。这些固定装置可以被移除,路径两侧的剩余固定装置被克隆到两个新的独立主体中,旧的主体被移除。然后给两个新的物体每一个一个小于原始破裂冲量一半的冲量,以及一点向外的冲量,使分离速度达到一定程度。只要你的最终合成冲击量不超过原来的破碎冲击量,看起来就足够逼真了。
如果您希望仅在一个或多个灯具不再连接到其他灯具后才发生分离 — 根据您的编辑 这听起来像是这样 — 我明白了完全使用另一种策略。我不会将初始的易碎对象创建为单个实体,而是尝试让每个固定装置都已经在其自己的实体内,并使用距离关节之类的东西连接相邻的 fixtures/bodies。这将在计算上更加密集,但如果在每个阈值超过来自另一个物体的影响时,此集合中的一个物体被破坏,模拟最终将分离碎片作为不再具有将这些碎片连接在一起的约束的自然结果。当然,您必须在预期的硬件上试用它,看看它的性能是否足以满足您的需求。
根据我自己的建议,我整理了后一种策略的演示,以了解它的实际效果。我没有像你那样在圆形图案中使用三角形,而只是简单地在 20 × 20 配置中使用了 400 个正方形。我还使用 weld 关节代替 distance 关节作为 weld 关节使模拟看起来更就像整个物体被炸弹炸裂一样。每个方形都属于自己的主体,每个主体都通过焊缝连接到它的直接邻居。模拟似乎从未低于 60 FPS,即使没有对新分离的部分应用任何额外的脉冲,我也喜欢这个结果。
下面是大型聚合对象被炸开后演示的截屏:
诚然,如果有帮助的话,我也这样做了 within the Testbed of my own physics engine. The source code for the demo is available online — 虽然它是在 C++ 中,但所有概念也应该适用于 Java Box2D。
希望对您有所帮助。
您似乎想要构建切片机制,为此,我不确定 breakeable 方法是否正确。您可能想看看这个 article 看看您是否想对它采取不同的方法。不过,如果您正在使用固定装置网格,那么这是一种可能会有所帮助的通用方法。
为了解决这个问题,我想找到一个数据结构来帮助我解决这个问题。为此,节点和边的图形似乎是理想的。作为固定装置的节点和边缘存在于仍然连接的相邻固定装置之间。
我会在创建我的 body 时构建此图,并使用我的固定装置中的用户数据来存储它。在 'slice' 时间用固定装置的视觉重叠构建它会更昂贵,而且可能更不稳定。
在制作切片时,您可以破坏边,最后使用连接图查找算法来识别您的切片。 google 搜索此内容有很多结果,但 here 是您可以从中着手的答案。
获得作品后,您可以为每个作品创建新的主体和固定装置。如果你的新作品中有每个固定装置的顶点,你可以使用 this 方法来获得你的新外边缘并以与构建 parent 作品相同的方式构建作品。
我已经尝试了几件事,包括: 传感器、光线投射、灯具距离、AABB、重叠灯具顶点、相交。不幸的是,我无法在这里展示一个几乎可以工作的代码示例。我也在寻找所有可能的来源,十次。
来自多个资源的 slicing/splitting 方法并不完全符合我需要实现的目标,它是通过一个实际夹具的入口和出口点完成的。在我的例子中, space 需要 "cut" 的地方是空的。
图片:
destruction example 1
destruction example 2
您在这里看到的是一个 body,它是三角测量的,里面有几个固定装置。这些图片代表了玩家切入后的可能状态。我正在使用 dermetfan 的易碎 class 以摆脱碰撞时的固定装置。
我想检测 body(固定装置)的片段何时来自 eachoder loose/apart,而不是在 body 内部连接就像在照片上看到的一样。由于 body 物理在移除固定装置后仍然完好无损,它会旋转和移动,因为它没有以任何方式损坏。
如果我有这些固定装置,我会克隆它们破坏原来的并创建一个新的 body 以便让 "broken" 部分作为一个单独的部分运行。
更新: 请记住,可能有 X "sides/pieces",因为 destruction/paths 没有限制。问题是识别那些 parts/collection 视觉分离的固定装置。不是最初的一次性冲动,每个夹具三角形一次单独销毁一个。
听起来您需要实施 post solve 方法并将该实施挂钩到世界中。在 Box2D Testbed 演示的 Breakable 演示中有演示此功能的源代码。我不知道演示是否有 Java 端口,但 C++ code for demoing breakable behavior is available。如果这不是您看过的来源,我建议您这样做。
无论如何,基本上,您实现一个 post 解决方法并将其连接到世界。然后它将被调用并提供联系信息和冲动信息。您可以解释该信息以识别诸如与穿透物体的固定装置(子弹或地面或您想要破坏主体的任何东西)接触的初始固定装置以及所涉及的冲量。在计算最大 normal 脉冲量(与 tangent 脉冲量相对)方面,您可能想要做一些类似于演示代码的事情) 并且仅在最大值高于阈值时才开始休息。
如果你希望你的分离发生在第一次接触超过你的冲动阈值时,那么你可以使用你的post解决方法中的联系信息来获得离开接触歧管并获得接触的法线。对于法线,您可以编写一个算法来基本上跟随它通过主体的路径来确定 破坏路径 中的固定装置。这些固定装置可以被移除,路径两侧的剩余固定装置被克隆到两个新的独立主体中,旧的主体被移除。然后给两个新的物体每一个一个小于原始破裂冲量一半的冲量,以及一点向外的冲量,使分离速度达到一定程度。只要你的最终合成冲击量不超过原来的破碎冲击量,看起来就足够逼真了。
如果您希望仅在一个或多个灯具不再连接到其他灯具后才发生分离 — 根据您的编辑 这听起来像是这样 — 我明白了完全使用另一种策略。我不会将初始的易碎对象创建为单个实体,而是尝试让每个固定装置都已经在其自己的实体内,并使用距离关节之类的东西连接相邻的 fixtures/bodies。这将在计算上更加密集,但如果在每个阈值超过来自另一个物体的影响时,此集合中的一个物体被破坏,模拟最终将分离碎片作为不再具有将这些碎片连接在一起的约束的自然结果。当然,您必须在预期的硬件上试用它,看看它的性能是否足以满足您的需求。
根据我自己的建议,我整理了后一种策略的演示,以了解它的实际效果。我没有像你那样在圆形图案中使用三角形,而只是简单地在 20 × 20 配置中使用了 400 个正方形。我还使用 weld 关节代替 distance 关节作为 weld 关节使模拟看起来更就像整个物体被炸弹炸裂一样。每个方形都属于自己的主体,每个主体都通过焊缝连接到它的直接邻居。模拟似乎从未低于 60 FPS,即使没有对新分离的部分应用任何额外的脉冲,我也喜欢这个结果。
下面是大型聚合对象被炸开后演示的截屏:
诚然,如果有帮助的话,我也这样做了 within the Testbed of my own physics engine. The source code for the demo is available online — 虽然它是在 C++ 中,但所有概念也应该适用于 Java Box2D。
希望对您有所帮助。
您似乎想要构建切片机制,为此,我不确定 breakeable 方法是否正确。您可能想看看这个 article 看看您是否想对它采取不同的方法。不过,如果您正在使用固定装置网格,那么这是一种可能会有所帮助的通用方法。
为了解决这个问题,我想找到一个数据结构来帮助我解决这个问题。为此,节点和边的图形似乎是理想的。作为固定装置的节点和边缘存在于仍然连接的相邻固定装置之间。
我会在创建我的 body 时构建此图,并使用我的固定装置中的用户数据来存储它。在 'slice' 时间用固定装置的视觉重叠构建它会更昂贵,而且可能更不稳定。
在制作切片时,您可以破坏边,最后使用连接图查找算法来识别您的切片。 google 搜索此内容有很多结果,但 here 是您可以从中着手的答案。
获得作品后,您可以为每个作品创建新的主体和固定装置。如果你的新作品中有每个固定装置的顶点,你可以使用 this 方法来获得你的新外边缘并以与构建 parent 作品相同的方式构建作品。