2010-12-28 38 views
9

Tengo una vista de OpenGL ES en Android que está controlada por una matriz para la traducción. Estoy tratando de encontrar una manera de obtener un toque de desplazamiento de impulso como se ve en la aplicación Google Maps o el iPhone. Gracias.desplazamiento suave/scroll inercial/impulso scroll

Respuesta

11

Si su problema es en 2D, es bastante simple

  1. que necesita para obtener el tiempo transcurrido en cada cuadro
  2. Su onTouch función encontrará la aceleración de su dedo. Olvidé la fórmula sobre cómo obtener la aceleración desde la distancia. Debería ser la segunda derivada de posición con una variable de tiempo. Pero siempre debes convertir tu deltaX, deltaY en aceleración. Para hacerlo más fácil, no necesitas poner algo preciso allí. Editar: No sé por qué no lo vi, pero la función estaba allí ...

    acceleration.x = 2 (newposition.x - position.x - speed.x * elapsedTime)/(elapsedTime * tiempo transcurrido);

  3. Una vez que tenga su aceleración, puede establecer su nueva posición con ese código. Esta es una dinámica física simple en 2d. Con su aceleración puede encontrar su velocidad y con su velocidad puede encontrar su siguiente posición.

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x); 
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y); 
    
    
    position.x += mass * acceleration.x/2 * elapsed * elapsed + speed.x * elapsed; 
    position.y += mass * acceleration.y/2 * elapsed * elapsed + speed.y * elapsed; 
    
    
    speed.x *= friction; 
    speed.y *= friction; 
    

misa y la fricción le permitirá definir qué tan rápido se va y la rapidez con que se ralentizará por sí mismo. Probablemente tendrá que ajustar el código porque esta dinámica no es exactamente buena si tiene que desplazarse hacia atrás para reducir la velocidad.

Al final de cada cuadro, tendrá que restablecer su aceleración a (0,0). Y en cada nuevo fotograma después de un toque par, la aceleración debe configurarse en algo. Debería funcionar muy bien :)

+1

Estaba mirando su respuesta y me pregunto cómo obtendrá velocidad para usar en aceleración cuando su fórmula de velocidad requiera aceleración ... ¿Una depende y requiere la otra? – Dan

+0

En lugar de calcular la velocidad directamente, puede dar mejores resultados para usar la aceleración. La velocidad inicial y la aceleración son 0. Por lo tanto, debe guardar la velocidad en algún lugar para agregarla al siguiente cuadro. La aceleración no es más que el cambio entre cada cuadro. La aceleración podría ser deltaX, deltaY. La velocidad real será esa deltaX * elapsedTime + lastSpeed. De esta manera, la velocidad se calcula correctamente, incluso si un cuadro toma mucho tiempo o una pequeña cantidad de tiempo. Otros parámetros falsifican un poco de físico para agregar la inercia y la fricción. Realmente no quieres que se desplace para siempre. –

1
  1. Mida la velocidad a la que se desplaza la vista.
  2. Detecta cuando el usuario deja de desplazarse.
  3. Disminuya gradualmente la velocidad a la que se desplaza la vista de desplazamiento.

Algo como esto:

public void redraw() { 
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y; 
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x; 
    if (!userIsScrolling && ySpeed > 0) { 
     ySpeed--; 
    } 
    if (!userIsScrolling && xSpeed > 0) { 
     xSpeed--; 
    } 
    myScrollView.lastY = myScrollView.y; 
    myScrollView.y += ySpeed; 
    myScrollView.lastX = myScrollView.x; 
    myScrollView.x += xSpeed; 
} 

public void userStoppedScrolling() { 
    userIsScrolling = false; 
} 
+0

gracias, ¿sabe exactamente cómo podría controlar la velocidad a la que el usuario está desplazándose? En este momento solo calcula el delta entre la posición inicial y la posición final del dedo del usuario y luego lo coloca en la matriz. – jfisk

+0

Lo siento, no conozco Android lo suficiente como para ayudar con detalles como la ubicación táctil y tal. – Jumhyn