C# 如何以最短的距离逐渐旋转一个对象以面对另一个旋转对象
我目前正在尝试旋转一个精灵,这取决于它与直接面向目标的角度(或rads,我更喜欢度)的不同,问题是当目标到达某个位置时,精灵决定以其他方式旋转360度,而不是额外旋转10度。这张图片可能更好地解释了这个问题: 蓝色方块=目标 红方块=对象 绿线=它想要的旋转 黑线=当前旋转 棕色箭头=它如何旋转以实现此目的 红色箭头=我希望它如何旋转 请注意,情况1始终有效,这取决于它的旋转方式,但情况2始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧” 这是我用来旋转对象的代码C# 如何以最短的距离逐渐旋转一个对象以面对另一个旋转对象,c#,xna,rotation,C#,Xna,Rotation,我目前正在尝试旋转一个精灵,这取决于它与直接面向目标的角度(或rads,我更喜欢度)的不同,问题是当目标到达某个位置时,精灵决定以其他方式旋转360度,而不是额外旋转10度。这张图片可能更好地解释了这个问题: 蓝色方块=目标 红方块=对象 绿线=它想要的旋转 黑线=当前旋转 棕色箭头=它如何旋转以实现此目的 红色箭头=我希望它如何旋转 请注意,情况1始终有效,这取决于它的旋转方式,但情况2始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧” 这是我用来旋转对象的代码 Vector2
Vector2 distance = new Vector2(target.worldPos.X - this.worldPos.X, target.worldPos.Y - this.worldPos.Y);
float wantRot = (float)Math.Atan2(distance.Y, distance.X);
if (this.rotation < wantRot)
this.rotation += MathHelper.ToRadians(45) * Time.deltaTime;
if (this.rotation > wantRot)
this.rotation -= MathHelper.ToRadians(45) * Time.deltaTime;
Vector2距离=新的Vector2(target.worldPos.X-this.worldPos.X,target.worldPos.Y-this.worldPos.Y);
float wantRot=(float)Math.Atan2(distance.Y,distance.X);
如果(此旋转wantRot)
this.rotation-=MathHelper.ToRadians(45)*Time.deltaTime;
我想要实现的是让它按照红色箭头而不是棕色箭头旋转(在案例2中)
注意:我不是编程方面的专家,我只是在过去的一年中偶尔做过(主要是简单的2D射击/射击类游戏),因此希望能有深入的解释。我也是一名学习编程的学生
PS:对于标题的建议也将不胜感激,因为我完全不知道该放在那里什么。您的问题是目标可能在角度5,而对象可能面对355度(例如)。根据你的测试,5小于355,所以逆时针走 你应该做的是测试目标是在你左边180度以内,还是在你右边180度以内,然后相应地移动 棘手的部分是让支票在3600左右“换行”。在您的情况下,似乎剩下0度,因此,当wantRot位于0度以内的一侧时,就需要进行艰难的测试 如下图所示,画一个圆圈,然后把你的物体放在我们面对的左边。您将看到必须分别检查两个阴影区域 方法1 分别检查所有箱子 注意:下面的代码在我脑海中,未经测试。您需要将度更改为弧度
int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;
if (wantRot != this.rotation)
{
if (wantRot == BehindMe)
MoveDir = 1; // or randomly choose
else if ((wantRot > BehindMe && wantRot < this.rotation) ||
(this.rotation < 180 && (wantRot > BehindMe ||
wantRot < this.rotation)))
MoveDir = -1;
else if ((wantRot < BehindMe && wantRot > this.rotation) ||
(this.rotation > 180 && (wantRot < BehindMe ||
wantRot > this.rotation))
MoveDir= 1;
this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}
int-MoveDir=0;
var BehindMe=此旋转-180;
if(在后面<0)
落后+=360;
if(wantRot!=此旋转)
{
如果(wantRot==落后于我)
MoveDir=1;//或随机选择
else if((wantRot>在后面和&wantRot在我后面||
wantRotthis.rotation)||
(此旋转>180&(wantRot<落后于我||
wantRot>this.rotation)
MoveDir=1;
this.rotation+=MoveDir*MathHelper.ToRadians(45)*Time.deltaTime;
}
方法2 通过查看图像,您可能会意识到,您可以只检查对象是否在右侧,如果不在右侧,则假设它在左侧(因为只要当前角度小于180度,检查其在右侧就很容易).如果当前角度大于180度,则反转概念-检查其是否在左侧,如果不在右侧。如下所示:
int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;
if (wantRot != this.rotation)
{
if (this.rotation <= 180)
{
if (wantRot > this.rotation && wanrRot < BehindMe)
MoveDir = 1;
else
MoveDir = -1;
}
else
{
if (wantRot < this.rotation && wanrRot > BehindMe)
MoveDir = -1;
else
MoveDir = 1;
}
this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}
int-MoveDir=0;
var BehindMe=此旋转-180;
if(在后面<0)
落后+=360;
if(wantRot!=此旋转)
{
if(this.rotation this.rotation&&wanrRotBehindMe)
MoveDir=-1;
其他的
MoveDir=1;
}
this.rotation+=MoveDir*MathHelper.ToRadians(45)*Time.deltaTime;
}
问题的格式非常好,先生,请看strong+1。请编辑您的问题,以显示您到目前为止的代码,然后在此通知我您已对其进行了更新。我使用了方法1,但无法使用方法2。谢谢:)