android - google - ¿Cómo puedo usar SensorManager.getOrientation para los controles de inclinación como "Mi avión de papel"?
google rotate 360 (1)
Mezclaste el acelerador y los conjuntos de sensores megnéticos. El código debe ser:
if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
m_lastAccels, m_lastMagFields)) {
Echa un vistazo a getRotationMatrix(..)
El juego para Android My Paper Plane es un gran ejemplo de cómo implementar controles de inclinación, pero he estado luchando por entender cómo puedo hacer algo similar.
Tengo el siguiente ejemplo que utiliza getOrientation() del SensorManager. Todo el asunto está en pastebin aquí . Simplemente imprime los valores de orientación a los campos de texto. Aquí está el fragmento más relevante:
private void computeOrientation() {
if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
m_lastMagFields, m_lastAccels)) {
SensorManager.getOrientation(m_rotationMatrix, m_orientation);
/* 1 radian = 57.2957795 degrees */
/* [0] : yaw, rotation around z axis
* [1] : pitch, rotation around x axis
* [2] : roll, rotation around y axis */
float yaw = m_orientation[0] * 57.2957795f;
float pitch = m_orientation[1] * 57.2957795f;
float roll = m_orientation[2] * 57.2957795f;
/* append returns an average of the last 10 values */
m_lastYaw = m_filters[0].append(yaw);
m_lastPitch = m_filters[1].append(pitch);
m_lastRoll = m_filters[2].append(roll);
TextView rt = (TextView) findViewById(R.id.roll);
TextView pt = (TextView) findViewById(R.id.pitch);
TextView yt = (TextView) findViewById(R.id.yaw);
yt.setText("azi z: " + m_lastYaw);
pt.setText("pitch x: " + m_lastPitch);
rt.setText("roll y: " + m_lastRoll);
}
}
El problema es que los valores que escupe parecen tonterías, o al menos no hay forma de aislar qué tipo de movimiento realizó el usuario. Dibujé un diagrama para indicar los 2 tipos de movimiento que me gustaría detectar: 1. "inclinación" para el tono y 2. "girar" para giro / dirección:
(Eso es una vista isométrica de un teléfono en modo horizontal, por supuesto)
Cuando inclino el teléfono hacia adelante y hacia atrás a lo largo de su eje largo, que se muestra con 1. - Esperaba que solo uno de los valores cambiara mucho, pero todos parecen cambiar drásticamente. De manera similar, si giro el teléfono sobre una línea imaginaria que sale de la pantalla, como se muestra en 2., espero que solo cambie el valor de balanceo, pero todos los valores cambien mucho.
El problema es cuando calibro mi juego, lo que significa registrar los valores actuales de los ángulos x, y, z. Más tarde, no sé cómo interpretar los ángulos entrantes actualizados para decir "ok, parece que has inclinado el teléfono y tú Quiero rodar 3 grados a la izquierda ". Es más bien como "está bien, has movido el teléfono y te estás inclinando y rodando al mismo tiempo", incluso si la intención era solo una tirada. ¿Tener sentido?
¿Algunas ideas? He intentado usar remapCoordinateSystem para ver si cambiar el eje tiene algún efecto. Sin alegría. Creo que me falta algo fundamental con esto :-(