Как определить, какие двигатели включить, чтобы повернуть корабль?

Конфигурация судна изменяется динамически, поэтому я должен определить, какой двигатель включать, когда я хочу повернуть корабль по часовой стрелке или против часовой стрелки. Двигатели всегда ориентированы по оси с судном (никогда под углом) и не включаются и не выключаются. Вот одна из возможных настроек:

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

То, что я пробовал до сих пор, - визуализировать вектор стрельбы и вектор направления в центр массы корабля:

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

К сожалению, я не очень далека от этого.

47 голосов | спросил migimunz 25 +04002012-10-25T22:43:21+04:00312012bEurope/MoscowThu, 25 Oct 2012 22:43:21 +0400 2012, 22:43:21

3 ответа


22

Успех! Вот оно, и оно вращается так, как должно: введите описание изображения здесь>> </p>

<p> Я сделал следующее: для каждого маховика я вычисляю величину крутящего момента по отношению к центру масс. </p>

<pre><code>частная функция thrustTorque (): Float
{
    //distToCom - это вектор расстояния между двигателем малой тяги и центром масс
    //Угол огня - это единичный вектор, представляющий направление двигателя
    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);
    обратный момент;
}
</code></pre>

<p> Уравнение для зависимости крутящего момента, согласно википедии, <code>T = rF sin (theta)</code>, где: </p>

<ul>
<li> r - расстояние между двигателем и COM </li>
<li> F - величина применяемой силы (я оставляю это, делая вид, что это всего лишь один, потому что я только забочусь о знаке). </li>
<li> theta - угол между двумя векторами </li>
</ul>
<p> Когда игрок нажимает налево, я проверяю знак крутящего момента для этого двигателя - если он меньше нуля, я запускаю двигатель. Для вращения по часовой стрелке это наоборот. </p>

<p> Это, вероятно, можно было бы улучшить, используя точечный продукт для вычисления косинуса угла между векторами, но это должно подождать до завтра. </p>

<p> Наконец, вот <a href= живая демонстрация .

ответил migimunz 26 +04002012-10-26T01:10:20+04:00312012bEurope/MoscowFri, 26 Oct 2012 01:10:20 +0400 2012, 01:10:20
13

Общее трехмерное выражение для крутящего момента - это поперечное произведение смещения и силы: T = r . F . В двух измерениях достаточно скалярного значения для крутящего момента и даны только четыре ортогональные ориентации для двигателей, мы можем записать в кусочной форме:

  • Сила в направлении + x: T = F * (-ry)
  • Сила в направлении -x: T = F * (ry)
  • Сила в направлении + y: T = F * (rx)
  • Сила в направлении -y: T = F * (-rx)

Здесь F - величина силы, создаваемой двигателями, rx и ry - x- и y-компоненты вектора от точки поворота до двигателя. Положительные моменты имеют тенденцию поворачивать корабль против часовой стрелки. Используя четыре формулы выше, тривиально выводить знак вращающего момента, вырабатываемого каждым двигателем.

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

Космический корабль

Как показано на рисунке, полная мощность для двигателей B, D и E будет максимизировать вращение, но также ускорит движение судна вправо. Выключение D предотвратит это. Если вместо этого требуется ускорение вправо, но вращение по часовой стрелке не выполняется, наиболее эффективным способом является включение как C, так и F на две трети полной мощности вместе с D.

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

ответил Marcks Thomas 26 +04002012-10-26T02:39:12+04:00312012bEurope/MoscowFri, 26 Oct 2012 02:39:12 +0400 2012, 02:39:12
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;
}

Это намного лучше (и быстрее).

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

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

Как бы в стороне, если бы вы могли представить себе дополнительный регулятор громкости двигателя, который влияет на мощность двигателей all одновременно, тогда вы можете установить этот элемент управления так, чтобы ваши два решения имели равный крутящий момент и вы видите, что второе решение может иметь меньше меньше , чем первое. Тем не менее, мы должны помнить, что если можно запустить двигатели, чтобы вы только вращались и вообще не двигались, то оба решения будут одинаковыми.

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

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

ответил Jeremy Salwen 26 +04002012-10-26T22:23:40+04:00312012bEurope/MoscowFri, 26 Oct 2012 22:23:40 +0400 2012, 22:23:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132