【发布时间】:2017-12-20 07:27:00
【问题描述】:
使用来自 Thalmic 的 Myo 臂章的原始陀螺仪数据,我几乎能够在 Unity3D 中控制对象在 2D 空间中的移动(类似于光标的移动)。
我试图通过一系列旋转和变换将陀螺仪数据从它自己的轴/参考系转换为世界参考系。
除了一个错误之外,一切都可以编译,当忽略此错误时,对象会随着陀螺仪的旋转而移动,但最终的 x/y 坐标会向错误的方向倾斜。
如果我错了,请纠正我,但我的 general approach 将是:
- 获取陀螺仪矢量
- 按方向四元数(来自加速度计)旋转以对齐 到世界空间
- 获取旋转右向量的归一化四元数
- 通过此四元数旋转来自 (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