2D 物理引擎:弹跳球与非弹性碰撞不会停止

2024-01-12

我用 Java 创建了一个简单的 2d 物理引擎,它使用圆形射弹和直墙。目前,对于每一帧,每个射弹的位置都会提前velocity * (1/fps)。之后速度每帧更新一次。碰撞检测使用先前位置和当前位置以点斜率形式定义一条线,检查该线是否与墙壁相交,如果该交点位于先前位置和当前位置之间,则会记录碰撞,并且射弹的当前位置和速度相应更新。目前,还没有预期的轮换。

现在,除了非弹性碰撞之外,这一切都有效。目前,非弹性碰撞会将垂直于其碰撞表面的射弹速度分量乘以某个小于 1 的系数。

假设有一个弹丸在水平面上上下弹跳。什么should发生的情况是,弹丸速度的 y 分量随着每次弹跳而减小,导致弹丸的最大高度随着每次弹跳而减小,最终达到可以忽略不计的点。相反,发生的情况是球的最大高度减小到某个点,然后开始增加几次弹跳,然后再次开始减小,进入一个恒定的循环。结果是球永远不会真正停止,而是看起来“抖动”。

发生这种情况是因为射弹每帧都以直线段移动,并且速度不是连续变化的。如果球下落的帧数多于球上升的帧数,则球会在这些额外的帧中加速,最终会比应有的高度更高。所发生的情况是,球到达一个点,由于上述原因,一次弹跳将其发送到比应有的高度更高的位置。当最大高度由于非弹性碰撞再次下降时,它会再次做同样的事情。

我尝试通过让球移动来消除这个问题(v*t + 0.5*a*t^2), where v是速度,a是重力加速度,并且t is 1/fps。这是可行的,除了当弹跳足够小时它会导致使用直线的碰撞检测失败。我还尝试过使用参数定义的抛物线进行碰撞检测,但在检测射弹之间的碰撞时,它变得令人难以置信的烦人和低效。如果您好奇,我可以更深入地解释我尝试的解决方案。

您还想建议其他任何简单的解决方案吗?

提前致谢,特别是如果您确实阅读了这五个段落。


我建议的是有一个会反弹的代码块only如果弹跳高度等于或高于您定义为高度的某个常数。您将需要某种循环结构(或“辅助”方法,如下所示)来计算球每次弹跳后的预计弹跳高度。那么你也许可以做这样的事情:(假设你已经输入了“现在是时候弹跳方法了”)

private static final int MINIMUM_BOUNCE = 100 //arbitrary value

. . .

if(calculateNewBounceHeight() >= MINIMUM_BOUNCE) {
    bounce();
} else {
    // terminate program?
    // notify user?
    // etc.
}

这种方式的唯一问题是,如果您没有在某个时刻终止,程序将检查它是否可以无限弹跳(如果球在基线上“滚动”)。这可能会导致一些内存问题,因为它在某种程度上是无限循环。

