C# 使用罗盘和加速度计统一模拟陀螺仪

C# 使用罗盘和加速度计统一模拟陀螺仪,c#,unity3d,accelerometer,gyroscope,C#,Unity3d,Accelerometer,Gyroscope,我一直在尝试使用加速度计和指南针模拟统一的陀螺仪行为。到目前为止,我已经实现了一些功能,但仍然有一个滞后;反应迟钝。它改变视野的速度不如移动电话的倾斜速度快。感谢您的帮助,并提前向您表示感谢 注意:Z轴旋转仍然没有添加 using System.Collections; using System.Collections.Generic; using UnityEngine; public class GyroSimulator : MonoBehaviour { float zValue;

我一直在尝试使用加速度计和指南针模拟统一的陀螺仪行为。到目前为止,我已经实现了一些功能,但仍然有一个滞后;反应迟钝。它改变视野的速度不如移动电话的倾斜速度快。感谢您的帮助,并提前向您表示感谢

注意:Z轴旋转仍然没有添加

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GyroSimulator : MonoBehaviour {

float zValue;
float zValueMinMax = 5.0f;
Vector3 accelometerSmoothValue;
//Smooth Accelerometer
public float AccelerometerUpdateInterval = 1.0f / 100.0f;
public float LowPassKernelWidthInSeconds = 0.001f;
public Vector3 lowPassValue = Vector3.zero;
void Start () {
    Screen.orientation = ScreenOrientation.LandscapeLeft;
    Input.compass.enabled = true;
}
//Update is called once per frame
void Update () {
    //Set Z Min Max
    if (zValue < -zValueMinMax)
        zValue = -zValueMinMax;

    if (zValue > zValueMinMax)
        zValue = zValueMinMax;

    accelometerSmoothValue = LowPass();
    zValue += accelometerSmoothValue.z;

    transform.rotation = Quaternion.Slerp(
        transform.rotation,
        Quaternion.Euler(
            -zValue*5.0f,
            Input.compass.magneticHeading, 
            0
            ),
        Time.deltaTime*5.0f
        );
}

Vector3 LowPass()
{
    Vector3 tilt = Input.acceleration;
    float LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds;
    lowPassValue = Vector3.Lerp(lowPassValue, tilt, LowPassFilterFactor);
    return lowPassValue;
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类陀螺模拟器:单行为{
浮点数;
浮动zValueMinMax=5.0f;
矢量3加速度计平滑值;
//平滑加速度计
公共浮子加速度计更新间隔=1.0f/100.0f;
公共浮点低通内核宽度Unseconds=0.001f;
公共向量3低通值=向量3.0;
无效开始(){
Screen.orientation=ScreenOrientation.LandscapeLeft;
Input.compass.enabled=真;
}
//每帧调用一次更新
无效更新(){
//设置Z最小值最大值
if(zValue<-zValueMinMax)
zValue=-zValueMinMax;
如果(zValue>zValue最小值)
zValue=zValueMinMax;
加速度计平滑值=低通();
zValue+=加速度计平滑值.z;
transform.rotation=Quaternion.Slerp(
变换,旋转,
四元数欧拉(
-Z值*5.0f,
Input.compass.magneticHeading,
0
),
时间。deltaTime*5.0f
);
}
矢量3低通()
{
矢量3倾斜=输入加速度;
float LowPassFilterFactor=加速度计更新间隔/LowPassKernelWidthInSeconds;
lowPassValue=Vector3.Lerp(lowPassValue、tilt、LowPassFilterFactor);
返回低通值;
}
}

我注意到,每个循环都会向输入加速值倾斜,而不是直接设置。然后,您还可以向最终方向滑动四元数,而不是直接设置(或偏移)四元数。这些可能是导致您延迟的原因吗?谢谢,那么您能解释一下,在没有LERP和SLERP的情况下,我应该如何直接设置它吗。这是我能想到的实现这一点的唯一方法。transform.rotation=Quaternion.Euler(-zValue*5.0f,Input.compass.magneticHeading,0);