Math 缓慢移动初始角度,直到到达最终角度

Math 缓慢移动初始角度,直到到达最终角度,math,vector,3d,game-physics,angle,Math,Vector,3d,Game Physics,Angle,我会尽量用这个来描述。我现在正在编辑一个游戏,场景是一个3D区域 我有一个初始角度,写为方向向量,另一个向量有不同的坐标。我们知道,两个向量之间的角度由公式给出:Theta=ACos(点积(vec1,vec2)/(向量长度(vec1)*向量长度(vec2)) 让我们描述一下这个场景:我现在正在编程一种固定的武器,一把哨兵枪,这个东西慢慢地移动他的“头”,向敌人射击。角度旋转是我的问题 让我们想象一下:我把我的哨兵枪放在一个空的3D区域,一个“敌人”在那里繁殖。我现在可以得到我的哨兵视角的方向向量

我会尽量用这个来描述。我现在正在编辑一个游戏,场景是一个3D区域

我有一个初始角度,写为方向向量,另一个向量有不同的坐标。我们知道,两个向量之间的角度由公式给出:Theta=ACos(点积(vec1,vec2)/(向量长度(vec1)*向量长度(vec2))

让我们描述一下这个场景:我现在正在编程一种固定的武器,一把哨兵枪,这个东西慢慢地移动他的“头”,向敌人射击。角度旋转是我的问题

让我们想象一下:我把我的哨兵枪放在一个空的3D区域,一个“敌人”在那里繁殖。我现在可以得到我的哨兵视角的方向向量,以及我的哨兵和玩家之间的方向向量。让我们猜测一下,使用所描述的公式,他的分离角是45度。我的哨兵枪每0.1秒思考一次(调用一个函数),我想在每个思考函数中移动他的头5度,直到它到达玩家(即,两个向量几乎相等),这意味着它将在0.9秒内到达玩家(如果玩家保持其位置…)

我怎样才能慢慢移动哨兵的视角直到它到达目标?在2D中很容易,但我知道我在用3D场景战斗,而我现在对此感到迷茫

任何帮助都将不胜感激,关于编码,我将非常感谢提供一个伪代码。谢谢(对不起我的英语)

你需要的是球面线性插值

你们的起始方向向量是p0,目标方向是p1,ω是θ,t参数在0..1范围内随所需步长变化

2D案例的Delphi示例(易于控制)


如果可以在2D中解决此问题,则可以在3D中通过忽略2D公式中使用的第三个坐标来解决此问题,除非它在3个方向上旋转。要使其缓慢旋转,可以使用一些缓和公式,如:
position=currentPosition+(finalPosition-currentPosition)/easingFactor
,其中,
easingFactor
是一个定义减速的整数。您需要计算垂直于包含vec1和vec2的平面的向量-这定义了旋转哨兵枪视线向量的轴。围绕任意3D矢量执行旋转(例如,5°)的公式有些复杂,并且在整个web上都有解释。例如:。但是,如果不需要角度在vec1和vec2之间线性变化,那么像@rcdmk这样的伪造解决方案就足够了,线性变化坐标而不是角度。这将取决于两个向量@rcdmk之间的角度。你的公式把它的差异分成小块,但这些小块会各不相同。考虑到“敌人”可以移动,所以这就是它的不同之处:它依赖于不断移动“哨兵”的头部,直到它到达目标。谢谢@这位维多尔,我要看一看耶稣,这太棒了。我以前没注意到。糟糕的是,我对它有点困惑。我应该在每个坐标上应用Slerp()?意思类似ReturnVector.x=Slerp(Start.x,End.x,0.5/*示例*/)ReturnVector.y=Slerp(Start.y,End.y,0.5)ReturnVector.z=Slerp(Start.z,End.z,0.5)?是的,你是对的。但最好对给定的t计算一次系数,并将其应用于每个坐标
var
  p0, p1: TPoint;
  i, xx, yy: Integer;
  omega, InvSinOmega, t, a0, a1: Double;
begin
  P0 := Point(0, 200);
  P1 := Point(200, 0);
  omega := -Pi / 2;
  InvSinOmega := 1.0 / Sin(omega);
  Canvas.Brush.Color := clRed;
  Canvas.Ellipse(120 + P0.X, 120 + P0.Y, 120 + P0.X + 7, 120 + P0.Y + 7);
  Canvas.Ellipse(120 + P1.X, 120 + P1.Y, 120 + P1.X + 7, 120 + P1.Y + 7);

  for i := 1 to 9 do begin
    t := i / 10;

    a0 := sin((1 - t) * omega) * InvSinOmega;
    a1 := sin(t * omega) * InvSinOmega;
    xx := Round(P0.X * a0 + P1.X * a1);
    yy := Round(P0.Y * a0 + P1.Y * a1);

    Canvas.Brush.Color := RGB(25 * i, 25 * i, 25 * i);
    Canvas.Ellipse(120 + xx, 120 + yy, 120 + xx + 9, 120 + yy + 9);
  end;