선박을 회전시키기 위해 어떤 추진기를 켤지 결정하는 방법은 무엇입니까?


47

선박의 구성은 동적으로 변경되므로 선박을 시계 방향 또는 시계 반대 방향으로 회전 할 때 켜야 할 추진기를 결정해야합니다. 스러 스터는 항상 선박과 축을 일직선으로 정렬하고 (각도는 아님) 켜거나 끕니다. 가능한 설정 중 하나는 다음과 같습니다.

http://i.stack.imgur.com/GSBSH.png

지금까지 시도한 것은 발사 벡터와 방향 벡터를 선박의 질량 중심으로 시각화하는 것입니다.

http://i.stack.imgur.com/ZzNzi.png

불행히도, 나는 그렇게 멀지 않았습니다.


7
힘 벡터를 사용하여 올바른 방향으로 향합니다. 우주선을 질량 중심 주위로 회전 시키려고하므로 ANGULAR 속도에 대한 공식을 찾아보십시오.
증폭 91

정확히하는 방법을 잊었지만 기본적으로 en.wikipedia.org/wiki/Center_of_mass , 특히 en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
나는 정확히 같은 생각을 가지고 있었다! 더 쉬운 팁 하나는 각 스러 스터마다 각도 및 선형 가속도를 한 번만 계산하면되므로 계산이 복잡 할 수 있다는 것입니다.
Markus von Broady

@ Amplify91, 귀하의 의견이 도움이되었습니다.
migimunz

1
@migimunz 나는 키 누름 (스러 스터 그룹)이 아닌 스러 스터 당 가속도를 계산하려고 생각했습니다. 또한, 어떤 키를 누를 수 있을지에 대한 스러 스터를 활성화시킬 수있는 선택권을주는 것 (일부 사람들은 회전을 위해 더 빠른 회전 거래를 할 것임)
Markus von Broady

답변:


22

성공! 여기 있습니다. 그리고 회전해야합니다 : 여기에 이미지 설명을 입력하십시오

내가 한 것은 다음과 같습니다. 각 스러 스터마다 질량 중심과 관련하여 토크의 크기를 계산합니다.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Wikipedia에 따르면 토크의 크기에 대한 방정식은 다음 T = rF sin(theta)과 같습니다.

  • r은 스러 스터와 COM 사이의 거리입니다
  • F는 적용되는 힘의 크기입니다 (표지 만 신경 쓰기 때문에 하나만 가장하는 것으로 내버려 둡니다).
  • 세타는 두 벡터 사이의 각도입니다

플레이어가 왼쪽을 누르면 해당 스러 스터의 토크 표시를 확인합니다. 0보다 작 으면 스러 스터를 발사합니다. 시계 방향으로 돌리는 것은 반대입니다.

이것은 내적을 사용하여 벡터 사이의 각도의 코사인을 계산함으로써 향상 될 수 있지만 내일까지 기다려야합니다.

마지막으로, 여기에 데모 데모가 있습니다.


나는 거의 생각합니다. 정확히 질량 중심에 있지 않은 것 같습니다. 왼쪽 / 오른쪽 화살표 만 사용하면 화면에서 쉽게 벗어날 수 있습니다. 그래도 아주 가깝습니다. 아마도 당신이 측정하는 지점이 약간 벗어난 것입니다. 또는 잠시 후 좋은 스핀으로 안정화되는 것처럼 보이기 때문에 타이밍 문제가 될 수 있습니다. 그래도 좋은 일입니다.
MichaelHouse

나는 이것이이 논리와 관련이 있다고 생각하지 않습니다. 차량이이 메커니즘에 의해 선택된 서 스터 세트를 발사하여 순 병 진력을받지 않도록하기위한 것은 없습니다. 순 병 진력을 유지하는 것이 필요하지 않은 경우 개별 스러 스터의 힘을 조절할 수 있어야합니다 (아마도 훨씬 더 어려운 문제가 될 것입니다)
Trevor Powell

