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