【问题标题】:Particle Dynamics粒子动力学
【发布时间】:2018-02-22 16:06:42
【问题描述】:

我正在为 3D 空间中的粒子建模。

{0} 粒子在时间 t0 从已知位置 P0 以速度 V0 开始。速度是使用其已知的 P-1 在 t-1 的先前位置来计算的。

{1} 粒子的目标是在 t1 以已知速度 V1 到达 P1。

{..} 粒子尽可能快地移动,而不会受到一组约束的约束(C1 连续),这些约束独立地限制沿 x、y 和 z 的加速度。沿 x、y 和 z 的最大加速度/减速度是已知的,它们是 Xa、Ya 和 Za。加速度沿 x、y 和 z 的最大变化率由 Xr、Yr 和 Zr 定义。

{n} 在未知数量的时间步之后,它会在某个时间(比如 tn)以 Vn 的速度到达 Pn。

{n+1} 它在 tn+1 处移动到 Pn+1。

我的问题是计算从 P0 到 Pn 的过渡的最短时间,并生成其中间位置和速度方向。次要目标是平稳加速,而不是施加会导致颠簸的加速。

目前的方法:

  1. 找到从起点 P0 到终点 Pn 对齐所需时间最长的维度 {x、y 或 z}。这将是关键维度,将决定总时间。这相当简单,我可以为此写一些东西。

  2. 在所有维度上平滑插值,从 P0 到 Pn 没有抖动,以使 Pn 处的速度符合预期。我不确定,如何处理。

任何已经这样做的输入/物理引擎都会很有用。这是一个商业项目,我不能依赖具有限制性许可证的大型 3rd 方库。

注意:P0 和 Pn 处的粒子几乎没有或没有加速度。

【问题讨论】:

  • 您研究过变分法吗?可以用来解决类似的问题
  • 所以如果初始状态已知,并且速度/加速度是从前一个状态计算出来的,那么路径不是 100% 确定的吗?如果是这样,您如何定义“最短”时间?另外,如果时间步数未知,你怎么知道Pn
  • @meowgoesthedog 加速度不是从以前的状态确定的。
  • 这里的中间位置显然是未知的。据我了解,问题是找到每个点的加速度,这会导致从 (P0, V0) 到 (Pn, Vn) 的最短路径。
  • @Ram,我在动力学课程中学习了基础知识。不幸的是,我没有链接,因为课程主要是在黑板上完成的。维基百科给出了一个不错的概述,但没有关于如何做到这一点

标签: algorithm game-physics


【解决方案1】:

如果我理解正确,你有一个点(P0, V0),与V0 = P0 - P-1,和一个点(Pn, Vn),与Vn = Pn - Pn-1,你想通过调整每个时间步的加速度来找到最少的中间点.

让我们在ti 处定义加速度:Ai = Vi - Vi-1,用abs(Ai) <= mA。在这里,由于问题与轴无关,abs 是成员的绝对值而不是范数(或向量幅度),mA 是最大加速度向量,在每个维度上都是正的。让我们也考虑一下Pn > P0(成员方面)。

由此,我们得到Vi = Vi-1 + AiPi = Pi-1 + Vi-1 + Ai

如果您需要以尽可能快的方式从某个点移动到另一个点,那么显而易见的事情是,无论初始速度如何,都尽可能加速,直到您达到目标。但是,由于您的问题是离散的并且您有一个终端速度Vn,因此使用该方法可能会导致过远并且终端速度不同。

但是,您可以从终点开始反向执行相同的操作。如果您同时从两个点开始,您将在每个维度上创建两条相互交叉的路径(不一定在 3D 中交叉,但在每个维度中,两条路径的相对方向会在某个“交叉”点发生变化)。

让我们举一个一维的例子。 (P0, V0) = (0, -2)(Pn, Vn) = (35, -1)mA = 1
第一条路径,Ai = mA,如下所示:

(0, -2) -> (-1, -1) -> (-1, 0) -> (0, 1) -> (2, 2) ->
(5, 3) -> (9, 4) -> (14, 5) -> (20, 6) -> (27, 7) -> ...

第二条路径,Ai = -mA,但相反,如下所示:

(35, -1) <- (36, 0) <- (36, 1) <- (35, 2) <- (33, 3) <-
(30, 4) <- (26, 5) <- (21, 6) <- (15, 7) <- ...

您可以看到路径在 20 到 21 之间以相同的速度相交。这为您提供了所需路径中最快的加速和减速部分,但这两个部分没有连接。但是,通过找到相同速度的最近点很容易将它们连接起来;让我们将这些点称为PqPr。在这里,Pq = (20, 6)Pr = (21, 6)。由于该速度是在当前点和先前点之间计算的,因此请取Pq 之前的点(在示例中为Pq-1(14, 5))和点Pr,然后尝试将它们连接起来。

