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 magnitud r*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
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
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).