【问题标题】:Plotting the course of a boat based on rotation and speed using vectors使用向量根据旋转和速度绘制船的航向
【发布时间】:2012-08-13 15:01:49
【问题描述】:

我有一个海战游戏,我试图根据速度和旋转速度向我的用户展示他的船将采取的路线。即,我尝试实现类似于下图的效果。正如你所看到的,一艘能够走红色航线的船,其旋转速度比蓝色的快。现在,我不知何故需要找到一种方法来根据速度、旋转速度和所需方向计算最终的运动矢量,但我还不知道怎么做。任何想法表示赞赏!

【问题讨论】:

  • 船是保持匀速行驶,还是以最短的路线为目标,还是以最快的速度到达目的地?
  • 可能的最短路径(给定旋转速度和速度,它们是恒定的)
  • 路径是圆弧,你想计算哪条圆弧通过具有特定半径的起点和终点。对吗?

标签: math language-agnostic vector linear-algebra


【解决方案1】:

我猜因为这是一个游戏而不是一个精确的海上模拟,所以你只是在寻找一种方法来创建一个轨迹图。

这最好使用简单的迭代/参数化方法来处理,假设时间步长足够小,它会形成一条不错的曲线。请记住,曲线没有简单的函数形式,它必须由点数组表示。

伪代码(Matlab / Octave 样式语法)

Given: StartX, StartY, StartHeading, EndX, EndY, MaxSpeed, MaxRotationRate
-----------------------------------------------------------------------------

MaxDisplacement = Max Speed * deltaT
MaxRotation = MaxRotationRate * deltaT

CurrentX = StartX
CurrentY = StartY
CurrentHeading = StartHeading

Trajectory = []

While [CurrentX, CurrentY] != [EndX, EndY]
    % Store the Current Position by appending to results
    Trajectory = [Trajectory; [CurrentX, CurrentY, CurrentHeading]]

    % Get the vector form of the current heading and the straight-line path
    HeadingVector = [cos(CurrentHeading),sin(CurrentHeading)]
    DirectVector = [EndX - CurrentX, EndY - CurrentY]
    
    % Some simple vector math here using dot products and cross products
    RequiredRotation = arccos(dotP(HeadingVector,DirectVector)/abs((HeadingVector)*abs(DirectVector))
    RotationDirection = sign(crossP(HeadingVector,DirectVector))
    
    % Clip the rotation rate based on the maximum allowed rotation
    if RequiredRotation > MaxRotation
        RequiredRotation = MaxRotation
    
    % Update the position based on the heading information
    CurrentX = CurrentX + cos(RequiredRotation) * MaxDisplacement
    CurrentY = CurrentY + sin(RequiredRotation) * MaxDisplacement
    CurrentHeading = CurrentHeading + RequiredRotation * RotationDirection
Loop

Return Trajectory

此代码在到达端点时存在一些问题,我将由您决定如何最好地处理它。两个明显的问题:船将超出所写的端点,因为船总是以最大速度移动;如果终点太近而无法驶入,船可能会卡在“轨道”点上。对此有多种解决方法,这取决于您希望您的游戏如何处理此问题。

几何解

另一种方法是做一些更硬核的几何计算(精确解)。

首先,您需要计算转弯半径而不是最大转弯率。从那里,给定船的当前位置和航向,可以确定船可以采取的两个“转弯圈”。选择正确的中心点C,然后在圆上计算正确的切点T。最终路径将是一条弧线(起点、终点、中心),然后是一条线段。

【讨论】:

  • 非常感谢。这很有帮助!我是一个真正的向量新手,我在某种程度上很接近,但没有意识到我必须保持坐标和方向,我试图只用向量的方向和大小来做,但这样更容易.我不明白的唯一一行是RequiredRotation = arccos(dotP(HeadingVector,DirectVector)/abs((HeadingVector)*abs(DirectVector)),但我会深入研究它。谢谢!
  • @ValentinRadu,我还添加了对问题的几何(精确)解决方案的非常粗略的描述。
  • 点积角度计算说明here
【解决方案2】:

这可能不是你的确切答案,但我相信你想要的公式是这样的:

这里U是物体的四速,Γ代表坐标系的64个连接系数或Christoffel符号。请注意,希腊下标有四个可能的值,即时间轴为 0,空间坐标轴为 1-3,并且重复索引用于表示该索引的所有值的总和。

这组四个方程的左侧(一个用于类时和三个类空间的索引 λ 值)是物体的适当加速度 3 向量与从有利位置看到的零时间分量相结合参考或簿记员坐标系。右手边的第一项列出了物体四速 U 的类时间(能量/mc)和类空间(动量/m)分量在旅行钟上每单位时间 τ 变化的速率。 /p>

如您所见,它不是 QUITE 线性代数。 :)

【讨论】:

  • 老实说,我什么都不懂,这远远超过我的物理/数学水平。也许我会理解这样做的算法,但是公式......哦上帝:)另外,我绝对不想让它那么复杂(也就是计算能量动量,这超出了我的范围)。我尽量保持简单,速度是恒定的,加速度是恒定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2016-12-08
  • 2017-12-02
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多