La configuración de la nave cambia dinámicamente, por lo que tengo que determinar qué propulsor encender cuando quiero rotar la nave en sentido horario o antihorario. Los propulsores siempre están alineados en el eje con el barco (nunca en ángulo) y están encendidos o apagados. Aquí hay una de las posibles configuraciones:
Lo que he intentado hasta ahora es visualizar el vector de disparo y el vector de dirección al centro de masa del barco:
Desafortunadamente, no llegué muy lejos con eso.
mathematics
physics
migimunz
fuente
fuente
Respuestas:
¡Éxito! Aquí está, y está girando como debería:
Lo que he hecho es lo siguiente: para cada propulsor, calculo la magnitud del par, en relación con el centro de masa.
La ecuación para la mangitude de torque, según wikipedia, es
T = rF sin(theta)
, donde:Cuando el jugador presiona hacia la izquierda, verifico el signo de torque para ese propulsor; si es menor que cero, disparo el propulsor. Es todo lo contrario para girar en sentido horario.
Esto probablemente podría mejorarse usando el producto de puntos para calcular el coseno del ángulo entre los vectores, pero eso tendrá que esperar hasta mañana.
Finalmente, aquí hay una demostración en vivo .
fuente
La expresión general 3D para el par es el producto cruzado de desplazamiento y fuerza: T = r ⨯ F . En dos dimensiones, un valor escalar para el par será suficiente, y dadas solo cuatro orientaciones ortogonales para los propulsores, podemos escribir en forma por partes:
Aquí, F es la magnitud de la fuerza generada por los propulsores, rx y ry son componentes x e y del vector desde el punto de pivote al propulsor. Los pares positivos tienden a rotar el barco en sentido antihorario. Usando las cuatro fórmulas anteriores, es trivial deducir el signo del par que produce cada propulsor.
Para una representación modestamente precisa de la física, no solo necesita conocer el signo del empuje, sino también su magnitud total y la inercia rotacional. Además, es posible que no desee simplemente activar todos los propulsores correctamente alineados para hacer una rotación.
Tal como se dibuja, la potencia total de los propulsores B, D y E maximizará la rotación, pero también acelerará la nave hacia la derecha. Cerrar D evitará esto. Si, en cambio, se pretende acelerar a la derecha, pero no es una rotación en el sentido de las agujas del reloj, la forma más eficiente de hacerlo es habilitar C y F a dos tercios de la potencia total junto con D.
Si esto no está fuera del alcance de lo que está tratando de hacer, tendría que escribir algún tipo de solucionador para las ecuaciones de movimiento, claramente no es una tarea simple.
fuente
Algunas cosas diferentes. Primero, debemos reconocer que este es un problema poco restringido. Es decir, hay muchas combinaciones diferentes de propulsores que pueden disparar para dar como resultado una rotación en la misma dirección. Supongo que en su situación solo hay dos estados para los propulsores, "encendido" y "apagado", y todos los propulsores producen la misma fuerza.
En segundo lugar, mirando su modelo, parece que su "centro de masa" no es realmente su centro de masa. Afortunadamente, esto no afectará sus cálculos para el par. Sin embargo, afectará sus cálculos para el centro de desplazamiento masivo. Sin embargo, no estoy seguro si le importa la precisión en ese nivel, ya que su "centro de masa" es al menos el cuadrado más cercano al verdadero centro de masa.
Tercero, si desea calcular cómo un determinado propulsor afectará la rotación, tiene razón, aunque esté utilizando una fórmula ineficiente. El par se puede calcular como
r x F
, que tiene magnitudr*F*sin(theta)
. Sin embargo, calcular los ángulos en este caso es un método ineficiente. En su lugar, debe usar la definición de par cruzado del producto directamente, ya que esto será mucho más simple usando las representaciones que tiene. Como todos sus vectores no tienen componente z, la fórmula para el producto cruzado se simplifica enormemente.Sin cambiar los resultados de su cómputo, podemos actualizar su código
Eso es mucho mejor (y más rápido).
Usted sugiere en su propia respuesta que su solución es disparar todos los propulsores con torque en la dirección correcta. Ahora, eso prácticamente resuelve la pregunta que hiciste. Sin embargo, espero que en algún punto a lo largo de la línea, encuentre que su estrategia no es tan satisfactoria, si un usuario mantiene presionado el botón "rotar", y todos los propulsores con un par positivo rotan, posiblemente moviéndolos hacia arriba de rotarlos (no estoy seguro del nivel de detalle de su simulación, si realmente calcula las fuerzas de los propulsores, o si simplemente les muestra visualmente disparando y luego gira su modelo con una aceleración constante o algo así. de esta manera, desea que los propulsores estén disparando al menos aproximadamente con precisión).
No tienes en cuenta la fuerza neta en el barco. Si tuviera cantidades arbitrarias de propulsores, esto podría convertirse en un problema bastante complicado. Sin embargo, dado que nuestros propulsores tienen solo dos estados, es bastante simple de analizar. No estoy seguro de cuál es exactamente nuestro objetivo aquí, por lo que podría imaginar dos diferentes: primero, queremos minimizar la fuerza total, manteniendo el par en la dirección que queremos. En segundo lugar, queremos maximizar la relación entre el par y la fuerza total.
Por otro lado, si pudiera imaginar un control adicional de "volumen del propulsor" que afecte la potencia de todos los propulsores simultáneamente, entonces podría configurar este control para que sus dos soluciones tengan el mismo par, y verá que la segunda solución solo puede tener un desplazamiento menor que el primero. Sin embargo, debemos recordar que si es posible disparar los propulsores para que solo gire y no se mueva en absoluto, entonces ambas soluciones serán las mismas.
Entonces, vamos a ir con la segunda solución, basada en los argumentos del párrafo anterior. Ahora, al analizar la fuerza total, simplemente podemos notar que solo hay cuatro direcciones que los motores pueden apuntar. Por lo tanto, la fuerza total en la dirección x es solo el número de propulsores que apuntan hacia la izquierda menos el número que apunta hacia la derecha, y lo mismo para la dirección y.
Después de escribir hasta aquí, tengo que pensar un poco más sobre el algoritmo para optimizarlo. Creo que el resto de mi publicación es útil, así que lo estoy publicando, pero lo actualizaré cuando encuentre la mejor manera de optimizar esta configuración (he pensado en algunas formas de obtener respuestas aproximadas, pero ninguno de ellos es exacto).
fuente