¿Cómo puedo mover objetos por velocidad correctamente?

Recientemente comencé a jugar con android y decidí intentar hacer un simulador de física básica, pero he encontrado un pequeño problema.

Tengo mi objeto de Ball, cada bola tiene un vector de velocidad, y la forma en que lo muevo es añadiendo dicho vector a la ubicación de la bola con cada tick. Funcionó bastante bien hasta que noté un problema con este enfoque.

Cuando traté de aplicar la gravedad a las bolas me di cuenta de que cuando dos bolas se acercaron una de las bolas se lanza gran velocidad.

Después de un poco de depuración encontré la razón de que eso suceda. He aquí un ejemplo de cómo calculo la fuerza de la gravedad y la aceleración:

//for each ball that isn't this ball for (Ball ball : Ball.balls) if (ball != this) { double m1 = this.getMass(); double m2 = ball.getMass(); double distance = this.getLocation().distance(ball.getLocation()); double Fg = 6.674*((m1*m2)/(distance * distance)); Vector direction = ball.getLocation().subtract(this.getLocation()).toVector(); Vector gravity = direction.normalize().multiply(Fg / mass); this.setVeloctity(this.getVelocity().add(gravity)); } 

Aquí está el problema – cuando las bolas se ponen muy cerca, la fuerza de la gravedad se vuelve muy alta (como debería) así que la velocidad también se hace increíblemente alta, pero porque agrego el vector a la localización cada tick, y el valor del vector es tan alto, uno De las bolas se expulsa.

Así que me lleva a mis preguntas – ¿hay una mejor manera de mover sus objetos que no sean sólo la adición de vectores? Además, ¿existe una mejor manera de manejar la gravedad?

Aprecio cualquier ayuda que ustedes podrían ofrecer.

Usted puede intentar esto:

 acceleration.y = force.y / MASS; //to get the acceleration force.y = MASS * GRAVITY_Constant; // to get the force displacement.y = velocity.y * dt + (0.5f * acceleration.y * dt * dt); //Verlet integration for y displacment position.y += displacement.y * 100; //now cal to position new_acceleration.y = force.y / MASS; //cau the new acc avg_acceleration.y = 0.5f * (new_acceleration.y + acceleration.y); //get the avg velocity.y += avg_acceleration.y * dt; // now cal the velocity from the avg 

(Aceleración, velocidad, desplazamiento y posición) son vectores para tu bola.

* Nota (dt = Tiempo Delta que es el tiempo de diferencia entre el fotograma actual y el anterior.

Necesitas estudiar la física del problema. Obviamente es una mala idea agregar una fuerza o aceleración a una velocidad, las unidades fisicas no pueden igualar.

Así, en el caso más primitivo, con un paso de tiempo dt , es necesario implementar

 velocity = velocity + acceleration * dt 

El siguiente problema a considerar es que primero hay que acumular todas las fuerzas resp. Las aceleraciones resultantes para el estado (posiciones y velocidades) de todos los objetos en un momento dado antes de cambiar simultáneamente el estado completo para su estado (aproximado) en el siguiente paso de tiempo.

  • Estudio androide java.lang.NoClassDefFoundError:
  • ¿Cómo puedo leer las pausas en el texto descargado?
  • Deserializar un objeto JSON con múltiples elementos dentro de él
  • Convertir una cadena en un Uri ... (Android)
  • Android: Hacer el botón holo predeterminado opaco
  • Javah: Error: no se puede acceder a android.support.v7.app.ActionBarActivity
  • El objeto no es parte del esquema para este reino
  • Descarga de hojas de cálculo de Google Sheets desde Google Drive en Android
  • Configuración de la aplicación de Android
  • Java Static Variable se convierte en nulo
  • Intentando utilizar el tema holo en Android no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.