¿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.
- Pasar parámetros con HttpURLConnection
- El cambio amplía la clase de actividad
- Cómo descodificar la cadena base64 y convertirla en pdf / jpg y guardarla en almacenamiento
- PointerIndex fuera de rango Multitouch para Android
- Encontrar y Android NSD-Service desde un dispositivo que no sea Android
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.
- ¿Es posible, y cuál es la mejor estrategia, pasar objetos por referencia de una actividad a la siguiente?
- Error de RPC con Geocoder
- Cómo afilar una imagen en Android?
- Android: cómo acceder a la tabla de contactos de SIM con el SDK?
- ¿Cómo obtengo espacios pequeños como separador de números en Android?
- Convertir valor segundos a horas minutos segundos?
- Cómo crear un archivo apk en la línea de comandos?
- Error: Falló la captura de Logcat: spawn ENOENT
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.
- Android databinding en android: atributo de fondo utilizando código de color de cadena
- ¿Cómo determino qué triángulo tocó el usuario en este rectángulo?