缓慢移动初始角度,直到到达最终角度
Moving slowly an initial angle until it reach a final angle
我会尽量对此进行详细描述。我现在正在编辑一个游戏,场景是一个3D区域。
我有一个初始角度,写为方向向量,还有另一个具有不同坐标的向量。正如我们所知,两个向量之间的角度由公式给出:Theta = ACos( DotProduct( vec1, vec2 ) / ( VectorLength( vec1 ) * VectorLength( vec2 ) ) )
让我们来描述一下场景:我目前正在编写某种固定武器,一种步哨枪,这东西缓慢地移动他的"head",向敌人发射子弹。那个角度旋转是我的问题。
让我们想象一下:我把哨兵枪放在一个空的 3D 区域,"enemy" 在那里生成。我目前可以得到我的哨兵视角的方向向量,以及我的哨兵和玩家之间的方向向量。让我们猜测,使用所描述的公式,他的分离角是 45 度。我的哨兵枪每 0.1 秒思考一次(调用一个函数),我想在每个思考函数中移动他的头 5 度 直到它到达玩家(即,两个向量几乎相等),这意味着它将在 0.9 秒(45 度 5 度)内到达玩家(如果玩家保持其位置......)
如何缓慢移动哨兵的视角直到到达目标?在 2D 中很容易,但我知道我正在与 3D 场景作斗争,而我目前对此感到困惑。
如有任何帮助,我们将不胜感激,关于编码,我将不胜感激并提供伪代码。谢谢! (对不起我的英语)
你需要的叫做SLERP——球面线性插值
你的起始方向向量是 p0,目标方向是 p1,Omega 是你的 Theta,t 参数在 0..1 范围内随所需步长变化
Delphi二维案例的例子(容易控制)
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;
我会尽量对此进行详细描述。我现在正在编辑一个游戏,场景是一个3D区域。
我有一个初始角度,写为方向向量,还有另一个具有不同坐标的向量。正如我们所知,两个向量之间的角度由公式给出:Theta = ACos( DotProduct( vec1, vec2 ) / ( VectorLength( vec1 ) * VectorLength( vec2 ) ) )
让我们来描述一下场景:我目前正在编写某种固定武器,一种步哨枪,这东西缓慢地移动他的"head",向敌人发射子弹。那个角度旋转是我的问题。
让我们想象一下:我把哨兵枪放在一个空的 3D 区域,"enemy" 在那里生成。我目前可以得到我的哨兵视角的方向向量,以及我的哨兵和玩家之间的方向向量。让我们猜测,使用所描述的公式,他的分离角是 45 度。我的哨兵枪每 0.1 秒思考一次(调用一个函数),我想在每个思考函数中移动他的头 5 度 直到它到达玩家(即,两个向量几乎相等),这意味着它将在 0.9 秒(45 度 5 度)内到达玩家(如果玩家保持其位置......)
如何缓慢移动哨兵的视角直到到达目标?在 2D 中很容易,但我知道我正在与 3D 场景作斗争,而我目前对此感到困惑。
如有任何帮助,我们将不胜感激,关于编码,我将不胜感激并提供伪代码。谢谢! (对不起我的英语)
你需要的叫做SLERP——球面线性插值
你的起始方向向量是 p0,目标方向是 p1,Omega 是你的 Theta,t 参数在 0..1 范围内随所需步长变化
Delphi二维案例的例子(容易控制)
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;