对推力从当前速度矢量到目标矢量的平滑变化进行编程

2024-02-05

TL;dr:“我不确定如何计算一个矢量与另一个矢量之间的推力的平滑过渡。”

我正在编写一个简单的游戏,敌人在开放空间(没有墙壁)中追赶玩家。我独立计算敌人的 x 和 y 速度,如果敌人朝着玩家的方向前进,则加速它们;如果敌人走错路,则快速减慢它们(例如 EnemyVelocity.x > 0 & player.x

虽然试图躲避敌人的游戏玩法非常有趣,但我希望让敌人使用适当的物理行为。我目前正在做的是让敌人根据他们和玩家之间的角度设置他们的推力(想想宇宙飞船),并让他们的推力加速到最大速度(计算 EnemyVelocity 三角形的 c 边)。一旦发生这种情况,我不确定让推力自行调整的最佳方法。如果我没有保留最大速度,敌人会很好地加速,但很容易超过玩家,然后需要很长时间才能获得足够的动量返回玩家的方向。

我想要发生的是让敌人在接近玩家的路上不断调整他们的速度,瞄准他们所在的任何地方(我不希望他们预测你会在哪里)。然后,当它们错过玩家时,我希望使用相同的推力和加速度公式来重新调整它们的速度并将它们发送回玩家处。

我认为这将涉及两个向量:一个是敌人当前正在行进的向量,另一个是敌人想要行进的向量(将把他们直接带到玩家那里的向量)。我不知道如何计算一个矢量与另一个矢量之间的推力的平滑过渡。

任何提示、公式或问题将不胜感激!谢谢堆栈溢出。


这一切都回到牛顿方程:

F = m * a
s = s_o + v * t + a * t^2 / 2
v = v_o + a * t

在这种情况下F是力(推力),a是加速度,并且m是船的质量。s是当前位置,s_o是原来的位置,v是速度,并且t是当前时间。

当然,这是沿着一条直线,所以如果你想转换为二维或三维,你必须做一些数学运算。F, s, v, and a都是向量,这意味着它们的方向同样重要。从技术上来说t也是一个向量,但由于时间通常只向一个方向移动,所以我们不必担心这一点。

2d:
F^2 = F_x^2 + F_y^2 (use Pythagorean theorem to split force into components)
F_x = m * a_x
F_y = m * a_y
s_x = s_o_x + v_x * t + a_x * t^2 / 2
s_y = s_o_y + v_y * t + a_y * t^2 / 2
v_x = v_o_x + a_x * t
v_y = v_o_y + a_y * t

3d:
F^2 = F_x^2 + F_y^2 + F_z^2 (surprisingly, this works)
F_x = m * a_x
F_y = m * a_y
F_z = m * a_z
s_x = s_o_x + v_x * t + a_x * t^2 / 2
s_y = s_o_y + v_y * t + a_y * t^2 / 2
s_z = s_o_z + v_z * t + a_z * t^2 / 2
v_x = v_o_x + a_x * t
v_y = v_o_y + a_y * t
v_z = v_o_z + a_z * t

现在要根据玩家的方向调整速度,您需要固定的总力(F)以改变您当前朝向玩家的速度。在物理学中,事情不会立即发生,但你的目标应该是最小化变化发生的时间(“t”)。

这为您提供了一个关于您当前位置的方程式((s_o_x,s_o_y) or (s_o_x,s_o_y,s_o_z))以及对手的当前位置或你的目标位置((s_x,s_y) or (s_x,s_y,s_z)),为您的目标速度(忽略加速度)。

v_x = (s_x - s_o_x) / t
v_y = (s_y - s_o_y) / t

v_x = (s_x - s_o_x) / t
v_y = (s_y - s_o_y) / t
v_z = (s_z - z_o_y) / t

我们可以用这个代替我们的另一个方程:

(s_x - s_o_x) / t = v_o_x + a_x * t
(s_y - s_o_y) / t = v_o_y + a_y * t

(s_x - s_o_x) / t = v_o_x + a_x * t
(s_y - s_o_y) / t = v_o_y + a_y * t
(s_z - z_o_y) / t = v_o_z + a_z * t

然后我们求解加速度(这与力有关,这正是我们要计算的)。

(s_x - s_o_x) / t^2 - v_o_x / t = a_x
(s_y - s_o_y) / t^2 - v_o_y / t = a_y

(s_x - s_o_x) / t^2 - v_o_x / t = a_x
(s_y - s_o_y) / t^2 - v_o_y / t = a_y
(s_z - z_o_y) / t^2 - v_o_z / t = a_z

将其代入力方程:

F_x = m * (s_x - s_o_x) / t^2 - m * v_o_x / t
F_y = m * (s_y - s_o_y) / t^2 - m * v_o_y / t

F_x = m * (s_x - s_o_x) / t^2 - m * v_o_x / t
F_y = m * (s_y - s_o_y) / t^2 - m * v_o_y / t
F_z = m * (s_z - z_o_y) / t^2 - m * v_o_z / t

现在解决t:

t = (-m * v_o_x +/- sqrt(m^2 * v_o_x^2 - 4 * F_x * m * (s_x - s_o_x))) / 2 / F_x
t = (-m * v_o_y +/- sqrt(m^2 * v_o_y^2 - 4 * F_y * m * (s_y - s_o_y))) / 2 / F_y

t = (-m * v_o_x +/- sqrt(m^2 * v_o_x^2 - 4 * F_x * m * (s_x - s_o_x))) / 2 / F_x
t = (-m * v_o_y +/- sqrt(m^2 * v_o_y^2 - 4 * F_y * m * (s_y - s_o_y))) / 2 / F_y
t = (-m * v_o_z +/- sqrt(m^2 * v_o_z^2 - 4 * F_z * m * (s_z - s_o_z))) / 2 / F_z

时代应该会聚,所以时代才会平等!这为我们提供了每个坐标(平面和球体)的方程组。请注意,有多个可能的值,但有些涉及虚数,因此您必须消除这些解决方案:

(-m * v_o_x +/- sqrt(m^2 * v_o_x^2 - 4 * F_x * m * (s_x - s_o_x))) / 2 / F_x
= (-m * v_o_y +/- sqrt(m^2 * v_o_y^2 - 4 * F_y * m * (s_y - s_o_y))) / 2 / F_y
F^2 = F_x^2 + F_y^2

(-m * v_o_x +/- sqrt(m^2 * v_o_x^2 - 4 * F_x * m * (s_x - s_o_x))) / 2 / F_x
= (-m * v_o_y +/- sqrt(m^2 * v_o_y^2 - 4 * F_y * m * (s_y - s_o_y))) / 2 / F_y
= (-m * v_o_z +/- sqrt(m^2 * v_o_z^2 - 4 * F_z * m * (s_z - s_o_z))) / 2 / F_z
F^2 = F_x^2 + F_y^2 + F_z^2

解出(F_x,F_y) or (F_x,F_y,F_z)坐标,您就获得了所需的力量。

如果您有任何疑问或发现我的数学错误,请告诉我。

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

对推力从当前速度矢量到目标矢量的平滑变化进行编程 的相关文章

  • 随着速度变化,速度表针规绕其中心旋转

    Hi all 我编写了一个应用程序 其中有一个速度计 其指针垂直设置为 90 度 我试图以每秒变化的速度绕其中心旋转指针 我在文本视图中显示变化的速度 从 0 到 120 随机 我正在从远程服务获取速度并显示在文本视图中 因此 当速度发生变
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 如何根据原始元素将向量中的元素替换为另一个元素[重复]

    这个问题在这里已经有答案了 请考虑以下程序 这是一个最小化的示例 所以不要纠结于我在这里尝试做的事情可以通过以下方式更好地实现 HashMap
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 数学 - 映射数字

    如何将 a 和 b 之间的数字线性映射到 c 和 d 之间 也就是说 我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字 但我需要广义的情况 我的脑子炸了 如果您的数字 X 位于 A 和 B 之间 并且您希望 Y 位于 C 和
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 在 Blackberry 4.2 JDE 上调用 atan 函数

    我需要从我的 Blackberry Java 应用程序计算反正切值 不幸的是 blackberry 4 2 api 没有 Math atan 函数 Blackberry JDE 4 6 版有此功能 但 4 2 版没有 有谁知道计算 atan
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 通过引用传递向量

    如果我在一个类中有一个对象向量 我想在另一个类中更改它 我会尝试通过引用传递所有信息 我究竟需要通过引用传递什么 向量 物体 两个都 本质上我要问的是 它们之间有什么区别 vector blah A reference to a vecto
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何计算在一定距离内达到一定速度所需的减速度?

    我已经尝试过典型的物理方程 但它们都不起作用 因为这些方程处理恒定的加速度 而我的方程需要改变才能正常工作 基本上 我有一辆车可以以很大的速度行驶 并且在到达路径终点时需要在给定的距离和时间内减速并停止 所以我有 V0 或当前速度 Vf 或
  • C++ Exp 与 Log:哪个更快?

    我有一个 C 应用程序 需要比较两个值并决定哪个值更大 唯一的复杂之处是一个数字在对数空间中表示 而另一个则不是 例如 double log num 1 log 1 23 double num 2 1 24 如果我想比较num 1 and
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用

随机推荐

  • 空文件构造函数既不是文件也不是目录

    以下两种创建文件的方法有什么区别 new File System getProperty user dir new File Java 将第一个识别为目录 第二个识别为目录既不是文件也不是目录 为什么会这样 Code public clas
  • MVC 3模型foreach过滤器

    我有以下剃刀语法 foreach var p in Model b p Age b 我想过滤 foreach 循环以仅查看 p City New York 的模型记录 我的语法会是什么样子 我希望我能正确解释这一点 Thanks forea
  • 在 iOS8 中:UIPopoverController PresentPopoverFromRect 不再适用于 keyWindow

    如标题所示 在 iOS8 中 UIPopoverControllerpresentPopoverFromRect 不再适用于 UIApplicationsharedApplication keyWindow iOS7下确实可以用 我验证了以
  • DB2 SQL 中的正则表达式

    除了使用 UDF 是否有对 DB2 9 7 的 REGEXP In SQL 支持 从 DB2 11 1 开始 有内置的正则表达式支持 其中一项新功能是REGEXP SUBSTR http www ibm com support knowle
  • 如何更改大屏幕的背景颜色?

    我想知道如何更改 jumbotron 类的背景颜色 它有一个默认值background color eee在 bootstrap css 中 我试图通过删除它并给出属性来覆盖none none important transparent进入
  • 使用 typescript 和 angular2 将图像上传到存储 blob

    我正在使用打字稿开发 Angular 2 应用程序 在我当前的项目中 我实现了将图像上传到天蓝色存储 blob 的功能 为此我点击了以下链接 http www ojdevelops com 2016 05 end to end image
  • 如何在 Pillow-Python 中使用流打开简单图像

    from PIL import Image image Image open image jpg file path io BytesIO image save file path JPEG image2 Image open file p
  • WCF 证书身份验证不起作用

    我已经构建了 WCF helloworld 客户端和服务器 我想在它们之间使用证书身份验证 我收到的错误是 调用者未经服务验证 我使用 makecert exe 创建了两个证书 客户端上的证书安装在 个人 受信任的人 和 第三方根证书颁发机
  • 如何使用 Azure Function 中的 Azure 托管身份通过触发器访问服务总线?

    我在 Azure 中创建了一个 ServiceBus 命名空间 以及一个主题和订阅 我还有一个简单的 Azure 版本 1 函数 可以触发 ServiceBus 中收到的主题 如下所示 FunctionName MyServiceBusTr
  • Django自定义注解功能

    我想使用 Django 构建一个简单的热门问题列表 我有一个function https web archive org web 20150526231733 http amix dk blog post 19588评估 hotness 每
  • 简单的C程序

    该程序基于K R中输入 输出部分的程序 include
  • 输入字符时无限循环[重复]

    这个问题在这里已经有答案了 我试图限制用户仅输入 1 或 2 int ch do cout lt lt Enter n cin gt gt ch switch ch case 1 cout lt lt 1 break case 2 cout
  • 在后台加载 MKMapView 并从中创建 UIImage (iPhone 和 iPad)

    我遇到一种情况 我需要一种加载具有多个覆盖层的 MKMapView 的方法 此地图视图不应显示在屏幕上 我需要加载它的唯一原因是为了从地图创建图像以供在其他地方使用 我在网上查了一下 但没有找到解决问题的方法 请问有人可以帮我吗 这是我到目
  • 如何确保队友不会通过重写历史来搞砸 git 存储库?

    常见的建议似乎是不要在提交提交后重新设置基准 重置或执行其他 历史重写 操作 建议在您自己的机器上执行所有这些类型的切片和切块 但一旦您推送了它 就顺其自然 这是有道理的 但如何执行这项政策呢 对于多个开发人员 我们如何确保没有人这样做 似
  • 仅在调试构建变体中包含 Stetho

    我知道我可以使用debugCompile只拉入一个dependency为了debug build 有没有一种好的 简化的方法来做到这一点code initialization这也是必需的吗 如果没有依赖项 其他变体将无法编译 检查 Tani
  • 如何使用 PHP 混淆 JavaScript? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 例如 我如何混淆以下示例代码 The code below will write to a heading and to a paragr
  • TIdCmdTCPServer 和 TIdCmdTCPClient 应该一起使用吗?

    我正在尝试编写一个服务器和一组与服务器通信的客户端 服务器将维护不同客户端的状态 并允许它们在状态发生变化时向中央服务器发出警报 专业客户端将允许控制其他连接的客户端 我将服务器作为 TIdCmdTCPServer 客户端 目前 使用 TI
  • Kronecker 产品 pandas 数据框

    我有两个数据框 A B 0 1 2 1 1 2 2 1 2 and C D 0 1 4 1 2 5 2 3 6 我需要叉积 AC AD BC BD 的平均值 因此我希望能够计算 AC AD BC BD 0 1 4 2 8 1 2 5 4 1
  • Sinon.js-试图监视 console.log 但它已经被包装了

    我是编写节点测试的新手 这是我尝试编写的 gulp 插件的第一个单元测试 var chai require chai var spy require chai spies var es require event stream var Fi
  • 对推力从当前速度矢量到目标矢量的平滑变化进行编程

    TL dr 我不确定如何计算一个矢量与另一个矢量之间的推力的平滑过渡 我正在编写一个简单的游戏 敌人在开放空间 没有墙壁 中追赶玩家 我独立计算敌人的 x 和 y 速度 如果敌人朝着玩家的方向前进 则加速它们 如果敌人走错路 则快速减慢它们