如果Pq &gt;= Pr &gt;= Pq - 2mA,那么您可以直接将它们连接起来,将Pq-1保持不变,将PrVr = Pr - Pq-1连接起来。

否则,取Pq-2Pr-1(其中Vr-1 = Vr - mA,因为它是相反的)并尝试通过添加中间点来连接它们。由于这些点的速度差为mA,因此您只能搜索具有相同速度Vs 的中间点,使得Vq-2 &lt;= Vs &lt;= Vr-1

如果还是找不到解决办法,就拿Pq-3Pr-2,用更多的中间点重复这个过程。

在我举的例子中,Pq &lt; Pr,所以我们必须尝试使用​​Pq-2 = (9, 4)Pr-1 = (26, 5)。我们可以用 3 个点的序列连接它们,例如(9, 4) -&gt; (13, 4) -&gt; (17, 4) -&gt; (21, 4) -&gt; (26, 5)

无论如何,此方法将为您提供最少的中间点,这意味着P0Pn 之间的最快路径。

如果您想减少 jerk,那么您可以忘记之前计算的点,并使用您现在知道的最小点的 number 个进行插值。

【讨论】:

  • 这个答案让我想起了两个用于此的答案:stackoverflow.com/questions/40623315/…
  • @Nelfel,在你的方法中,每个暗淡都会产生一个具有不同步数或 n 的解决方案。我不清楚这如何收敛到一组点和速度。
  • 那么你需要更清楚地定义你的问题。你还没有提到最后一个要求。
  • 这不是问题,除非您希望加速有点连续。如果Vn 接近于想要的Vn+1,那么使An+1 接近于零满足位置和速度方面的最终条件。如果您不能从An = -mA 转到An+1 ≈ 0,那么您的问题描述中缺少一个约束。加加速度值有限制吗?这对应于离散点的“连续”加速度。
  • 您的回答产生了一组非常生涩的临时点,与我想要的相差甚远。既然我明白了我想要从实施这种方法中得到什么,我会投票给你的答案。但这仍然不是理想的方法。我已经根据我的理解更新了这个问题。
【解决方案2】:

在尝试了一些想法之后,我想出了另一个解决方案,如果做得正确,比我之前的答案更准确,可能更快。然而,它相当复杂,需要相当多的数学,虽然不是很复杂的数学。此外,这是一项正在进行的工作:我仍在调查某些领域。尽管如此,从我的尝试来看,它确实已经产生了非常好的结果。

问题

定义和目标

在整个答案中,p[n] 指第 n 个点的位置,v[n] 指它的速度,a[n] 指它的加速度,j[n] 指它的 jerk(加速度的导数)。第 n 个点的速度只取决于它的位置和前一个点的位置。加速度和加加速度也类似,但分别是速度和加速度。

我们有一个起点和一个终点,分别是p[0]p[n],两者都有关联的速度v[0]v[n]。目标是将n-1 与任意n 点放在中间,这样,沿X、Y 和Z 轴,这些点(以及p[n])处的加速度和加加速度的绝对值) 低于某些限制,分别为 aMaxXaMaxYaMaxZ 用于加速,jMaxXjMaxYjMaxZ 用于混蛋。

我们想要找到的是所有i ∈ [1; n-1]p[i] 的值。因为p[i] = p[i-1] + v[i],这与查找v[i] 相同。同理,v[i] = v[i-1] + a[i]a[i] = a[i-1] + j[i] 也与找到a[i]j[i] 相同。

a[0]a[n+1] 假定为零。

观察和简化

由于问题的约束与维度无关,我们可以分别对三个维度分别求解,只要每种情况下得到的点数相同即可。因此,我只打算解决问题的一维版本,使用aMaxjMax,与轴无关。

*[WIP]* 先确定最坏的情况,然后再解决其他情况,知道点数。

两个给定点的实际位置无关紧要,重要的是它们之间的相对距离,我们可以定义为P = p[n] - p[0]。我们还要定义范围R = [1; n]R* = [1; n+1]

由于问题的离散性,我们可以得到以下方程。请注意,∑{i∈R}(x[i])i∈R 的所有 x[i] 的总和。

Ⓐ ∑{i∈R}(v[i]) = P
Ⓑ ∑{i∈R}(a[i]) = v[n] - v[0]
Ⓧ ∑{i∈R*}(j[i]) = 0

Ⓧ来自a[0] = a[n+1] = 0的假设。
从Ⓐ和v[i] = v[i-1] + a[i], i∈R,我们可以推断:

Ⓒ ∑{i∈R}((n+1-i)*a[i]) = P - n*v[0]

同理,从Ⓑ、Ⓒ、a[i] = a[i-1] + j[i], i∈R,我们可以推导出:

