Я работаю над искусственным интеллектом, в котором нет препятствий и движение ограничено плоскостью XY. Я рассчитываю два вектора, v , направление движения корабля 1 и w , вектор, указывающий от положения корабля 1 к кораблю 2.
Затем я рассчитываю угол между этими двумя векторами, используя формулу
arccos((v · w) / (|v| · |w|))
У меня проблема в том, что arccos
возвращает значения только между 0 ° и 180 °. Это делает невозможным определить, должен ли я повернуть налево или направо, чтобы повернуться лицом к другому кораблю.
Есть лучший способ сделать это?
Mathf.DeltaAngle()
.Ответы:
Гораздо быстрее использовать 2d кросс-продукт. Никаких дорогостоящих функций триггера.
Если вам все еще нужны реальные углы, я рекомендую использовать
atan2
.atan2
даст вам абсолютный угол любого вектора. Чтобы получить относительный угол между любыми векторами, рассчитайте их абсолютные углы и используйте простое вычитание.источник
arccos
. Таким образом, вы будете использовать только одну функцию триггера, но фактический угол все равно будет. Однако я рекомендую не использовать эту оптимизацию, пока вы не убедитесь, что отслеживание угла искусственного интеллекта заметно влияет на производительность вашей игры.if( cross == -0.0f )
противif( cross == 0.0f )
проверки выглядит очень хрупким.Используйте арксинус двумерного перекрестного произведения (то есть компонент z вектора перекрестного произведения). Это даст вам от -90 до 90, что даст вам знать, идти ли налево или направо.
Будьте осторожны, потому что крест A не совпадает с крестом B
Другая стратегия (но, вероятно, не такая прямолинейная) состоит в том, чтобы вычислить «курс» двух векторов с использованием atan2, а затем выяснить, нужно ли A, указывающий на X градусов, идти влево или вправо, чтобы перейти к B, указывающему на y градусов.
источник
Используйте векторы, чтобы перенаправить корабль. Вот как работает «поведение руля» - вам никогда не нужно вычислять угол, просто используйте имеющиеся у вас векторы. Это в вычислительном отношении намного дешевле.
Вектор
w
(вектор от корабля 1 до корабля 2) - это вся необходимая вам информация. Измените либо вектор скорости корабля 1, либо вектор ускорения корабля 1 (или даже вектор курса), используя взвешенную версиюw
.Величина , как далеко от корабля 1 выключен , конечно (как плохо v не совпадает с ш) можно найти с помощью (
1 - dot(v,w)
)dot(v,w)
максимально, когдаv
иw
выстроиться точно)1 - dot(v,w)
) дает 0, когдаv
иw
полностью выстроены, предоставленыv
иw
нормализованы)источник
Существует простой способ найти абсолютный угол вектора через нормальную геометрию.
например, вектор V = 2i - 3j;
абсолютное значение коэффициента х = 2;
абсолютное значение коэффициента y = 3;
угол = атан (2/3); [угол будет в диапазоне от 0 до 90]
На основании квадранта угол будет изменен.
если (коэффициент x <0 и коэффициент y> 0), то угол = угол 180;
если (х коэффициент <0 и у коэффициент <0), то угол = 180 + угол;
если (коэффициент x> 0 и коэффициент y <0), то угол = угол 360;
если (коэффициент х> 0 и коэффициент у> 0), то угол = угол;
после нахождения угла первого и второго векторов просто вычтите угол первого вектора из второго вектора. Тогда вы получите абсолютный угол между двумя векторами.
источник
Может быть, я должен опубликовать немного другой вопрос и ответить на него сам; это самый близкий вопрос, который я мог найти к тому, который у меня был.
Я делаю 2D работу на холсте html, где у меня есть углы поворота в радианах, а не в векторах. Мне нужен был «угол поворота» (та), чтобы перейти от «текущего курса» (h) к «целевому курсу» (t).
Вот мое решение:
источник