나는 당신이 당신의 선박에 대해 물리적으로 올바른 움직임을 가지고 있다고 가정합니다. 그렇지 않으면이 분석은지지 않을 것입니다. 이 문제를 올바르게 해결하려면 효율성보다 강력한 것이 필요합니다.
각 스러 스터는 선박의 움직임에 선형 및 각의 두 가지 영향을 미칩니다. 이들은 독립적으로 고려 될 수 있습니다. 스러 스터가 f
방향으로 힘 을 생성하고 dir
벡터 r
(기하학적 중심 또는 스프라이트의 중심이 아님)에 의해 질량 중심으로부터 오프셋되는 경우 선형 구성 요소에 대한 영향은 다음과 같습니다.
t = f * dir // f is a scalar, dir is unit length
각속도에 대한 영향은 토크에 의해 주어진다 :
tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product
t
힘 벡터 (즉, 선형 추력)입니다. tau
는 질량 관성 모멘트로 나눌 때 각도 가속을 제공하는 부호있는 스칼라입니다. 것이 중요 dir
와 r
같은에서 모두, 즉 로컬 좌표 또는 두 가지 모두 세계 좌표, 좌표 공간.
선박의 전체 선형 가속은 t
각 추진기의 의 합을 선박의 질량으로 나눈 값으로 제공됩니다. 마찬가지로, 각가속도는 토크의 합계를 질량 관성 모멘트 (다른 스칼라)로 나눈 값입니다. 총 토크가 0이면 선박이 회전하지 않습니다. 마찬가지로 총 추력이 0이면 이동하지 않습니다. 리콜 토크는 스칼라이지만 추력 (의 합 t
)은 2D 벡터입니다.
이 설명의 요점은 이제 문제를 선형 프로그램 으로 작성할 수 있다는 것 입니다. 먼저 배가 움직이지 않고 회전 하길 원한다고하자 . 각 스러 스터마다 $ x_1, x_2, ... $ 변수가 있으며, 이는 스러 스터가 제공 할 추력의 양입니다. 제약 조건 중 하나는 다음과 같습니다.
0 <= x_i < fmax_i //for each i
fmax
그 스러 스터의 최대 힘은 어디에 있습니까 ? 다음으로 우리는 두 평등이 있다고 말합니다.
0 = Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
이것은 전체 추력이 0이라고 말함으로써 선형 가속을 적용하지 않는다는 제약을 인코딩합니다 (추력은 벡터이므로 각 부분은 0이라고합니다).
이제 우리는 배가 돌아 가기를 원합니다. 아마도 우리는 가능한 빨리 그렇게하기를 원하기 때문에 :
max (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>
에 대한 해결 x_i
요약 위의 극대화, 위의 불평등과 평등을 만족 동안의 우리에게 원하는 추력을 제공 할 것입니다. 대부분의 프로그래밍 언어에는 LP 라이브러리가 있습니다. 위의 문제를 여기에 넣으면 답이 나옵니다.
비슷한 문제로 우리는 돌지 않고 움직일 수 있습니다. 양의 x 방향으로 이동하려는 좌표계에서 문제를 다시 씁니다. 그런 다음 제약 조건은 다음과 같습니다.
0 <= x_i < fmax_i //for each i
max Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
0 = (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before
스러 스터가 한 방향으로 만 스러스트를 생성 할 수 있다는 제약으로 인해 달성 할 수있는 회전 및 선형 속도의 종류가 제한됩니다. 이것은 해결책 인 것으로 표시되어 0 = x_1 = x_2 = ... = x_n
어디에서도 얻을 수 없습니다. 이를 완화하기 위해, 각 플레이어에 대해 작고 약한 (예 : 5 % 또는 10 %) 스러 스터 쌍을 추가하여 각 측면에 45 도의 스러 스터를 배치하는 것이 좋습니다. 이는 주 추진기의 약한 보조 효과에 대응할 수 있기 때문에 솔루션에 더 많은 유연성을 제공합니다.
마지막으로, 최대 100 개의 스러 스터를 통해 LP에 대한 솔루션은 프레임 당 수행 할 수있을 정도로 빠릅니다. 그러나 솔루션은 위치 또는 현재 상태에 의존하지 않기 때문에 모양이 변경 될 때마다 각 적절한 컨트롤러 입력 조합에 대한 솔루션을 사전 계산할 수 있습니다 (관성 모멘트 또는 선박의 질량을 변경하는 추력기 추가, 스러 스터는 질량 중심과 다른 위치에 있기 때문입니다!). 이것은 24 가지 가능성입니다 (즉, 8 방향 시간 {왼쪽 회전, 회전 없음, 오른쪽 회전}).