C# 如何以最短的距离逐渐旋转一个对象以面对另一个旋转对象

C# 如何以最短的距离逐渐旋转一个对象以面对另一个旋转对象,c#,xna,rotation,C#,Xna,Rotation,我目前正在尝试旋转一个精灵,这取决于它与直接面向目标的角度(或rads,我更喜欢度)的不同,问题是当目标到达某个位置时,精灵决定以其他方式旋转360度,而不是额外旋转10度。这张图片可能更好地解释了这个问题: 蓝色方块=目标 红方块=对象 绿线=它想要的旋转 黑线=当前旋转 棕色箭头=它如何旋转以实现此目的 红色箭头=我希望它如何旋转 请注意,情况1始终有效,这取决于它的旋转方式,但情况2始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧” 这是我用来旋转对象的代码 Vector2

我目前正在尝试旋转一个精灵,这取决于它与直接面向目标的角度(或rads,我更喜欢度)的不同,问题是当目标到达某个位置时,精灵决定以其他方式旋转360度,而不是额外旋转10度。这张图片可能更好地解释了这个问题:

蓝色方块=目标

红方块=对象

绿线=它想要的旋转

黑线=当前旋转

棕色箭头=它如何旋转以实现此目的

红色箭头=我希望它如何旋转

请注意,情况1始终有效,这取决于它的旋转方式,但情况2始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧”

这是我用来旋转对象的代码

    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。谢谢:)