@TrevorPowell입니다. 단순함을 위해서 (그리고 선박이 얼마나 잘 설계 하느냐에 따라 재미가 있기 때문에) 또한 스러 스터를 켜거나 끄는 것으로 결정했습니다. 나는 너무 작은 토크를 유발하는 (따라서 너무 많은 측면 움직임) 전원을 켤 수없는 임계 값을 포함 할 것이지만, "너무 많거나 적은"양은 시행 착오에 의해 결정될 것입니다.
migimunz

3
각도 계산을 피하기 위해 수직 점 곱을 사용하는 것입니다 ( z = 0 인 3D 벡터를 사용하는 경우 토크 T = r 십자 F 의 교차 곱 정의에서 파생 됨 ). 같은 크기의 r에 수직 인 벡터 (-ry, rx)를 취하고 F를 사용하여 해당 벡터의 내적을 계산합니다. 결과는 T = rx * Fy-ry * Fx입니다. 그러면 abs (T)는 토크의 크기이며 그 부호는 방향을 나타냅니다. T> 0은 시계 반대 방향이고 T <0은 시계 방향입니다.
Joren

1
그것이 작동하는 이유는 직관적으로보기 쉽습니다 : r dot F = r F cos θ. r을 시계 반대 방향으로 90도 회전 하고 내적을 취하면 cos (θ-90˚) = sin (θ)이므로 r F sin θ가됩니다.
Joren

14

: 토크에 대한 일반적인 표현은 3 차원 변위 및 힘의 외적이다 T = RF . 2 차원에서, 토크에 대한 스칼라 값으로 충분하며, 스러 스터에 대해 4 개의 직교 방향 만 제공하면 조각 형태로 쓸 수 있습니다.

  • + x 방향의 힘 : T = F * (-ry)
  • -x 방향의 힘 : T = F * (ry)
  • 방향으로 힘 + y : T = F * (rx)
  • -y 방향의 힘 : T = F * (-rx)

여기서, F는 스러 스터에 의해 생성 된 힘의 크기이며, rx 및 ry는 피벗 점에서 스러 스터까지 벡터의 x 및 y 성분입니다. 양의 토크는 배를 시계 반대 방향으로 회전시키는 경향이 있습니다. 위의 4 가지 공식을 사용하면 각 스러 스터가 생성하는 토크의 신호를 추론하는 것이 쉽지 않습니다.

적당히 정확한 물리 표현을 위해서는 추력의 표시뿐만 아니라 총 크기와 회전 관성을 알아야합니다. 또한 회전을하기 위해 올바르게 정렬 된 모든 스러 스터를 활성화하고 싶지 않을 수도 있습니다.

우주선

그림과 같이 스러 스터 B, D 및 E에 대한 최대 출력은 회전을 최대화하지만 선박을 오른쪽으로 가속시킵니다. D를 종료하면이를 방지 할 수 있습니다. 대신, 가속 가속이 의도되었지만 시계 방향 회전이 아닌 경우 가장 효율적인 방법은 D와 함께 최대 전력의 2/3에서 C와 F를 모두 활성화하는 것입니다.

이것이 당신이하려는 일의 범위를 벗어나지 않는다면, 간단한 작업이 아니라 운동 방정식에 대한 일종의 솔버를 작성해야합니다.


7

몇 가지 다른 것들. 먼저, 이것이 제한적인 문제라는 것을 인식해야합니다. 즉, 같은 방향으로 회전하기 위해 발사 할 수있는 많은 다른 스러 스터 조합이 있습니다. 나는 당신의 상황에서 스러 스터에 대해 "온"과 "오프"의 두 가지 상태 만 있고 모든 스러 스터는 동일한 힘을 출력한다고 가정합니다.

둘째, 모델을 시선을 사로 잡으면 "질량 중심"이 실제로 질량 중심이 아닌 것처럼 보입니다. 운 좋게도 토크 계산에는 영향을 미치지 않습니다. 그러나 질량 변위 중심에 대한 계산에는 영향을 미칩니다. 그래도 "질량 중심"이 실제 질량 중심에 가장 가까운 사각형이기 때문에 그 수준의 정확도에 관심이 있는지 확실하지 않습니다.

