【问题标题】:How to smooth gyroscope input?如何平滑陀螺仪输入?
【发布时间】: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# 标记适合于此,以使您的代码更具可读性

标签: c# unity3d gyroscope


【解决方案1】:

在使用模拟输入时始终使用噪声消除,您可以通过计算当前帧中的陀螺仪值与前一帧中的陀螺仪值之间的差异来实现,如果差异大于所需的量(0.002 或 0.03 可能很好)在陀螺仪值上旋转相机。 这最终将解决您的抖动问题。希望您能得到它

【讨论】:

    【解决方案2】:

    发现问题;我前面提到的任何一种方式在正常情况下都是有效的(使用组合以获得最佳效果)。导致疯狂抖动的原因是相机的位置。它有非常大的数字作为坐标,我猜这弄乱了引擎。

    【讨论】:

      【解决方案3】:

      你好,虽然我认为你已经找到了解决方案,但我对如何使用 Quaternion.Lerp 进行平滑处理有一个想法。

      #腐烂是用来面朝前的

      Quaternion rot = new Quaternion(0,0,1,0)
      Quaternion.lerp(transform.rotation* rot,gyro*rot,10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多