【问题标题】:How to gradually rotate an object to face another turning the shortest distance如何逐渐旋转一个物体以面对另一个转动最短距离
【发布时间】:2011-10-21 08:19:36
【问题描述】:

我目前正在尝试根据与直接面向目标的度数(或弧度,我更喜欢度数)不同来旋转精灵,问题是当目标到达特定位置时精灵决定旋转一个完整的 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;

我想要实现的是让它根据红色箭头而不是棕色箭头旋转(在案例 2 中)。

注意:我不是编程方面的专家,我只是在过去的一年中不时进行过编程(主要是简单的 2D 射击/射击类游戏),因此将不胜感激.我也是一名学习编程的学生。

PS:标题的建议也将不胜感激,因为我完全不知道该放什么。

【问题讨论】:

标签: c# xna rotation


【解决方案1】:

您的问题是目标可能处于 5 角,并且对象可能面向 355 度(例如)。根据你的测试,5小于355,所以逆时针走。

你应该做的是测试目标是在你左边180度以内,还是在你右边180度以内,然后相应地移动。

棘手的部分是让检查“环绕”在 360 0 左右。看起来你的情况还剩下 0 度,所以当wantRot 位于内部为 0 度的一侧时,最难的测试是它。

如下图所示画一个圆圈,然后将您的对象放在我们所面对的左侧。您会看到必须分别检查 2 个阴影区域。

方法一

分别检查所有案例。

注意:下面的代码在我的脑海中,未经测试。您需要将度数更改为弧度。

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;
}

方法二

看图片,你可能会发现你可以只检查物体是否在右边,如果不是,假设它在左边(因为只要当前角度小于 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;
}

【讨论】:

  • 编辑您的问题以显示您目前拥有的代码,然后在此处发表评论,让我知道您已对其进行了更新。
  • 我可以使用方法一,但无法使用方法二。谢谢你:)
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多