Ⓨ ∑{i∈R}((n+1-i)*j[i]) = v[n] - v[0]
Ⓩ ∑{i∈R}(T[n+1-i]*j[i]) = P - n*v[0]

这里,T[n] 是第 n 个三角形数,由 T[n] = n*(n+1)/2 定义。

方程Ⓧ、Ⓨ和Ⓩ是下一部分的相关方程。

方法

为了最小化n,我们可以从n (1, 2?) 的小值开始,并找到解决方案。然后,如果max{i∈R}(abs(a[i])) &gt; aMaxmax{i∈R}(abs(j[i])) &gt; jMax,我们可以递增n 并重复该过程。

*[WIP]* 找到n 的下限以避免对n 的小值进行不必要的计算。或者估计n的正确值,通过测试解决方案确定。

找到解决方案需要找到所有i∈R*j[i] 值。我还没有找到j[i] 的最佳形式,但是定义了j*[i]r[i]s[i] 这样
j[i] = j*[i] + r[i]v[0] + s[i]v[n]
效果很好。

*[WIP]* 为j[i]找到更好的形式

通过这样做,我们将n-1未知数(j[i], i∈R,注意j[n+1] = -∑{i∈R}(j[i]))转换为3(n-1)更容易找到未知数。以下是我们现在可以从Ⓧ、Ⓨ和Ⓩ推断出的一些内容。

∑{i∈R*}(r[i]) = 0
∑{i∈R*}(s[i]) = 0
∑{i∈R}((n+1-i)*r[i]) = -1
∑{i∈R}((n+1-i)*s[i]) = 1
∑{i∈R}(T(n+1-i)*r[i]) = -n
∑{i∈R}(T(n+1-i)*s[i]) = 0

提醒一下,这里有Ⓧ、Ⓨ和Ⓩ。

Ⓧ ∑{i∈R*}(j[i]) + j[n+1] = 0
Ⓨ ∑{i∈R}((n+1-i)*j[i]) = v[n] - v[0]
Ⓩ ∑{i∈R}(T[n+1-i]*j[i]) = P - n*v[0]

现在的目标是找到足够的特殊情况来帮助我们确定这些未知数。

特殊情况

v[0] = v[n] = 0

通过使用 jerk 的值,我观察到将所有 j[i], i∈R* 作为抛物线的一部分会产生极好的结果,以最小化 jerk 和加速度。虽然它不是最合适的,但我还没有找到更好的。

jerk 值来自抛物线的直觉是,如果 position 的值遵循多项式,那么它的次数必须至少为 5,并且可以为 5。如果你考虑一下,这更容易理解遵循 4 次多项式的速度值。设置v[0]v[n] 的约束条件a[0] = a[n+1] = 0,并且它对[0; n] 的积分必须等于P,这个多项式的次数必须至少为4。这对于连续和离散情况都成立.最后,似乎取最小的度数会导致更平滑的混动以及更容易计算。

这是一个连续情况的示例,其中位置为紫色,速度为蓝色,加速度为黄色,加加速度为红色。

如果你想玩这个,这里是如何根据np[0]p[n]v[0]v[n] 定义位置曲线(其他的只是导数)。

a = (-3(v[n]+v[0]) + 6(p[n]-p[0])) / n^5
b = (n(7v[n]+8v[0]) - 15(p[n]-p[0])) / n^4
c = (-n(4v[n]+6v[0]) + 10(p[n]-p[0])) / n^3
p[x] = ax^5 + bx^4 + cx^3 + v[0]x + p[0]

如果v[0] = v[n] = 0,那么j[i] = j*[i], i∈R*。这意味着值j*[i] 遵循二次多项式。所以我们想找到αβγ,使得Ⓟ成立。

Ⓟ j*[i] = αi^2 + βi + γ, i∈R*

从 Ⓧ、Ⓨ 和 Ⓩ 遵循这些等式。

α*∑{i∈R*}(i^2) + β*∑{i∈R*}(i) + c*∑{i∈R*}(1) = 0
α*∑{i∈R}((n+1-i)*i^2) + β*∑{i∈R}((n+1-i)*i) + c*∑{i∈R}(n+1-i) = 0
α*∑{i∈R}(T(n+1-i)*i^2) + β*∑{i∈R}(T(n+1-i)*i) + c*∑{i∈R}(T(n+1-i)) = P

求解这个系统得到αβγ,它们可以与Ⓟ一起使用来计算j*[i], i∈R*。注意j*[i] = j*[n+2-i],所以只需要计算上半部分。

v[0] = v[n] = 1/n

如果v[0] = v[n] = 1/n,那么j[i] = 0, i∈R*。这意味着 Ⓠ 成立。

Ⓠ r[i] + s[i] = -n*j[i], i∈R*

v[0] = 0, j[i∈L] = J, j[h] = 0, j[i∈U] = -J

