Модульный космический корабль управления

8

Я разрабатываю игру на основе физики с космическими кораблями.

Космический корабль построен из кругов, соединенных стыками. К некоторым кругам прикреплены двигатели.

Двигатели могут вращаться вокруг центра круга и создавать тягу. Я хочу иметь возможность перемещать корабль в направлении или вращаться вокруг точки, устанавливая вращение и тягу для каждого из двигателей корабля.

Как я могу найти вращение и тягу, необходимые для каждого двигателя, чтобы достичь этого?

введите описание изображения здесь

SSS
источник
2
Связанный: gamedev.stackexchange.com/questions/40615/…
MichaelHouse
1
Не забудьте взглянуть на pid control en.wikipedia.org/wiki/PID_controller, это предотвратит ненужные колебания (временную нестабильность) или неестественное нацеливание.
хусейн тугрул буюкисик

Ответы:

6

Давайте представим простую ситуацию корабля с одним двигателем. Для того, чтобы переместить корабль, мы просто указываем подруливающее устройство от направления, в котором мы хотим идти, и выталкиваем. Это подталкивает нас в том направлении, в котором мы хотим идти. Невозможно вращать корабль, состоящий только из одного двигателя.

Давайте увеличим наш корабль до трех двигателей, чтобы сделать его более интересным:

введите описание изображения здесь

Если бы мы хотели переместить этот корабль куда-нибудь вверх и влево, мы бы просто направили все наши двигатели в противоположном направлении и открыли огонь:

введите описание изображения здесь

То же решение, что и у одного двигателя, который обеспечивает линейное движение.

Но что если мы пропустим движок? У нас неравная нагрузка?

введите описание изображения здесь

Следование той же стратегии заставит корабль вращаться. Во многих ситуациях это будет в основном неизбежно, а в некоторых случаях предпочтительнее, поскольку оно будет ориентировать судно для лучшего использования имеющихся двигателей.

Одной из стратегий смягчения этой проблемы будет выравнивание. Разбейте корабль по оси желаемого движения:

введите описание изображения здесь

Затем убедитесь, что правая сторона и левая сторона равны друг другу. Если они не масштабируют мощность двигателя, пока они этого не сделают. Это может легко привести к тому, что тяга не будет применена. Вам решать, хотите ли вы вместо этого вытолкнуть вызывающее вращение или заставить игрока изменить дизайн своего корабля, реорганизовав свои двигатели.

Как насчет вращения?

Этот вопрос очень хорошо описывает идею.

введите описание изображения здесь

Вам нужно будет рассчитать центр масс . Затем рассчитайте крутящий момент, создаваемый каждым двигателем. К счастью для вас, ваши двигатели вращаются, поэтому вы можете вращать их, чтобы обеспечить максимальный крутящий момент. Максимальный крутящий момент придет под прямым углом к ​​моменту руки. Применение суммы крутящих моментов будет вращать тело вокруг центра масс. Вы также можете выбрать другую произвольную точку вращения, например, мост корабля.

Если вы хотите убедиться, что вращаетесь на месте, вы можете уменьшить тягу двигателей, которая заставит ваш корабль двигаться линейно. Это можно сделать, сложив все двигатели с положительным крутящим моментом и все с отрицательным крутящим моментом, а затем сравните их абсолютные значения. Группа с большим абсолютным значением должна быть уменьшена до соответствия абсолютному значению другой группы.

Вы также можете найти очень полезный ресурс в Амит Патель .

введите описание изображения здесь

Здесь он сделал серию из 4 частей о конфигурируемых космических кораблях: часть 1 , часть 2 , часть 3 , часть 4

MichaelHouse
источник
Есть и другие (более элегантные) решения для этого. Но в идеале, если игрок создает хорошие дизайны, эти стратегии должны работать. Этот ответ является лишь отправной точкой для такого контроля. Там много места для улучшения.
MichaelHouse
-5

Я решил, что с локальным поиском. Это работает, но производительность почти плохая. Может быть, лучше использовать теоретическую механику, но я этого не знаю.

SSS
источник
4
-1, это очень расплывчатый ответ. Можете ли вы объяснить больше, что вы на самом деле сделали, чтобы решить проблему?
MichaelHouse