우주선의 동적 스러 스터 밸런싱


14

내 게임에서 우주선은 회전 할 때마다 임의의 양의 스러 스터가 부착 된 플레이어 빌드를 의미합니다. 현재 배를 주어진 각도 (가속 및 감속)로 회전시키는 더러운 코드가 있습니다.

다음은 빨간색 선이 향하고 왼쪽으로 회전하라는 대칭 선박의 예입니다.

배

그러나 플레이어가 스러 스터를 어디에 두 었는지에 따라 원치 않는 선형 힘이 배에 영향을 미치는 경우가 있습니다. 이 경우 배는 앞으로 나아 가기 시작합니다.

추진기가 선형 속도를 유발하지 않도록 적용 할 수있는 최대 추력을 찾을 수 있는지 여부를 자세히 설명하고 있습니다. (위의 경우 후방 스러 스터의 힘에 대항 할 것이 없기 때문에 아무것도 없으며, 전방 스러 스터는 서로를 죽입니다).

지금까지 내가 생각해 낸 것은 "선회 효율"을 결정하는 공식입니다. 예를 들어 선형 운동과 관련하여 얼마나 많은 회전이 발생하는지.

a-스러 스터의 위치 벡터 a b-스러 스터의 위치 벡터 b v1-스러 스터의 힘 a v2-스러 스터의 힘 b

효율 델타 = a. 크로스 (v1) / | v1 | -(a.cross (v1) + b.cross (v2)) / | v1 + v2 |

기본적으로 "a.cross (v1 * t) / | v1 |" 턴 효율로되어 있습니다. 그리고 우리는 새로운 스러 스터를 발사하는 것이 가치가 있는지 알아보기 위해 스러 스터의 턴 효율로 그것을 뺍니다.

스러 스터가 온 / 오프되지 않을 것으로 생각되지만, 스러스트가 0에서 1로 변할 수 있다는 것을 알면 문제가 발생합니다. 물론 얼마나 많이 회전 / 이동할 것인지에 대한 균형이 필요합니다.

나는 로켓 과학자가 아니기 때문에 이런 식으로 각 스러 스터의 스로틀을 계산하고 올바른 방향으로 나아갈 수 있는지 말해 줄 수있는 사람이 있기를 바라고 있습니다.

시간 내 주셔서 감사합니다! / 김


3
나는 같은 길에서 시작했지만 많은 구성으로 인해 회전하거나 번역하지 못할 수 있습니다. 그래서 당신은 회전을 빼앗아합니까? 아니면 번역을 허용합니까? 궁극적으로 선박을 설계하는 것은 사용자의 몫입니다. 들어 내 데모 이의, 나는 그것을 위조. 관련 : gamedev.stackexchange.com/questions/58216/… , gamedev.stackexchange.com/questions/40615/…
MichaelHouse

나는 비슷한 길을 갔고이 페이지 에서 데모를 작성하게되었다 . 스러 스터를 움직일 때 (선박에서 드래그하여 위치와 힘을 설정) 세 가지 모양을 그립니다. 직관은 가능한 모든 움직임을 3D 공간 (x, y, 회전)의 한 점으로 생각할 수 있으며 0-1로 제한되는 것이 그 공간의 제약 조건이라는 것입니다. 따라서 가능한 모든 움직임을 포함하는 3D 모양으로 끝납니다. 선형 속도를 원하지 않으면 해당 공간의 (x = 0, y = 0) 라인을보고 있습니다 (내 데모에서 Q, W, E, S 모두 0)
amitp

답변:


7

나는 당신이 당신의 선박에 대해 물리적으로 올바른 움직임을 가지고 있다고 가정합니다. 그렇지 않으면이 분석은지지 않을 것입니다. 이 문제를 올바르게 해결하려면 효율성보다 강력한 것이 필요합니다.

각 스러 스터는 선박의 움직임에 선형 및 각의 두 가지 영향을 미칩니다. 이들은 독립적으로 고려 될 수 있습니다. 스러 스터가 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는 질량 관성 모멘트로 나눌 때 각도 가속을 제공하는 부호있는 스칼라입니다. 것이 중요 dirr같은에서 모두, 즉 로컬 좌표 또는 두 가지 모두 세계 좌표, 좌표 공간.

선박의 전체 선형 가속은 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 방향 시간 {왼쪽 회전, 회전 없음, 오른쪽 회전}).


잘 설명했다!
Kim

1
Sum_i이 맥락에서 무엇을 의미합니까?
S. Tarık Çetin

1

저의 첫 생각은 순전히 경험적인 솔루션이었습니다. 즉, 샌드 박스 환경에서 리그를 시뮬레이트하여 다양한 정도의 추력이 어떻게 동작 하는지를 시뮬레이션했습니다. 결정 론적 솔루션을 찾기 위해 많은 복잡한 수학의 균형을 맞추는 대신 뉴턴의 방법을 사용하여 수치 적으로 계산할 수 있습니다. 예:

추력의 범위는 0에서 1000이며 1000은 ALOT입니다.

1 단계

신뢰 (0 + 1000) / 2 = 500으로 시뮬레이션하십시오. 결과 : 너무 많은 신뢰

2 단계

범위는 이제 0 ~ 500 신뢰 (0 + 500) / 2 = 250으로 시뮬레이션합니다. 결과 : 너무 많은 신뢰

3 단계

범위는 이제 0에서 250입니다. 신뢰로 시뮬레이션 (0 + 250) / 2 = 125 결과 : 신뢰도가 너무 낮습니다

4 단계

범위는 125에서 250입니다. 신뢰로 시뮬레이션합니다 (125 + 250) /2=187.5 신뢰가 너무 많음

5 단계 범위가 125 ~ 187.5 임 신뢰로 시뮬레이션 (125 + 187.5) /2=156.25 결과가 너무 신뢰 없음

6 단계 범위가 156.25 ~ 187.5입니다. 범위가 35의 임계 값보다 낮습니다. 이는 충분히 추정 할 수 있음을 의미합니다.

최종 결과 = (187.5 + 156.25) / 2 = 171.875

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.