#6 <respuesta al inciso>
Pues por lo que veo lo que yo quiero hacer es parecido a lo tuyo. Te recomiendo Box2D porque veo que vas a trabajar en el plano para mover los objetos. A mí no me vale porque es 2D, pero a ti te va a salvar el culo probablemente xDD Como se tuvo que portar a la DS para nosequé juego homebrew, se hizo el parche para que use aritmética de coma fija, y se acabó integrando en la rama principal de la librería, así que lo puedes compilar como coma fija o flotante. Si lo usas como coma fija, el resultado es determinista al 100% dado unas condiciones iniciales y entradas (o al menos así debería ser.)
Por eso mismo yo necesito la reproducibilidad también. Los clientes sólo conocen un estado inicial y comparten, al final del turno, unas entradas para cada entidad, resolviéndola cada una en su PC. Se puede sincronizar el estado final, pero paaaaaso xD No me parece elegante para un juego que no es real-time, y además, aunque la arquitectura que tengo pensada es cliente-servidor, probablemente también implemente un modelo P2P que creo que es lo que quieres hacer tú, y no quiero que ninguno de los dos clientes sea autoritativo.
Mi idea inicial cuando aún pensaba en el modelo p2p exclusivo era que cada cliente, al dar el botón de "finalizar turno", mandase un hash de las entradas que ha definido al resto de clientes. Cuando todos los clientes finalizan turno, estos intercambian sus respectivas entradas y verifican que no difiere el hash de lo que han recibido del resto con los hashes que recibieron previamente (para evitar cheating.)
Procesadores del lenguaje yo doy el año que viene, a ver qué tal, porque ya me comí mucho la cabeza en su día implementando scripting (y acabé bindeando LUA por desespración.)
</inciso>
Por ejemplo, si tiene dos motores a los lados y uno delante para frenar, puede probar con varias combinaciones. Puedes evaluar lo bueno o lo malo de una solución viendo la distancia a la que te deja esa combinación de tu objetivo (a la inversa).
Es más o menos lo que tenía pensado, hacer esto todo el rato según va siguiendo el camino, pero es taaaaan hacky que me da miedo. Además como tú mismo dices, cuantos más motores y estados intermedios, más complejo todo, pero creo que se acerca un poco más a la solución que cualquier otra cosa.
Siempre puedes hacer otra cosa, y es usar una IA así en el desarrollo, y con las salidas que te de, intentar sacar un modelo que no necesite un algoritmo de búsqueda. No sé si me explico xD
¿Te refieres a una IA que aprenda? Yo esto también lo había pensado, que las naves cuanto más las utilices más "aprendan", y vayan guardando esos datos para ir aprendiendo cada vez más de sus errores (o aciertos) con una red neural o algo así. Un poco locura igualmente, no me quiero meter en movidas de IA taaaaaan complejas si no es necesario.
De todas formas me acabo de dar cuenta de una cosa según escribía esto que puede simplificar mucho el tema, así que lo desarrollo un poco, hago una imagen explicativa y edito el post en cuanto pueda.
#7 un cuerpo no creo que acelere continuamente y si son naves espaciales a no ser que choquen alcanzaran una velocidad máxima (constante) y la aceleración será 0.
Eso lo manejo no con velocidad máximas, sino con pérdidas de energía (damping en inglés, ni idea en castellano.) El resultado es el mismo y cuadra con el modelo físico que quiero implementar.
Lo del reparto de energia es arbitrario creo que no deberias complicarte en principio demasiado con eso.
¿Te refieres a lo que he explicado del sistema de balanceo en base a energías y tal? Eso no me como la cabeza, fue lo primero que pensé y en lo que se basa toda la dinámica del juego, pero hasta que no esté hecho no puedo empezar a balancear este aspecto. Si te refieres a que el sistema conserve la energía, es esencial. Estos sistemas tienden a explotar al intentar discretizar cosas que son continuas. Te puedes imaginar lo que le pasa a un sistema cerrado que va acumulando cada vez más energía...
Lo de la velocidad-fuerza y tal, no es un gran fallo, pero en estos casos importa más de lo que parece. Ya tengo muchas horas de física de juegos a mis espaldas, es una puta locura por cosas como que no puedes considerar la velocidad como un efecto de una fuerza. Para que no explote, la velocidad debe integrar a partir de la aceleración, y esta a su vez desde el momento, y este a su vez desde impulsos. En esas integraciones los sistemas tienden a acumular energía al estar tratando cosas continuas como discretas, y sobre todo si se unen efectos como rozamiento y demás, que modifican los diferentes valores en mitad del procesado (obligando a re-integrar y, si no tienes cuidado, te salen constantes donde no las hay.)
Por ejemplo, integración euleriana básica:
v += at
s += vt
Ahí ya ha habido un error enorme, puesto que la velocidad ¡no es constante!
Si se realiza la integración euleriana de forma semiimplícita:
s = s0 + v0t + 0.5at*t
Se medio-arregla el efecto, pero al ser un método de integración de primer orden se cometen errores igualmente. El primero no funciona bien nunca, a no ser que la velocidad sea constante. El segundo, si la aceleración es constante (que en el caso de un juego de naves espaciales, no lo es.)
Hay formas mejores de integrar los valores para eliminar esos efecto (Euler es un método de integración de primer grado solo), pero sigue siendo importante la diferenciación entre velocidades, aceleraciones, fuerzas, etc.
EDIT: #6, esto era lo que había pensado en mitad de escribir el post. Si tú tienes un motor (definido por un vector perpendicular al plano donde está anclado, y un punto de anclaje) y un destino (formando un vector con el punto de anclaje), cuanto más parecido a 180º sea el ángulo que forman ambos vectores, menos hay que acelerar ese motor, y cuando llegan a 0º el motor hay que darlo a tope (¡línea recta!) y funciona igual en 3D que en 2D. Esto es mucho más factible de realizarse en cada paso, y así a primera vista no le veo ningún fallo, incluso aunque genere rotación, ya que no se consideran trayectorias sino la posición actual en cada timestep.
Creo que saldrá algo poco óptimo, pero al fin y al cabo bastante humano. En nuestro cerebro creo que haríamos algo parecido al manejar una nave con propulsores.
Creo que por aquí van los tiros. Ah, ¡y gracias a ambos por las respuestas!