У меня есть 3D-модель башни, которая вращается вокруг оси Y. У этой башни есть пушка, которая значительно смещена от центра объекта. Я хочу, чтобы пушка, а не турель, нацеливалась на указанную цель. Однако я могу только вращать турель, и поэтому я не знаю, какое уравнение мне нужно применить, чтобы достичь цели.
Следующее изображение иллюстрирует мою проблему:
Если у меня есть турель «LookAt ()» цели, лазер из пушки полностью пропустит указанную цель.
Если бы это был полностью нисходящий сценарий, и пушка была точно параллельна башне, то моя логика подсказывает мне, что поддельная цель должна быть расположена в положении, равном фактической цели плюс смещение, равное расстоянию между Башенка и пушка. Однако в моем реальном сценарии моя камера наклонена на 60º, и у пушки есть небольшое вращение.
Следующее изображение иллюстрирует сценарий:
Я не уверен точно, почему, но если я применю то же самое смещение, оно будет работать только при наведении на определенные расстояния от башни.
Моя логика ошибочна? Я что-то упустил здесь?
Окончательное редактирование: решение, предоставленное последним обновлением @JohnHamilton, решает эту проблему с идеальной точностью. Теперь я удалил код и изображения, которые я использовал для иллюстрации моих неправильных реализаций.
источник
Ответы:
Ответ на самом деле довольно прост, если вы делаете математику. У вас есть фиксированное расстояние Y и переменное расстояние X (см. Рисунок 1). Вам нужно выяснить угол между Z и X и еще больше повернуть турель.
Шаг 1 - Получите расстояние между линией револьверной башни (V) и линией ружья (W), которая равна Y (она постоянна, но не мешает вычислять). Получите расстояние от башни до цели (то есть X).
Шаг 2 - Разделите Y на X, а затем получите гиперболический синус значения
Шаг 3 - Поверните турель намного больше (вокруг оси, идущей сверху вниз, скорее всего вверх, но эту часть может знать только вы).
Конечно, в этом случае вам нужно, чтобы он вращался против часовой стрелки, поэтому вам может понадобиться добавить минус перед поворотом там, как в
-turnAngle
.Отредактировал некоторые части. Спасибо @ens за указание на разницу в расстоянии.
ОП сказал, что у его пистолета есть угол, поэтому мы идем, сначала изображение, потом объяснение:
Мы уже знаем из предыдущего расчета, куда направить красную линию по синей линии. Итак, нацеливаясь сначала на синюю линию:
Единственное вычисление, которое здесь отличается, это вычисление «X Prime» (X '), поскольку угол между пистолетом и револьверной головкой (угол «a») изменил расстояние между линиями.
Эта следующая часть ТОЛЬКО необходима, если вы делаете модульные орудия с револьверной головкой (т. Е. Пользователь может менять орудия на револьверной головке, и разные пушки имеют разные углы). Если вы делаете это в редакторе, вы уже можете видеть, какой угол наклона пистолета соответствует башне.
Есть два метода для нахождения угла "a", один из них - метод transform.up:
Выше техника будет рассчитывать в 3D, поэтому, если вы хотите 2D-результат, вам нужно избавиться от оси Z (это то, что я предполагаю, где гравитация, но если вы ничего не изменили, в Unity это ось Y вверх или вниз, т.е. гравитация находится на оси Y, поэтому вам, возможно, придется изменить положение вещей):
Второй способ - это метод поворота (в данном случае я думаю о 2D):
Опять же, все эти коды дадут вам положительные значения, поэтому вам, возможно, придется добавить или вычесть сумму в зависимости от угла (для этого тоже есть расчеты, но я не буду вдаваться в подробности). Хорошее место для начала это
Vector2.Dot
метод в Unity.Последний блок кода для дополнительного объяснения того, что мы делаем:
Если вы все сделали правильно, вы должны получить такую сцену ( ссылка на пакет UnityPack ): Что я подразумеваю под всегда положительными значениями:
Метод Z может давать отрицательные значения:
Для примера сцены, получите пакет Unity по этой ссылке .
Вот код, который я использовал на сцене (на башне):
3D адаптированный код с X и Z в качестве 2D-плоскости:
источник
Вы также можете использовать более общий подход:
Математика для вашей проблемы уже существует в форме скальп-продукта (или точечного произведения) . Вам нужно только определить направление движения вашего оружия вперед по оси и направление от вашего оружия к цели.
Пусть W будет передним вектором вашего оружия.
Пусть D будет направлением от вашего оружия к вашей цели. (Target.pos - Weapon.pos)
Если вы решите формулу точечного продукта
для альфы вы получаете:
Вам нужно только преобразовать радианы в градусы, и вы получили свой угол, чтобы повернуть робота. (Как вы упомянули, оружие находится под углом к вашему роботу, поэтому вам нужно добавить угол к альфе)
источник
Все ответы, опубликованные до сих пор (более или менее) неверны, поэтому вот быстрое правильное решение:
Чтобы направить оружие на цель, поверните вектор башни вперед к цели и добавьте угол θ.
Итак, давайте найдем θ:
Когда
δ' = 0
это упрощаетсяθ = asin(a / d)
, что соответствует первой части ответа Джона Гамильтона.Редактировать:
Я добавил рабочий пример.
Откройте в JSFiddle или используйте встроенный фрагмент ниже:
источник