我試圖緩和(逐漸移動)對象到任意位置的旋轉。旋轉角度由虛擬拇指類決定,該類返回-1和1之間的X/Y座標。如果拇指沒有移動,則旋轉回到0,除非我正在補償角度精靈的形象。旋轉緩動算法在XNA中不起作用
我遇到的問題是,此代碼將只允許大約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;
}
如果有任何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;
}
我開始懷疑是否有與我的類型或強制轉換是導致該問題的問題。如果任何人有任何想法,您的意見非常感謝。
什麼不在這裏工作了? – Tigran 2012-02-09 18:52:12
@Tigran - 旋轉不連續。在任一方向旋轉1.5次後,它會撞擊牆壁,然後折回。另外,當放開拇指按鈕時,它會從它的方向回到0(在這種情況下爲-1.57097)。請重新閱讀該問題以進行澄清。 – ImKevinJones 2012-02-09 19:12:48