如何在Unity 3D中平滑加速度计和方向传感器值

本文关键字:加速度计 方向 传感器 平滑 Unity 3D | 更新日期: 2023-09-27 18:21:19

我正在开发一款以手机为控制器的桌面游戏。游戏采用Unity 3D开发,使用SensoDuino Android应用程序通过蓝牙发送加速度计和方位传感器值。这些值以100ms的频率发送。但手机的运动与其在游戏中的反映之间存在滞后。如何在没有任何急动或跳跃的情况下减少滞后并按1:1的比例绘制运动图。这是我正在使用的代码-

串行端口连接完成后,使用以下代码从端口读取数据

void recData() {
    if ((sp != null) && (sp.IsOpen)) {
        byte tmp;
        string data = "";
        string avalues="";
        tmp = (byte) sp.ReadByte();
        while(tmp !=255) {
            data+=((char)tmp);
            tmp = (byte) sp.ReadByte();
            if((tmp=='>') && (data.Length > 30)){
                avalues = data;
                parseValues(avalues);
                data="";
            }
        }
    }
}

由于Unity不允许从另一个线程访问主线程上的对象,我在parseValues()中设置了一个布尔变量moveObject = true(将传入字符串转换为浮点值)。此布尔值在Update()函数中进行检查,如果为true,则使用以下函数来移动对象。

void moveObj(float x, float y) {
        speed = 15.0f;
        Vector3 move = Vector3.zero ;
        move.x = x;
        move.y = y;
        move.Normalize();
        // low pass filter
        prevY = (0.8f * prevY) + ((1.0f - 0.8f) * move.y);
        prevX = (0.8f * prevX) + ((1.0f - 0.8f) * move.x);
        transform.Translate((-prevX * speed) * Time.deltaTime,(prevY * speed)* Time.deltaTime, -0.1f, Space.World);
        readyToMove = false;

我尝试使用一个简单的低通滤波器来平滑值,并使用平移来移动对象。问题是没有1:1的移动映射。存在滞后。我该怎么解决这个问题?如何从另一个线程访问主线程中的对象?

如何在Unity 3D中平滑加速度计和方向传感器值

要解决"滞后"问题,可以使用可用的插值函数。

Vector3.SmoothDamp(transform.position, targetPosition, velocity, time);

替代方案:

Vector3.MoveTowards(start.position, end.position, time);
Vector3.Lerp(start.position, end.position, time);