只是为了澄清:calculateNewBounceHeight() and bounce()我认为您能够创建这些方法。这有帮助吗?如果我错过了某些内容或错误地解释了问题,请告诉我(我可能没有阅读整篇文章)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2D 物理引擎:弹跳球与非弹性碰撞不会停止 的相关文章

  • 使用哈希值跟踪文件的唯一版本

    我将跟踪可能数百万个不同文件的不同版本 我的目的是对它们进行散列以确定我已经看到了该文件的特定版本 目前 我只使用 MD5 该产品仍在开发中 因此尚未处理过数百万个文件 这显然不够长 无法避免冲突 然而 这是我的问题 如果我使用两种不同的方
  • 矩形之间的二维碰撞检测

    我正在为我的游戏编写碰撞检测引擎 但遇到一些问题 事实上 由于我有几个固定的矩形和一个移动的 玩家 我需要知道固定矩形的哪一侧首先被玩家碰撞 以正确地替换他 固定矩形不在网格中 因此它们可以放置在地图上的任何位置 并且可以具有不同的大小 它
  • 边界椭圆

    我被分配了一个图形模块的作业 其中一部分是计算一组任意形状的最小外接椭圆 椭圆不必与轴对齐 这是使用 AWT 形状在 java euch 中工作的 因此我可以使用形状提供的所有工具来检查对象的包含 相交 您正在寻找椭圆体最小包围体积 htt
  • 盒子碰撞检测和弹跳

    我正在制作乒乓球 并且发现编写一个将球正确地从四堵墙上弹开的算法真的很困难 稍后我将处理得分问题 因为只有西边和东边的一部分会进球 所以现在我想让球在盒子周围弹跳 检测球是否撞到墙壁很容易 但我在计算新角度时遇到困难 这是我到目前为止所想出
  • 圆弧碰撞检测

    那么如何实现圆弧的碰撞检测呢 我是否必须使用 Box 2d 碰撞 或者我可以使用 Rectangle 或类似的东西以其他方式进行操作吗 顺便说一句 我讨厌 box2d 因为我不理解其中的大部分内容 所以如果有一个排除 box2d 的解决方案
  • 如何测试两个移动的二维边界框的碰撞?

    OBB 具有位置 x y 速度 x y 和方向 矩阵 在定期更新的情况下 OBB 必须相互碰撞 返回被认为成功的移动部分 我查看了 GPWiki 上的多边形测试 http gpwiki org index php Polygon Colli
  • JavaScript 游戏中的碰撞检测?

    我的地图数组 map 0 0 0 0 0 0 0 map 1 0 1 0 1 0 1 map 2 0 0 0 0 0 0 map 3 1 0 1 0 1 0 map 4 0 0 0 0 0 0 map 5 0 1 0 1 0 1 1 跨栏
  • Flash 功能中的冲突检测? (命中测试对象)

    你好 所以我最近一直在使用hitTestObject检测我正在制作的 Android 应用程序中的碰撞 经过一番测试后 我意识到游戏正在检测 假 碰撞 我的意思是它正在检测碰撞not当物体的像素接触时 但是 经过一些研究后 我发现boxes
  • 如何在 Three.js 中根据对象位置和旋转来正确旋转 raycaster

    我有 8 个从 Object3D 到不同方向的光线投射器用于碰撞检测 我想根据对象旋转来旋转它们指向的方向 我已经遵循了解决方案here https github com mrdoob three js issues 1606 光线投射器开
  • 计算三角形内的格点

    我有一个大三角形的点 我们称之为 a b c a x y 等 现在我想统计这个三角形围成的区域内有多少个积分点 所以我首先看一下皮克定理 我考虑的第二种方法是生成一个以三角形的最大值 最小值为界的点列表 然后检查每个点是否位于三角形内部 我
  • 具有可移动和可旋转角色/物体/等的游戏中的 AABB

    我正在创建我的第一个 3D 游戏 但遇到了一些问题 我读到AABB https en wikipedia org wiki Minimum bounding box Axis aligned minimum bounding box相交以及
  • AndEngine:处理与 TMX 对象的碰撞

    我现在设法加载 tmx 地图 我想创建精灵无法移动的障碍 我像这样恢复了障碍 try final TMXLoader tmxLoader new TMXLoader this this mEngine getTextureManager T
  • 打砖块游戏中球和砖块之间的碰撞检测[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在打砖块游戏中如何检测球和砖块之间的碰撞 边界框碰撞 http www gamedev net reference articles
  • 凸多面体的质心

    我有一个封闭的凸多面体 它由凸多边形 面 数组定义 而凸多边形 面 由 3D 空间中的顶点数组定义 我试图找到多面体的质心 假设密度均匀 目前我用这个伪代码中的算法计算它 public Vector3 getCentroid Vector3
  • OnTriggerEnter() 未调用

    我有一个玩家 球体 和 4 个敌人 胶囊 所有敌人都添加了角色控制器 它们还有一个子 GameObject 它具有一个 RigidBody 无质量 无重力 和一个附加的 Box Collider 盒子碰撞器足够大 因此您可以看到盒子内部的球
  • 在 python pygame 中使用 cos() 和 sin() 以恒定速度从玩家发射粒子

    在 python pygame 中 我试图让我的玩家从玩家中心开始向鼠标方向发射粒子 class Particle def init self dx dy x y self dx dx self dy dy self x x self y
  • 用于移动物体的空间数据结构?

    我想知道处理大量移动对象 球体 三角形 盒子 点等 的最佳数据结构是什么 我试图回答两个问题 最近邻和碰撞检测 我确实意识到 传统上 像 R 树这样的数据结构用于最近邻查询 Oct Kd BSP 用于处理静态对象或很少移动对象的碰撞检测问题
  • WPF 路径冲突检测?

    I have two hexagon shapes
  • 厚壁二维迷宫中的碰撞检测

    我必须使用 Windows Forms 为学校制作一个游戏 我的游戏包括用户必须穿过迷宫 我试图阻止我的用户使用碰撞检测直接穿过墙壁 但由于用于表示墙壁的矩形形状不同而陷入困境 这是游戏的图像 https i stack imgur com
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行

随机推荐

  • 使用 getter/setter 与“告诉,不要问”?

    只讲原则 不问原则here http pragprog com articles tell dont ask当我使用 getter 或 setter 时 经常会粘贴到我身上 人们告诉我不要使用它们 该网站清楚地解释了我应该做什么和不应该做什
  • 如何通过深度链接传递数据?

    我的应用程序中有一个报价列表 每个列表项上都有一个共享按钮 当任何用户单击共享链接时 我正在使用深层链接打开我的应用程序的报价详细信息活动 我处于以下情况当有人点击链接时 我的详细信息页面活动就会被触发 但是我怎么知道 当有人点击共享深层链
  • C++ 检查大括号是否匹配

    我被要求作为一项额外的编程挑战 看看大括号是否在随机字符串或字符中匹配 如下所示 1 1 将返回 1 而 1 1 将返回 0 这是我到目前为止所拥有的 但它似乎没有做任何事情 任何帮助都会很棒吗 谢谢 bonus cpp include
  • Tkinter - 将文本插入画布窗口

    我有一个 Tkinter 画布 其中填充了文本和画布窗口或小部件 使用create text and create window方法 我放置在画布上的小部件是文本小部件 我想在创建和放置它们后将文本插入其中 我不知道如何做到这一点 如果可能
  • 如何对数据框中的列进行重新排序?

    如何更改此输入 顺序为 时间 输入 输出 文件 Time In Out Files 1 2 3 4 2 3 4 5 对于此输出 顺序为 时间 输出 输入 文件 Time Out In Files 1 3 2 4 2 4 3 5 这是虚拟 R
  • 使用 urllib 发出 post 请求

    我正在尝试向 API 提供商提出请求 curl https api infermedica com dev parse X POST H App Id 4c177c H App Key 6852599182ba85d70066986ca2b
  • 如何将第三方 javascript 库与 ionic4 和电容器一起使用?

    使用 Ionic 4 Angular 应用程序和 Capacitor 安装第三方 javascript 库的正确方法是什么 我尝试安装克鲁克图书馆 https github com jackedgson crunker如下 npm inst
  • Angular 2 中不同页面的多种布局

    我有一个登录页面 只有 2 个输入 无页眉 无页脚 无侧边栏 当用户登录时 他应该导航到带有页眉 页脚和右侧导航栏的页面 内页唯一改变的是右侧内容 import Component from angular core import View
  • Android Studio 中相对布局问题中按钮顶部的进度条

    好吧 这是一个奇怪的问题 我希望有人能向我解释一下 我有一个自定义按钮布局 它创建一个按钮 按钮中间有一个圆形进度条 我的 XML 代码如下 然而我无法解决的是ProgressBar似乎出现在按钮后面 如果我将按钮背景设置为透明以外的任何内
  • Spring Boot 组件扫描不起作用

    我创建了一个示例 Spring Boot 应用程序 当服务类全部位于一个包中时 该应用程序运行得非常好 但如果服务类引用不同包中的另一个服务类 那么我会收到 BeanCreationException 应用程序的代码如下 主程序 java
  • GLEW:Apple Mach-O 链接器 (Id) 错误

    我试图在我的 Xcode 项目中使用 glew 但我得到了这个 Apple Mach O Linker Id Error Undefined symbols for architecture x86 64 我正在使用从他们下载的最新版本的g
  • Protocol buffers 从原始消息中检测类型

    是否可以检测原始协议缓冲区消息的类型 以字节 为单位 我遇到的情况是端点可以接收不同的消息 并且我需要能够在反序列化之前检测到类型 我正在使用 protobuf net 您无法单独检测类型 因为 protobuf 规范不会为此向流添加任何数
  • 如何使用presto查询hive数据

    我刚刚安装了 presto 当我使用 presto cli 查询 hive 数据时 出现以下错误 presto server node6 8080 catalog hive schema default presto default gt
  • Xcode 9 - 无法附加到 pid 进行框架单元测试

    使用时间机器从一台 Mac 迁移到另一台 Mac 后 我收到以下错误 无法附加到 pid 确保 项目标题 尚未运行 并且 系统用户名 有调试权限 仅当运行 任何 框架项目的单元测试时才会发生该错误 在模拟器和设备上运行应用程序效果很好 为应
  • 在 C# 中从 LINQ 提取 SQL 列扩展属性

    我有一个 SQL 表 每列都有扩展属性 有没有办法使用 Linq2SQL 从 C 中的 LINQ 访问这些 像 MS Description 之类的东西 不 据我所知 您可以编写一个与数据库中的存储进行对话的 SP 获取数据库对象名称和列名
  • 找不到 Storm 日志查看器页面

    我可以在多租户集群中提交拓扑作业 作业正在运行 但是 日志查看器页面不可用 有什么办法可以解决这个问题吗 在单击之前您需要启动日志查看器topology port查看日志查看器 要启动日志查看器 请运行 storm logviewer和你跑
  • 从二维列表中获取唯一元素

    我有一个二维列表 我像这样创建 Z1 0 for x in range 3 for y in range 4 然后我继续填充这个列表 这样Z1看起来像这样 1 2 3 4 5 6 2 3 1 2 5 1 我需要提取unique 1x3要点Z
  • 更改ios8扩展导航栏颜色

    我正在开发 iOS8 应用程序扩展 照片编辑扩展 我尝试过这些方法来更新导航栏颜色 但失败了 UINavigationBar appearance setBarTintColor UIColor yellowColor UINavigati
  • 如何用值向量填充索引矩阵

    我有一个矩阵 m idx 其中包含我想要索引的向量的位置元素 gt m idx 1 2 3 4 5 1 1 2 3 4 5 2 3 4 5 6 7 3 5 6 7 8 9 假设 x 是我的向量 x lt c 9 3 2 5 3 2 4 8
  • 2D 物理引擎:弹跳球与非弹性碰撞不会停止

    我用 Java 创建了一个简单的 2d 物理引擎 它使用圆形射弹和直墙 目前 对于每一帧 每个射弹的位置都会提前velocity 1 fps 之后速度每帧更新一次 碰撞检测使用先前位置和当前位置以点斜率形式定义一条线 检查该线是否与墙壁相交