我在2D空间中有一个对象,我想根据2D空间中的输入如何移动来旋转。基本上,假设您在屏幕上顺时针或逆时针移动手指或鼠标,并且对象相对于您旋转手指的方式旋转。物体的位置根本不重要,这意味着旋转仅从手指运动转移到物体,并且物体的位置和手指移动位置之间没有关系。
我正在使用libGdx,在调用方法" touchDragged"时,我得到了X和Y delta运动(取决于运动方向的正整数和负整数)。
如何使用此增量X和Y来计算我可以应用于对象的移动度。我最好添加一个弧度或度数值。
如果只使用一个轴,我可以正常工作。即如果我上下移动手指,或顺时针或逆时针旋转。我的问题是由于X和Y运动而使它工作。
PS:在发布这个问题之前我做了一些调查,我知道有类似的问题,但我无法根据它们弄清楚。我并不确切知道为什么,但似乎所有不同的问题都在处理不同的用例,每个用例与我的不同。答案 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轴的角度。将该角度应用于精灵对象。
答案 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来翻转它。)