请参阅下面的代码,我从Game_Rotation_Vector传感器事件有4个数字和我想要实现的是让我的手机的轴旋转角度。如何转换游戏旋转矢量传感器结果轴角
例如。如果我将手机屏幕计数器时钟方向旋转90度,我想从传感器数据中获得90deg的实际值。
任何人都可以提供代码到4个游戏旋转矢量值转换为3轴的角度值?
请参阅下面的代码,我从Game_Rotation_Vector传感器事件有4个数字和我想要实现的是让我的手机的轴旋转角度。如何转换游戏旋转矢量传感器结果轴角
例如。如果我将手机屏幕计数器时钟方向旋转90度,我想从传感器数据中获得90deg的实际值。
任何人都可以提供代码到4个游戏旋转矢量值转换为3轴的角度值?
的值被放入单位四元数like so:
sensors_event_t.data[0] = rot_axis.x*sin(theta/2);
sensors_event_t.data[1] = rot_axis.y*sin(theta/2);
sensors_event_t.data[2] = rot_axis.z*sin(theta/2);
sensors_event_t.data[3] = cos(theta/2)
所以,反向只是:
double theta = Math.acos(vals[3])*2;
double sinv = Math.sin(theta/2);
double xa = vals[0]/sinv;
double ya = vals[1]/sinv;
double za = vals[2]/sinv;
但是 XA,XY,XZ和不角度它们是文档中描述的坐标轴。我不确定你想要什么,你最好直接用单位四元数达到你未说明的目标。
使用unit quaternion的原因是为了避免gimble lock,基本上可以不描述在三个角度,侧倾/俯仰/偏转,例如术语每一个可能的旋转以一定的俯仰和偏航角可以丧失滚动的能力。
所以要利用这一种方法是转换成旋转矩阵:
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
// convert the rotation-vector to a 4x4 matrix. the matrix
// is interpreted by Open GL as the inverse of the
// rotation-vector, which is what we want.
SensorManager.getRotationMatrixFromVector(
mRotationMatrix , event.values);
}
它看起来不错除了RT的东西,那是什么呢? – weston
即将半径转换为角度。如果我把手机调到180度,ya只会从-40改为40.这应该是-90到90.不知道我的代码有什么问题。 – mind1n
xa,xy和xz不是角度,它们是轴的坐标,请在我的答案中阅读链接。 – weston