我在Eclipse工作,使用Libgdx游戏框架开发Android应用程序,我试图根据Android设备的一般动作移动2D光标。正如我已经从无数的资料中读到的那样,由于计算过程中出现了很大的误差,这比听起来要困难得多。
到目前为止,我所做的非常原始;从Android传递一个复合“线性加速度传感器”,使用加速度值计算速度,使用速度计算位移,将其添加到我的光标的x,y坐标上,最后确保光标不超过屏幕的尺寸。我认为它不需要代码示例,但这是核心代码的淡化版本;
//class attributes
Vector2 accel, prevAccel;
Vector2 velocity;
Vector2 cursorPos;
IMyLinearAccelerationSensor las;
//update code
accel = new Vector2(las.getAccelXY); //returns a Vector2 with the x and y acceleration values
velocity.x = (accel.x + prevAccel.x) /2 * deltaTime;
velocity.y = (accel.y + prevAccel.y) /2 * deltaTime;
cursorPos.x += tempAccel.x * deltaTime;
cursorPos.y += tempAccel.y * deltaTime;
prevAccel = accel; //update the "previous acceleration"
if (cursorPos.x < 0)
cursorPos.x = 0;
if (cursorPos.y < 0)
cursorPos.y = 0; //etc.
我遇到的主要问题是漂移,以及传感器似乎对x和y(我认为)的正方向上的运动更敏感的事实。换句话说,光标加速/漂移,卡在屏幕的左上角,x和y的相应速度永远不会真正回落到0.即使在相反方向移动设备时,速度也只有略有下降。
鉴于所有这些信息,我只是想问一些问题,并提出一些建议。首先,这是正常的行为,还是我的代码有任何明显的问题? 如果没有,是否有任何步骤可以采用我当前的设置,以解决漂移的这些问题,并删除一些误差?例如应用不同的滤波器去除噪声,对速度施加阻力等。 我不需要光标的移动来过于准确地跟随设备的运动;只要它在设备移动时移动,并且一般在设备停止时停止,我不介意是否有一些小的漂移或滞后。
我正在考虑在某些时候实现更多接口以从Android硬件传感器(罗盘,陀螺仪和加速度计)获取原始数据,以生成更准确的结果,但即使我继续这样做,这会是改善多少?知道这是一个复杂的问题,我宁愿没有充分的理由花太多时间。 (传感器从头开始融合似乎很难......)
最后,我对这篇冗长的帖子感到抱歉,如果这被认为是一个重复的问题,也很抱歉。我已经做过研究,并且已经看到很多其他人有类似的问题,但我不太确定他们的解决方案如何应用于我自己的问题。鉴于我有限的知识/经验,我很感激可以提供任何有用的见解。