0

请参阅下面的代码,我从Game_Rotation_Vector传感器事件有4个数字和我想要实现的是让我的手机的轴旋转角度。如何转换游戏旋转矢量传感器结果轴角

例如。如果我将手机屏幕计数器时钟方向旋转90度,我想从传感器数据中获得90deg的实际值。

任何人都可以提供代码到4个游戏旋转矢量值转换为3轴的角度值?

+0

它看起来不错除了RT的东西,那是什么呢? – weston

+0

即将半径转换为角度。如果我把手机调到180度,ya只会从-40改为40.这应该是-90到90.不知道我的代码有什么问题。 – mind1n

+0

xa,xy和xz不是角度,它们是轴的坐标,请在我的答案中阅读链接。 – weston

回答

0

的值被放入单位四元数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,基本上可以不描述在三个角度,侧倾/俯仰/偏转,例如术语每一个可能的旋转以一定的俯仰和偏航角可以丧失滚动的能力。

所以要利用这一种方法是转换成旋转矩阵:

Source

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); 
} 
+0

感谢您的解释,我误解了轴角度的rot_axis。 那么如何从四元数值得到轴角?我迷失在数学中,需要一些代码示例。 – mind1n

+0

就像我说的,我认为你最好不要这样做,但我不知道更大的图像,即你将如何处理角度? – weston

+0

角度将用于控制我的笔记本电脑的鼠标光标位置。 例如,如果我把我的头从左向右,鼠标光标将遵循因为我的电话和我的笔记本电脑屏幕之间的距离可以被测量并且被配置。 所以我真的需要知道我的手机转过来的角度。谢谢。 – mind1n