OK He encontrado algo que parece funcionar, pero todavía tengo algunos problemas. Así es como procedo (admitiendo que el dispositivo se sostiene verticalmente):
1 - Tengo mis valores predeterminados x, y, z.
2 - Extraigo el vector de gravedad de estos datos usando un filtro de paso bajo.
3 - Restamos el vector de gravedad normalizado de cada x, y, y z, y obtenemos la aceleración del movimiento.
4 - Luego, integro este valor de aceleración con respecto al tiempo, así que obtengo la velocidad.
5 - Integro esta velocidad nuevamente con respecto al tiempo, y encuentro una posición.
Todo el código de abajo es en el acelerómetro: didAccelerate: delegado de mi controlador. Estoy tratando de hacer que una bola se mueva según la posición que encontré. Aquí está mi código:
NSTimeInterval interval = 0;
NSDate *now = [NSDate date];
if (previousDate != nil)
{
interval = [now timeIntervalSinceDate:previousDate];
}
previousDate = now;
//Isolating gravity vector
gravity.x = currentAcceleration.x * kFileringFactor + gravity.x * (1.0 - kFileringFactor);
gravity.y = currentAcceleration.y * kFileringFactor + gravity.y * (1.0 - kFileringFactor);
gravity.z = currentAcceleration.z * kFileringFactor + gravity.z * (1.0 - kFileringFactor);
float gravityNorm = sqrt(gravity.x * gravity.x + gravity.y * gravity.y + gravity.z * gravity.z);
//Removing gravity vector from initial acceleration
filteredAcceleration.x = acceleration.x - gravity.x/gravityNorm;
filteredAcceleration.y = acceleration.y - gravity.y/gravityNorm;
filteredAcceleration.z = acceleration.z - gravity.z/gravityNorm;
//Calculating velocity related to time interval
velocity.x = velocity.x + filteredAcceleration.x * interval;
velocity.y = velocity.y + filteredAcceleration.y * interval;
velocity.z = velocity.z + filteredAcceleration.z * interval;
//Finding position
position.x = position.x + velocity.x * interval * 160;
position.y = position.y + velocity.y * interval * 230;
Si ejecuto esto, llegar a ser muy buenos valores, quiero decir que puedo ver la aceleración de entrar en valores positivos o negativos según los movimientos que hago. Pero cuando trato de aplicar esa posición a mi vista de bola, puedo ver que se está moviendo, pero con una propencidad para ir más en una dirección que en la otra. Esto significa, por ejemplo, que si dibujo círculos con mi dispositivo, veré la bola describiendo curvas hacia la esquina superior izquierda de la pantalla. Algo así: http://img685.imageshack.us/i/capturedcran20100422133.png/
¿Tiene alguna idea sobre lo que está sucediendo? ¡Gracias de antemano!
Bien, voy a trabajar en esto. Gracias ! –
Necesita integrar * dos veces * para pasar de la aceleración al desplazamiento. –