根据触摸或鼠标的delta x,y移动计算旋转度

时间:2016-04-19 19:03:03

标签: input libgdx rotation

我在2D空间中有一个对象,我想根据2D空间中的输入如何移动来旋转。基本上,假设您在屏幕上顺时针或逆时针移动手指或鼠标,并且对象相对于您旋转手指的方式旋转。物体的位置根本不重要,这意味着旋转仅从手指运动转移到物体,并且物体的位置和手指移动位置之间没有关系。

我正在使用libGdx,在调用方法" touchDragged"时,我得到了X和Y delta运动(取决于运动方向的正整数和负整数)。

如何使用此增量X和Y来计算我可以应用于对象的移动度。我最好添加一个弧度或度数值。

如果只使用一个轴,我可以正常工作。即如果我上下移动手指,或顺时针或逆时针旋转。我的问题是由于X和Y运动而使它工作。

PS:在发布这个问题之前我做了一些调查,我知道有类似的问题,但我无法根据它们弄清楚。我并不确切知道为什么,但似乎所有不同的问题都在处理不同的用例,每个用例与我的不同。

3 个答案:

答案 0 :(得分:2)

[编辑:正如Barodapride所述,libgdx提供了Vector2 API Vector2.angle(Vector2参考),它已经为您返回了浮动角度值,但很高兴知道幕后发生了什么]

使用笛卡尔坐标到极坐标,你的轴位置将是你的笛卡尔平面的0,0,我现在无法测试它但你可以通过我写的下面的代码得到这个想法,看看{{ 3}}进一步参考:

public boolean touchDragged(InputEvent event, float posX, float posY, int pointer){
    //Declare and get the position of your axis (in screen coords, you can get that by camera.project()
    Float axisX,axisY;
    axisX = getAxisX();
    axisY = getAxisY();
    //Transform the clicked position to the cartesian plane given the axis
    Float cartesianX,cartesianY;
    cartesianX = posX-axisX;
    cartesianY = posY-axisY;
    //Calculate de radius
    Float radius = Math.sqrt( cartesianX * cartesianX + cartesianY * cartesianY );
    //Get the angle in radians
    Float angleInRadians = Math.acos( cartesianX / radius );
    //Get the angle in degrees
    Float angleInDegrees = angleInRadians *57.2958;
    return true;
}

反向,从给定的半径和角度得到x,y:

double x = getAxisX() + Math.cos( angleInRadians ) * radius;
double y = getAxisY() + Math.sin( angleInRadians ) * radius;

答案 1 :(得分:2)

根据X和Y的差异制作Vector2。使用Vector2.angle()获取矢量相对于x轴的角度。将该角度应用于精灵对象。

Vector2 API

答案 2 :(得分:0)

从[x0,y0]到[x1,y1]检索角度的最简单方法是使用Math.atan2(y, x);(找到与x轴的角度差异)。

基本上,你可以做这样的事情;

//direction from old to new location in radians, easy to convert to degrees
dir = Math.atan2(dy, dx);

(我感冒了,今天没想过,这可能会给出完全相反的方向,在这种情况下只需添加PI或180°或w / e来翻转它。)