LU 分别是R* 的下半部分和上半部分,如果n+1 是奇数,h 是两者之间的值。换句话说:

if n is odd:
L = [1; (n+1)/2]
U = [(n+3)/2; n+1]
if n is even:
L = [1; n/2]
h = n/2+1
U = [n/2+2; n]

这种特殊情况对应于p[0]p[n] 之间的最大整体加速度,同时最小化abs(j[i]), i∈R*。在这里,Ⓩ 给出了以下等式。

∑{i∈R}(T[n+1-i]*j[i]) = P
∑{i∈L}(T[n+1-i])*j[1] + ∑{i∈U}(T[n+1-i])*j[n+1] = P
j[1] = P / [ ∑{i∈L}(T[n+1-i]) - ∑{i∈U}(T[n+1-i]) ]

这给出了j[1],因此每个j[i], i∈R*。然后我们可以使用Ⓨ计算v[n]

拼凑起来

对于v[0]v[n]P 的某些值,每种特殊情况都为我们提供了一种形式的关系
αj*[i] + βr[i] + γs[i] = δ
通过处理三种特殊情况(假设它们不相似,意味着不给出相同的关系),我们有一个由三个方程组成的系统,一旦求解,就会给出 j*[i]r[i]s[i] 的值:全部i∈R*

因此,对于n 的每个值,我们可以根据v[0]v[n]P 计算j[i] 的值。它们可以预先计算,这意味着测试它们以获取n 的任何值都可以非常快。因此,只要我们预先计算出足够大的值 n .

【讨论】:

    【解决方案3】:

    回答

    我建议你采取以下功能:

    X(n) = Xstart + Vxstart n+ (-6xstart+3Vxstart sub>+6xend-3Vxend+c/2) n^2 + (8xstart+3Vxstart-8xend+5Vxend-c) n^3 + (-3Xstart-Vxstart+ 3xend-2Vxend+c/2) n^4

    (对于每个坐标 X,Y,Z)

    这是一些图表,我为每个样本取了 c=3:

    对于 xstart=1、vstart=1、xend=3、vstart=-2,这给出:

    X(n)= 1 + n + 16 n^2 -25 n^3 + 10 n^4

    对于 xstart = -4,vstart =-4,xend = 4,vend = 0,这给出:

    (-4 -4n +61n^2 -78n^3 + 29yn^4)

    其中 c 是从 0.1 到 5 的数字,由您决定,c 越高,函数到达该点的速度越快(但如果 c > 4,它可能不得不返回)。 (见下图)。

    多项式来自以下计算:其中 a=x0,b=v0,c=xe,d=v2,e=魔常数

    说明

    根据 Nelfeal 的回答,我的想法是尝试用多项式解决给定的问题。

    我们可以将问题更改为定义一个新的轴,该轴进入 P[last]-P[0],以将问题减少到维度 1。

    我们可以用连续数学代替离散数学(例如用函数代替序列)来思考问题,然后回到离散世界,这只是连续数学的一个特例。

    我们可以改变时间和空间的单位,使时间为1,距离为1,这样问题就简化为

    找到满足以下条件的函数?:

    1. ?(0) = 0 和?(1) = 1
    2. ?'(0) = 0 和?'(1) = 0
    3. 对于 x∈ℝ |?''(x)|

    我们有

    P(X) = ∑{i∈ℕ} Ai Xi

    P'(X) = ∑{i∈ℕ} (i+1) Ai+1 Xi

    P''(X) = ∑{i∈ℕ} (i+2)(i+1) Ai+2 Xi

    我们需要:

    1. P(0) = 0
    2. P(1) = 1
    3. P'(0) = 0
    4. P'(1) = 0
    5. -c

    这意味着:

    a0 = 0(从 1.) a1 = 0(从 3.)

    P(1) = ∑{i∈ℕ} Ai = 1

    P'(1) = ∑{i∈ℕ} (i+1) Ai = 0

    P''(x) = ∑{i∈ℕ} (i+2)(i+1) Ai Xi in [-c,c ]

    第三个等式是最复杂的,可以简化为 P(1) = c。

    我们将有 c 变化,看看有什么变化。

    对一个 3x3 矩阵求逆后,我们得到以下结果:

    P(x) = (c/2+6) x^2 - (c+8) x^3 + (c/2+3) x^4

    对于 c=0.15,这给出:

    对于 c=1,这给出:

    对于 c=4,我们看到反弹:

    如果我们将 c 从 0.1 取为 6,我们会得到以下 3d 图:

    请注意,我们已经解决了 4 次多项式的问题,但您可以在更高的次数(如果您愿意,最多 10 次)上执行相同的操作,以在您的函数中获得更多可能性。

    【讨论】:

      猜你喜欢
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多