转向目标的最短路径?

时间:2010-12-07 20:39:04

标签: xna

我创造了一个小坦克射手 - 迷你游戏,目前正在研究其他坦克的cpu控制。

cpu坦克知道以下内容:

  • 面对自己,面向的方向
  • 自己的位置(X和Y)
  • 其目标位置(X和Y)

最重要的是,我做到了这样,积极的y向下而不是向上。正x方向从左到右。

如何计算cpu坦克需要旋转以指向其目标的最短路径?

让我们说坦克在(3,3),面向90度(直左)和Im在(4,7)。教育会是什么?

1 个答案:

答案 0 :(得分:1)

我不确定没有更简单的方法可以做到这一点,我倾向于经常恢复到3d矢量数学,即使在二维三角解算方案中更适合。你的问题意味着你在2d工作,但3d数学仍然有效。希望有人会为你提出一个更简单的算法,但如果没有,这里有一些东西。

我认为你的意思是角度测量中最短的方式。在此代码中,如果最短路径为CCW,则结果为正角度值,如果为CW,则为负。

Vector2 targetPosition = new Vector2(3, 3);
Vector2 myPosition = new Vector2(4, 7);
Vector2 myFacingDirection2D = new Vector2(-1, 0);//facing straight left   
Vector3 directionToTarget3D = Vector3.Normalize(new Vector3(targetPosition - myPosition, 0));
Vector3 myFacingDirection3D = Vector3.Normalize(new Vector3(myFacingDir2D, 0);
Vector3 crossResult = Vector3.Cross(myFacingDirection3D, directionToTarget3d);
float dotFactor = Vector3.Dot(myFacingDirection3D, directionToTarget3D) < 0 ? MathHelper.Pi : 0f;

float angleToTarget = (dotFactor - (float)Math.Sin(crossResult.Length()) ) * Math.Sign(crossResult.Z);

如果这反过来(正/负),则反转十字功能中的参数的顺序。