Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 旋转缓和算法在XNA中不起作用_C#_Flash_Actionscript 3_Windows Phone 7_Xna 4.0 - Fatal编程技术网

C# 旋转缓和算法在XNA中不起作用

C# 旋转缓和算法在XNA中不起作用,c#,flash,actionscript-3,windows-phone-7,xna-4.0,C#,Flash,Actionscript 3,Windows Phone 7,Xna 4.0,我试图减轻(逐渐移动)一个物体的旋转到任意位置。旋转角度由虚拟Thumbstick类确定,该类返回-1和1之间的X/Y坐标。如果拇指上没有移动,我将旋转回0点,除了补偿精灵图像的角度 我遇到的问题是,该代码只允许大约1.5次旋转(介于-3*PI和3*PI之间的任何位置),而不是连续旋转。使用Math.Atan2和指杆的X/Y坐标,返回的角度限制在-PI和PI之间,但允许连续旋转。此外,如果我将对象朝一个方向旋转并松开拇指杆,它将从它来的方向旋转回顶部。我想让它在最短的路线上旋转回到顶部 if (

我试图减轻(逐渐移动)一个物体的旋转到任意位置。旋转角度由虚拟Thumbstick类确定,该类返回-1和1之间的X/Y坐标。如果拇指上没有移动,我将旋转回0点,除了补偿精灵图像的角度

我遇到的问题是,该代码只允许大约1.5次旋转(介于-3*PI和3*PI之间的任何位置),而不是连续旋转。使用Math.Atan2和指杆的X/Y坐标,返回的角度限制在-PI和PI之间,但允许连续旋转。此外,如果我将对象朝一个方向旋转并松开拇指杆,它将从它来的方向旋转回顶部。我想让它在最短的路线上旋转回到顶部

if (VirtualThumbsticks.LeftThumbstick.Length() > .2f)
{
    double rotateTo = Math.Atan2(VirtualThumbsticks.LeftThumbstick.Y, VirtualThumbsticks.LeftThumbstick.X);

    if (rotateTo > Rotation + Math.PI) rotateTo -= (Math.PI * 2);
    if (rotateTo < Rotation - Math.PI) rotateTo += (Math.PI * 2);

    Rotation += (rotateTo - Rotation) * 0.2;
}
else
{
    Rotation += (-1.57079 - Rotation) *0.2;
}
if(VirtualThumbsticks.LeftThumbstick.Length()>.2f)
{
double rotateTo=Math.Atan2(VirtualThumbsticks.LeftThumbstick.Y,VirtualThumbsticks.LeftThumbstick.X);
如果(rotateTo>Rotation+Math.PI)rotateTo-=(Math.PI*2);
如果(rotateTo
如果有任何Flash/ActionScript游戏开发者知道我在说什么,请加入进来,因为我可以将其应用到C#

提前谢谢大家

编辑:

这段代码在AS3中完美地工作:

function enterFrameHandler(e:Event):void
{
    var curMouseX = Math.round(-(arrow.x - stage.mouseX));//(stage.stageWidth/2)-(stage.mouseX/2);
    var curMouseY = Math.round(-(arrow.y - stage.mouseY));//(stage.stageHeight/2)-(stage.mouseY/2);
    var angleTo:Number = Math.atan2(curMouseX, -curMouseY) * TO_DEGREES;
    if (angleTo > arrow.rotation+180) angleTo -= 360;
    if (angleTo < arrow.rotation-180) angleTo += 360;

    tf_angle.text = angleTo.toString();
    tf_mouseX.text = curMouseX.toString();
    tf_mouseY.text = curMouseY.toString();

    arrow.rotation += (angleTo - arrow.rotation) * 0.2;
}
函数enterFrameHandler(e:Event):void
{
var curMouseX=Math.round(-(arrow.x-stage.mouseX));/(stage.stageWidth/2)-(stage.mouseX/2);
var curMouseY=Math.round(-(arrow.y-stage.mouseY));/(stage.stageHeight/2)-(stage.mouseY/2);
var angleTo:Number=Math.atan2(curMouseX,-curMouseY)*TO_度;
如果(角度到>箭头旋转+180)角度到-=360;
如果(角度到<箭头旋转-180)角度到+=360;
tf_angle.text=angleTo.toString();
tf_mouseX.text=curMouseX.toString();
tf_mouseY.text=curMouseY.toString();
arrow.rotation+=(angleTo-arrow.rotation)*0.2;
}
我开始怀疑是不是我的类型或类型转换问题导致了这个问题。如果有人有任何想法,我们非常感谢您的意见。

这是用C#编写的,使用XML,因此actionscript并行可能不适用,但我敢打赌它确实适用。在Flash中,旋转在每帧的末尾进行调整,因为存储123456789度的旋转变换没有什么好处。因此,变换重置为旋转的模值

但是,在计算最短旋转时,如果您期望某个较大的数字并将其与其他数字进行比较,而不是使用其模值计算其相对位置,则可能会遇到问题

也许这就是问题的根源。这只是猜测

如果您不熟悉它,那么模运算符-也称为百分号-“%”将给您除法的余数。这对于循环的数字很有帮助,例如栅格对齐和旋转

例如:

21 % 5 = 1;
 720 % 360 = 0;

这个问题已经解决了。问题在于旋转值没有“标准化”。基本上,如果旋转值超过Math.PI*2,它必须返回0。。。如果旋转值低于0,则必须返回Math.PI*2

这个页面上的最后一条评论已经解决了我的问题,现在轮换已经正常化了

我的结果代码:

if (VirtualThumbsticks.LeftThumbstick.Length() > .2f)
{
    float angleTo = (float)Math.Atan2(VirtualThumbsticks.LeftThumbstick.Y, VirtualThumbsticks.LeftThumbstick.X);

    if (angleTo > Rotation + Math.PI) angleTo -= (float)(Math.PI * 2);
    if (angleTo < Rotation - Math.PI) angleTo += (float)(Math.PI * 2);

    accelerationRotation += (angleTo - Rotation) * (float)0.25;

}
else
{
    accelerationRotation += ((float)(Math.PI / 2) - Rotation) * (float)0.2;
}

Rotation = Wrap(accelerationRotation, 0, (float)Math.PI * 2);

@Tigran-旋转不连续。在任一方向旋转1.5次后,它会撞到墙上,然后弹回来。此外,当松开拇指杆时,它会从它来的方向弹回到0(在本例中为-1.57097)。请重新阅读问题进行澄清。感谢您的输入,但我不明白如何将该逻辑应用于我的问题。这更告诉我,在计算最短旋转时可能会遇到问题。另外,我也不太清楚“用C语言编写,使用XML”是什么意思。
public static float Wrap(float value, float lower, float upper)
{
    unchecked
    {
        if (lower >= upper)
        {
            throw new ArithmeticException("rotary bounds out of negative or zero size");
        }

        float distance = upper - lower;

        float times = (float)Math.Floor((value - lower) / distance);

        return value - (times * distance);
    }
}