셋째, 특정 스러 스터가 회전에 어떤 영향을 미치는지 계산하려면 비효율적 인 공식을 사용하고 있지만 올바르게 작동합니다. 토크 r x F는 크기를 갖는 로 계산할 수 있습니다 r*F*sin(theta). 그러나이 경우 각도를 계산하는 것은 비효율적 인 방법입니다. 대신, 토크에 대한 교차 제품 정의를 직접 사용해야합니다. 이는 표현을 사용하는 것이 훨씬 간단하기 때문입니다. 모든 벡터에는 z 성분이 없으므로 교차 곱의 수식이 크게 단순화됩니다.

계산 결과를 전혀 변경하지 않고도 코드를 업데이트 할 수 있습니다

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

훨씬 더 좋고 빠릅니다.

당신은 당신의 해결책은 모든 추진기를 올바른 방향으로 토크로 발사하는 것입니다. 자, 그것은 당신이 묻는 질문을 거의 해결합니다. 그러나 사용자가 "회전"버튼을 누른 상태에서 양의 토크를 가진 모든 스러 스터가 회전하여 잠재적으로 맨 위로 이동하면 전략이 만족스럽지 않다는 것을 알게 될 것입니다. (추력기의 힘을 실제로 계산하거나 시각적으로 발사하는 것을 보여주고 일정한 가속도 또는 다른 것으로 모델을 회전시키는 경우 시뮬레이션의 세부 수준은 확실하지 않습니다. 방법으로, 스러 스터가 최소한 대략 정확하게 발사되기를 원합니다).

당신은 배의 순 힘을 고려하지 않습니다. 임의의 스러 스터 양이 있다면 이것은 매우 복잡한 문제로 바뀔 수 있습니다. 그러나 스러 스터에는 상태가 두 개뿐이므로 분석하기가 매우 간단합니다. 나는 우리의 목표가 정확히 무엇인지 확실하지 않으므로 두 가지 다른 것을 상상할 수 있습니다. 먼저, 우리는 총 힘을 최소화하면서 토크를 원하는 방향으로 계속 유지하려고합니다. 둘째, 총 힘에 대한 토크의 비율을 최대화하려고합니다.

게다가, 모든 스러 스터 의 힘에 동시에 영향을 미치는 추가 "스러 스터 볼륨"컨트롤을 상상할 수 있다면 , 두 솔루션이 동일한 토크를 갖도록이 컨트롤을 설정할 수 있고 두 번째 솔루션은 첫 번째보다 작은 변위. 그러나 스러 스터를 발사하여 회전 만하고 전혀 움직이지 않으면 두 솔루션이 동일하다는 것을 기억해야합니다.

따라서 이전 단락의 주장에 따라 두 번째 해결책을 살펴 보겠습니다. 이제 총 힘을 분석 할 때 엔진이 지시 할 수있는 방향은 4 가지에 불과하다는 것을 알 수 있습니다. 따라서 x 방향의 총 힘은 왼쪽을 가리키는 추진기의 수에서 오른쪽을 가리키는 수를 뺀 것과 마찬가지로 y 방향입니다.

지금까지 작성한 후에는 알고리즘을 최적화하기 위해 알고리즘에 대해 더 생각해야합니다. 내 게시물의 나머지 부분이 그대로 도움이된다고 생각하므로 게시하고 있지만이 구성을 최적화하는 가장 좋은 방법을 알아 낼 때 업데이트 할 것입니다 (근사한 답변을 얻는 몇 가지 방법을 생각했지만 그들 중 누구도 정확하지 않습니다).


답을 주셔서 감사합니다 (토크 계산에 대한 더 빠르고 깨끗한 솔루션). 빨간색 원은 선박의 COM이 아니라 파워 코어입니다. 나는 물리 엔진을 사용하고 있으며 배에 국소 충격을 가하고 있습니다. 다른 구성으로 놀아 보는 것이 매우 재미있어서 완벽하지 않은 솔루션으로 괜찮습니다. 그러나 당신이 무엇을 생각해 내고 싶습니까?
migimunz

1
임의의 기준점에서 토크를 계산할 수 있습니다. 결과 숫자는 변경되지만 질량 중심 일 필요가없는이 지점을 중심으로 배를 회전시키는 한 물리적 인 동작은 수행되지 않습니다. 실제로 질량 분포에 대한 정보가 없으면 질량 중심 자체가 임의적이므로 계산할 수 없습니다.
Marcks Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.