【问题标题】:Quaternion rotation for gyroscope frame-of-reference conversion in Unity 3DUnity 3D 中陀螺仪参考系转换的四元数旋转
【发布时间】:2017-12-20 07:27:00
【问题描述】:

使用来自 Thalmic 的 Myo 臂章的原始陀螺仪数据,我几乎能够在 Unity3D 中控制对象在 2D 空间中的移动(类似于光标的移动)。

我试图通过一系列旋转和变换将陀螺仪数据从它自己的轴/参考系转换为世界参考系。

除了一个错误之外,一切都可以编译,当忽略此错误时,对象会随着陀螺仪的旋转而移动,但最终的 x/y 坐标会向错误的方向倾斜。

如果我错了,请纠正我,但我的 general approach 将是:

  1. 获取陀螺仪矢量
  2. 按方向四元数(来自加速度计)旋转以对齐 到世界空间
  3. 获取旋转右向量的归一化四元数
  4. 通过此四元数旋转来自 (2) 的对齐向量,以获得来自 (2) 和 (y) 的向量的补偿向量 (-z) 分量 来自 (4) 的补偿向量的分量将给出所需的 dx 和 dy 值

这是我的方法: 调用转换函数,输入陀螺数据、当前方向和xDirection(手环是正对手腕还是反方向):

Vector2 dxdy = gyroConversion (thalmicMyo.gyroscope, myo.transform.rotation, thalmicMyo.xDirection);

transform.Translate (dxdy [0], dxdy [1], 0, Space.World);

陀螺转换函数:

Vector2 gyroConversion (Vector3 gyroData, Quaternion orientation, object xdir) {

    // Convert gyro data from the gyroscope's frame of reference to the world frame of reference.

    // Rotate gyroData by orientation quaternion.
    Vector3 gyroWorldData = orientation * gyroData;

    // Check which direction the armband is facing.
    if (xdir.Equals(Thalmic.Myo.XDirection.TowardWrist)) {
        Vector3 forwardSource = new Vector3 (1, 0, 0);
    }

    else {
        Vector3 forwardSource = new Vector3 (-1, 0, 0);
    }

    Vector3 right = Vector3.Cross(forward, new Vector3 (0, 0, -1));
    Vector3 up = new Vector3 (0, 1, 0);

    Quaternion yQuat = Quaternion.FromToRotation(right, up);

    float m = Mathf.Sqrt(yQuat.w * yQuat.w +
        yQuat.x * yQuat.x +
        yQuat.y * yQuat.y +
        yQuat.z * yQuat.z);

     yCompNorm = new Quaternion (yQuat.w / m, yQuat.x / m, yQuat.y / m, yQuat.z / m);

    Vector3 gyroCompensated = yCompNorm * gyroWorldData;

    Vector2 coordinates = new Vector2 (-gyroWorldData.z, gyroCompensated.y);

    return coordinates; }

注意:forwardSource 导致错误告诉我它“在当前上下文中不存在”,但是当存在单个 forwardSource 定义而不是 if-else 对时,它可以正常工作,这就是我知道所需的物体实际上在移动,只是非常奇怪。似乎我在陀螺仪上的左右运动在 Unity 中产生了上下运动。

这可能是旋转的问题,但我看不出在哪里。

【问题讨论】:

    标签: c# math unity3d vector quaternions


    【解决方案1】:

    似乎我在陀螺仪上的左右移动正在 Unity 中产生上下移动。

    不确定这是否是问题所在,但在 Unity 使用 左手坐标 系统时,陀螺仪 Input.gyro.attitude 传感器值以右手坐标返回。您需要先将陀螺仪(右手坐标)转换为左手坐标,然后再尝试使用它来移动对象。

    private static Quaternion GyroToUnity(Quaternion q)
    {
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    }
    

    ...

    Quaternion convertedValue = GyroToUnity(Input.gyro.attitude);
    

    现在,您可以使用 convertedValue 变量进行其他计算或移动对象/相机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多