【问题标题】:Calculating rotation degrees based on delta x,y movement of touch or mouse根据触摸或鼠标的 delta x,y 移动计算旋转度数
【发布时间】:2016-04-19 19:03:02
【问题描述】:

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

我正在使用 libGdx,并且在调用“touchDragged”方法时获得了 X 和 Y 增量运动(正整数和负整数取决于运动方向)。

我如何使用这个增量 X 和 Y 来计算我可以应用到我的对象的移动度数。最好我只想添加弧度或度数。

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

PS:在发布这个问题之前我做了一些环顾四周,我知道有类似的问题,但我无法根据它们弄清楚。我不知道具体原因,但似乎所有不同的问题都在处理不同的用例,每个用例都与我的不同。

【问题讨论】:

  • 阅读GestureDetectorGestureListener 课程以及post
  • 是的,GestureListener 为平移和捏合等添加了一些额外的东西,但它对我的问题没有帮助,因为没有旋转方法。

标签: input libgdx rotation


【解决方案1】:

检索从 [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 即可翻转它)。

【讨论】:

    【解决方案2】:

    根据 X 和 Y 的差值创建 Vector2。使用 Vector2.angle() 获取向量相对于 x 轴的角度。将该角度应用于您的精灵对象。

    Vector2 API

    【讨论】:

      【解决方案3】:

      [编辑:正如 Barodapride 所述,libgdx 提供了 Vector2 API Vector2.angle(Vector2 Reference),它已经将浮点角度值返回给您,但很高兴知道引擎盖下发生了什么]强>

      使用笛卡尔到极坐标,您的坐标轴位置将是您在笛卡尔平面中的 0,0,我现在无法测试它,但您可以通过我编写的以下代码了解这个想法,看看 @987654321 @供进一步参考:

      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;
      

      【讨论】:

      • getAxis() 在这里做什么,为什么需要它?另外我想指出, touchDragged 不提供位置,而是自上次调用 touchDragged 以来的运动增量。看来您使用的是位置而不是增量。或者说不能只使用 delta 来做到这一点,必须使用 onTouchDown 事件的起始位置?
      • 它是投影到屏幕上的对象的位置,要计算这两个向量之间的角度,您需要在同一平面上处理它们的位置,只需使用 Barodapride 所述的 Vector API
      • 我刚刚注意到我说它不提供职位是错误的,只是想指出这一点。
      • 再次阅读您的问题,您需要将游戏世界的对象位置告知该方法,您不能将 Δx 和 Δy(线速度)与基于屏幕位置的角度相关联,如果没有位置,就不可能从线速度中得到角度。您的 screencords 与您的 gameworld 坐标不同,因此您必须通过 camera.project(obj.getPosition) 将您的 gameworld 坐标转换为 screencoords 并进行数学运算以找到它们之间的相关角度,然后您必须计算您的角速度。如果您不想自己计算,请使用 Box2D。
      • 如果您不想自己处理数学,我真的建议您使用box2dsteering behaviours,反正不知道为什么要这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2014-11-18
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多