【发布时间】:2016-10-19 20:48:18
【问题描述】:
我正在 Unity 中制作游戏,其中游戏的主摄像头由手机方向控制。我遇到的问题是陀螺仪的数据非常嘈杂,使相机以非常抖动的方式旋转。我尝试了不同的手机以确保硬件不是问题(Galaxy s6 和 Sony Xperia T2)。
我尝试了以下方法,但似乎都没有:
-当前旋转和新姿态之间的偏差(无论我将 Time.deltaTime 乘以多少,抖动都太大)
//called at each update
transform.rotation = Quaternion.Slerp(transform.rotation, new Quaternion(-Input.gyro.attitude.x, -Input.gyro.attitude.y,
Input.gyro.attitude.z, Input.gyro.attitude.w), 60 * Time.deltaTime);
-平均最后的陀螺仪样本(Euleur 角度平均值或Quaternion average;无论我跟踪多少个样本,这两种情况仍然会产生过多的抖动)
//called at each update
if (vectQueue.Count >= 5)
{
vectQueue.Enqueue(Input.gyro.attitude.eulerAngles);
vectQueue.Dequeue();
foreach (Vector3 vect in vectQueue) {
avgr = avgr + vect;
}
avgr = new Vector3(avgr.x/5, avgr.y/5,avgr.z/5);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(avgr),Time.deltaTime*100);
}
else
{
vectQueue.Enqueue(Input.gyro.attitude.eulerAngles);
}
-对陀螺仪数据进行四舍五入(迄今为止防止抖动的最佳解决方案,但显然这根本不平滑)
-应用高通/低通滤波器(似乎没有做任何事情)
public float alpha = 0.5f;
//called at each update
v1 = Input.gyro.attitude.eulerAngles;
if (v2== null)
{
v2 =v1;
v3 = Input.gyro.attitude.eulerAngles;
}
else
{
v3 = (1 - alpha) * v3 + (1 - alpha)*(v1 - v2);
v2 = v1;
transform.Rotate(v3);
}
-从this之类的人那里复制粘贴代码;但是在所有情况下抖动都太强了。
所以现在我想我会尝试学习卡尔曼滤波器并统一实施它,但显然我更喜欢黑盒解决方案以节省时间。
【问题讨论】:
-
我试过这个,那个和这个,但你甚至懒得发布你尝试过的代码。也许有人可以在您的代码中发现错误?您需要发布您的过滤器代码。
-
@Programmer 使用代码 sn-ps 更新。
-
我正在调查这个。同时开始为您的问题添加标签。 C# 标记适合于此,以使您的代码更具可读性