XNA 2D Point对象随时间变化的光标

时间:2011-12-21 02:36:42

标签: math xna rotation mouse

目前我正确地找到了屏幕上物体和光标的距离和旋转。

Vector2 direction = podType[podIndex]._Position - MouseCursorInWorld; 
mousePoint = (float)(Math.Atan2(-direction.X, direction.Y));

这很好用,下一步我弄清楚如何慢慢地将当前方向旋转到鼠标位置是使用百分比工作正常,但有一个主要问题,这是我正在努力修复

        percent = mousePoint / mousePoint * increment;
        if(percent < mousePoint)increment += 0.01f;
        if (percent > mousePoint) increment -= 0.01f;

正如你在这里看到的那样,百分比是光标总旋转的百分比,如果旋转小于或大于它移动到该增量的百分比,直到达到100%,这意味着它正确面向光标。

问题是因为左侧是负的而右侧是正的,我的完全旋转达到3.1和-3.1所以当我将光标移动到底部某处并从最右边移动到最左边时,而不是继续向光标方向离开,它向右旋转,因为当前鼠标点值为负2.2,目前正为正1.5

有没有我可以包裹旋转所以它没有角度的负和正?或者是否有一种更好的技术我可以使用,而不是我现在的那种?谢谢您的时间:))

1 个答案:

答案 0 :(得分:3)

我不太确定我理解你是完全百分比的东西,但从我的理解你想要一个物体旋转逐渐转向鼠标。

尝试将目标旋转量包装在Pi和-Pi之间,您可以执行以下操作

           Vector2 dist = podType[podIndex]._Position - MouseCursorInWorld; 
           float angleTo = (float)Math.Atan2(dist.Y, dist.X); //angle you want to get to

           rotation = MathHelper.WrapAngle(rotation); // keeps angle between pi and -pi

            if (angleTo > rotation)
                while (angleTo - rotation > MathHelper.Pi)
                    angleTo -= MathHelper.TwoPi;
            else
                while (angleTo - rotation < -MathHelper.Pi)
                    angleTo += MathHelper.TwoPi;


            if (rotation < angleTo) rotation += 0.01f;
            if (rotation > angleTo) rotation -= 0.01f;

rotation将是您当前的轮播。另外,如果你想得到两个数字之间的百分比值,我会调查MathHelper.Lerp(线性插值)。

最后,您可以使用

来代替+或 - 0.01f

rotation = MathHelper.Lerp(rotation, angleTo, 0.01f);

这会使你的旋转值每帧增加1%的目标角度。