Xna 转向目标的最短路径?

Xna 转向目标的最短路径?,xna,Xna,我创建了一个小型坦克射击小游戏,目前正在研究其他坦克的cpu控制 cpu槽知道以下内容: 它自己面对的,它面对的方向 其自身位置(X和Y) 其目标位置(X和Y) 除此之外,我还使正y是向下的,而不是向上的。正x方向是从左到右 如何计算cpu箱旋转到目标点所需的最短路径 假设油箱位于(3,3),朝向90度(直左),Im位于(4,7)。什么是计算方法?我不确定是否有更简单的方法,我倾向于经常回到三维向量数学,即使二维三角解更适合。你的问题意味着你在二维空间工作,但三维数学仍然有效。希望有人能为你

我创建了一个小型坦克射击小游戏,目前正在研究其他坦克的cpu控制

cpu槽知道以下内容:

  • 它自己面对的,它面对的方向
  • 其自身位置(X和Y)
  • 其目标位置(X和Y)
除此之外,我还使正y是向下的,而不是向上的。正x方向是从左到右

如何计算cpu箱旋转到目标点所需的最短路径


假设油箱位于(3,3),朝向90度(直左),Im位于(4,7)。什么是计算方法?

我不确定是否有更简单的方法,我倾向于经常回到三维向量数学,即使二维三角解更适合。你的问题意味着你在二维空间工作,但三维数学仍然有效。希望有人能为你想出一个更简单的算法,但如果没有,这里有一些东西

我想你指的是角度测量中的最短路径。在该代码中,如果最短路径为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);
Vector2 targetPosition=新的Vector2(3,3);
向量2 myPosition=新向量2(4,7);
向量2 myFacingDirection2D=新向量2(-1,0)//正对着左边
Vector3 directionToTarget3D=Vector3.Normalize(新Vector3(targetPosition-myPosition,0));
Vector3 myFacingDirection3D=Vector3.Normalize(新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);

如果结果相反(正/负方向)然后颠倒交叉函数中参数的顺序。

我不确定是否有更简单的方法来实现这一点,我倾向于经常回到三维向量数学,即使二维三角解更适合。你的问题意味着你在二维中工作,但三维数学仍然有效。希望有人能想出一个更简单的算法嗯,谢谢你,但如果不是的话,这里有些东西

我假设你是指角度测量中的最短路径。在这段代码中,如果最短路径是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);
Vector2 targetPosition=新的Vector2(3,3);
向量2 myPosition=新向量2(4,7);
Vector2 myFacingDirection2D=新的Vector2(-1,0);//正对着左边
Vector3 directionToTarget3D=Vector3.Normalize(新Vector3(targetPosition-myPosition,0));
Vector3 myFacingDirection3D=Vector3.Normalize(新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);
如果结果是反向的(正/负方向),则反转Cross函数中参数的顺序