2017-07-15 200 views
1

我几乎能够控制的物体的2D空间中Unity3D运动(类似于光标的移动),使用从Thalmic的缪袖标原始陀螺仪数据。四元数旋转,用于帧的参考陀螺仪的转换在Unity 3D

我试图通过一系列旋转和变换的从参考的参考世界坐标系其自身的轴线/帧变换陀螺仪数据。

一切编译除了单一错误,以及何时被忽略该错误,对象移动时作为陀螺旋转,但最终的x/y坐标是在错误方向歪斜。

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

  1. 获取陀螺仪矢量
  2. 通过定向四元旋转它(从加速度计)看齐, 到世界空间
  3. 获得旋转右向量的归一化四元数
  4. 通过此四元数旋转从(2)对齐的向量获得来自Vector的补偿矢量(-z)组分(2)和(y)从补偿矢量的 组分(4)将得到期望的DX 和dy值

这里是我的方法: 调用转换功能,输入陀螺数据,当前方向和X方向(是否带朝向手腕或反转):

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

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

的gyroConversion功能:

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中产生上下运动。

很可能与转出了问题,但我看不出哪里。

回答

0

好像我对陀螺左右运动产生在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变量您的其他计算或移动对象/相机。