如何沿着vector移动对象

假设我在2D游戏中获得了对象A和对象B 我创建了一个从AB的向量。 它的名字是AB

我怎样才能让A沿着向量AB移动并到达B

我想这样做的一种方法是计算AB和x轴之间的角度,然后使用三角法在该角度的每个游戏循环周期中移动对象。

我将通过新的归一化vector(1,0)(x轴)来计算该角度,归一化AB ,然后通过得到它们的点积和使用arccos来获得它们之间的角度。

但有没有更容易的方法来使一个对象沿着vector的path?

编辑:

在这个问题中: 使对象遵循严格的path(Xna) ,有人建议沿着vector移动对象的方式如下:

 position += direction * speed * elapsed; 

哪里:

  • position =对象的当前位置。
  • direction =指向目标direction的归一化vector。
  • speed =一个标量来决定在游戏循环的每个循环中提前多less物体。 (这是'标量'?我正确使用这个词吗?)
  • elapsed =这是什么?

我得到的一切,但elapsed 。 这是什么? 这是必要的吗?

总之,这个方法是一个好方法吗? 你会推荐它吗?

谢谢

是的,正如对另一个问题的答案所表明的那样,这样做的最好方法是根据对象的速度沿对象向量移动对象的每一帧。 这是math运算中速度最快的,也是最不易发生数值或浮点漂移的。

您可以使用隐式(通常用于曲线或样条)或显式集成:

 Implicit: // t starts at 0 // PA' is the current position of A // PA is the original position of A // PB is the position of B t += deltaTime PA' = PA * (1 - t) + PB * t Explicit: // PA' is the current position of A // D is the direction vector // S is the speed PA' = PA' + (D * (S * deltaTime)) 

注意事项:在较长的时间内,明确的欧拉整合(如上所示)变得相当不准确。 另外,在使用之前,方向vector必须标准化。

经过的是时间变化。 看它

 position += direction * speed * elapsed; 

如果你以5米/秒的速度移动,你不知道如何改变你的位置,除非你知道,例如说2秒过去了。 那么你知道变化是10米

另一个选项,如果你需要知道你的对象的旋转,这是更有用的是这样的:

 rotation = atan2(dy, dx); px += speed * elapsed * cos(rotation); py += speed * elapsed * sin(rotation); 

经过的时间是上一次游戏循环以来的时间,dy和dx是从当前位置到目标位置的vector的y和x坐标,px和py是当前的x和y坐标。

您还应该检查您需要走的距离是否小于您可以移动的总量,以免通过目标。 一个方法是:

 if( dx*dx + dy*dy < speed * elapsed * speed * elapsed){ px += dx; py += dy; } else { calculate position with the first formula } 

这个方法可以让你不必标准化你的vector,并且在-180到+180度的范围内给你相对于x轴的旋转,而arccos不会告诉你角度是正的还是负的。