旋转连续性帮助

首先是这个问题:基本上它是一个圆的角度不连续的事实,他们从0上升到2pi,然后立即回落到0。

我想制作一个游戏,玩家控制一个坦克,一个坦克的驱动器工作,但我想实现一个“方向驱动”,玩家可以在一个方向推动一个游戏杆(XBOX360),坦克将前进并转向这个方向。 inheritance人的代码我必须这样做:

if (Math.Abs(controllerCOORD.Y) > Deadzone || Math.Abs(controllerCOORD.X) > Deadzone) { decimal intended_angle = (decimal)Math.Atan2(controllerCOORD.X, controllerCOORD.Y); double correction = (double)Decimal.Round((intended_angle - (decimal)this.BaseAngle_Rad), 1, MidpointRounding.AwayFromZero); this.BaseAngle_Rad += (correction / demultiplier_rot); this._x_pos += ((float)Math.Sin(this.BaseAngle_Rad) * multiplier_pos); //x component vector of movement this._y_pos -= ((float)Math.Cos(this.BaseAngle_Rad) * multiplier_pos); //y component vector of movement } 

不幸的是,在这个代码中,当玩家向下推动操纵杆(0,1)时,它计算的角度从右边开始为pi,从左侧开始为负的pi,导致它在错误的方向上完全转向,而不是像在正确的方向几度。

我如何使旋转一直持续下去? 我已经在这里find了这两个问题,但都不帮助我:

使用Math.Atan2(y,x)时360度旋转跳回0度

转动一个精灵,使其以最有效的方向旋转

谢谢

我误解了我发布的链接之一,结果是我认为更有帮助。 工作代码示例:

 if (Math.Abs(controllerCOORD.Y) > Deadzone || Math.Abs(controllerCOORD.X) > Deadzone) { double intended_angle = Math.Atan2(controllerCOORD.X, controllerCOORD.Y); double current_angle = this.BaseAngle_Rad % MathHelper.TwoPi; double difference = ((intended_angle - current_angle + MathHelper.Pi) % MathHelper.TwoPi) - MathHelper.Pi; if (intended_angle > current_angle + MathHelper.Pi) { intended_angle -= 2 * MathHelper.Pi; } else if (intended_angle < current_angle - MathHelper.Pi) { intended_angle += 2 * MathHelper.Pi; } this.BaseAngle_Rad = MathHelper.Lerp((float)current_angle, (float)intended_angle, 2.5f * (float)gametime.ElapsedGameTime.TotalSeconds); this._x_pos += ((float)Math.Sin(this.BaseAngle_Rad) * multiplier_pos); //x component vector of movement this._y_pos -= ((float)Math.Cos(this.BaseAngle_Rad) * multiplier_pos); //y component vector of movement } 

对于无意义的文章抱歉,希望别人可能会觉得这有用