Math 计算对象的移动方向

Math 计算对象的移动方向,math,Math,给定多维空间和目标位置以及运动对象的速度,如何确定对象是否朝着正确的方向移动,从而接近目标 例如,如果我有一个三维空间,我有一个期望的目标位置[0,0,100],我知道我的运动对象以[1,2,4]的速度运动,如何计算运动方向和期望方向之间的差异 请注意,我没有使用unity您提出的问题更像是一个数学问题,而不是一个编程问题。我相信这仍然是一个主题,但这意味着我们将有更多的数学解决方案。我假设你可以使用的数学函数很少 安装程序 (注意:这将涉及向量。如果变量为粗体,则将其视为向量。) 因此,我们希

给定多维空间和目标位置以及运动对象的速度,如何确定对象是否朝着正确的方向移动,从而接近目标

例如,如果我有一个三维空间,我有一个期望的目标位置[0,0,100],我知道我的运动对象以[1,2,4]的速度运动,如何计算运动方向和期望方向之间的差异


请注意,我没有使用unity

您提出的问题更像是一个数学问题,而不是一个编程问题。我相信这仍然是一个主题,但这意味着我们将有更多的数学解决方案。我假设你可以使用的数学函数很少

安装程序 (注意:这将涉及向量。如果变量为粗体,则将其视为向量。)

因此,我们希望达到Pf=[0,0100]单位。我们是以π为单位的。我们有一个v=[1,2,4]单位/帧的速度

如果我理解正确,我们想知道两件事:

  • 我们能击中目标吗
  • 如果没有,我们还有多远?(也就是说:我们要去的地方和我们想去的地方之间的夹角是多少?)
  • 执行 我们只需要解决第二部分,然后我们就可以根据这个解决方案计算出第一部分。(稍后我将自己解决第一部分。)

    为了解决第二部分,我们最好的朋友是!你的问题是围绕向量展开的,点积可以告诉我们两个向量的关系有多密切

    首先,我们需要两个受害者。我们已经有了一个:v,流速。然后,假设我们有Pi,我们可以找到所需的路径,即PiPf之间的路径。我将其称为sf=Pf-Pi

    (由于缺少用于点积的字符,点(mn)将代表mn的点积)

    首先,我们将从Wikipedia文章中给出的点产品的一个定义开始:

    (等式1)
    点(vsf)=|

    快速提示:双栏表示向量分量的平方和,或

    ||v||=sqrt(vx2+vy2+vz2)

    为了使这更容易处理,我假设我们已经提前计算了震级,所以我们可以把它们留在方程中

    无论如何,(Equ 1)是不够的!我们不知道Ɵ或点(vsf),那么现在呢

    在维基百科的第一篇文章中,有另一个关于点积的定义。事情是这样的:

    (等式2)
    点(vsf)=vxsfx+vysfy+vzsfz

    我们知道所有这些价值观!因为(eq1)等于(eq2),我们可以把这两个方程结合起来。这让我们:

    ||v| | | |sf| | cos(Ɵ)=vxsfx+vysfy+vzsfz

    啊,把事情弄得乱七八糟

    cos(Ɵ)=(vxsfx+vysfy+vzsfz)/v
    …或…
    Ɵ=cos-1((vxsfx+vysfy+vzsfz)/(|v| | |sf| |)

    这就是我们最后的等式

    庆祝!!! 好吧…现在我们要实际使用它。如果你不是数学类型的人(或者,如果我的解释很糟糕,我把你丢在了什么地方),我会把这最后一个方程能为我们做些什么归结起来

    最后一个方程的结果决定了我们偏离的角度。其范围为0度到180度(或0弧度到π弧度)。0度意味着我们正朝着目标直接前进,而180度意味着我们正朝着目标直接前进

    如果|v| |或|sf| |为零,则该等式无效。这是有道理的;如果我们已经在目标的顶部,那么行进的距离为零,没有角度可计算。同时,如果速度为零,那么我们哪里也去不了,也无法计算角度。请注意,如果向量的所有值都为零,则向量的大小仅为零,因此这是一个简单的检查

    数学很好,但是。。。 我将把这一点放在一个术语中,这个术语对程序员来说应该更熟悉

    结构向量3{double x,y,z;} 浮点数(矢量3 v) { 返回sqrt(v.x*v.x+v.y*v.y+v.z*v.z) } 浮动角(矢量3当前位置、矢量3目标位置、矢量3速度) { Vector3 targetDir=目标位置-当前位置 if(` targetDir中的所有值均为零` 或“速度中的所有值均为零”) { //我们不能退回任何有效的东西,可能会退回 //-1或抛出异常或其他 } //计算点积 双分子= 速度.x*targetDir.x +速度y*targetDir.y +速度z*targetDir.z 双分母=CalcMagnitude(速度)*CalcMagnitude(目标方向) 返回ACO(分子/分母) }
    你知道移动对象的位置吗?我投票结束这个问题,因为它与编程无关。哦,是的。这是一道数学和物理题。然而,说它与编程无关并不完全正确。这是我在最近的项目(机器学习)中需要解决的重要问题之一。我也不知道数学问题在stackoverflow中是不受欢迎的。那么这本质上是一个寻找targetDir和速度之间的角度的问题吗?是的,差不多。对于几何体,它看起来很简单(它是一对向量),但是单独使用组件需要更多的步骤。