WarCraft 3: Математический подход к движению

» Раздел: Триггеры и объекты

Примечание

В Warcraft III функции Sin и Cos принимают углы в радианах, поэтому, чтобы правильно оперировать с углами в градусах (например, взятый угол поворота юнита), нужно умножать их на bj_DEGTORAD.
Пример:
local real a = GetUnitFacing(u)
local real distance = 1000.0
local real vec_x = distance * Cos(a * bj_DEGTORAD)
local real vec_y = distance * Sin(a * bj_DEGTORAD)
— прим. ScorpioT1000

Что такое сферические координаты

Итак, частным случаем сферических координат являются полярные координаты (угол плюс расстояние) данные координаты позволяют очень удобно и гибко работать с перемещениями в 2d (да и не только с ними), в сферических же координатах добавляться еще один угол, в результате мы получаем 3d аппарат.

Как это выглядит?

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

Формулы перехода

Для полярных координат это:
set x = p * Cos( a )
set y = p * Sin( a )
Для сферических все не намного сложнее:
set x = p * Cos( a ) * Sin( t )
set y = p * Sin( a ) * Sin( t )
set z = p * Cos( t )
t - новый угол, эти формулы для классики, для второй системы координат достаточно поменять синус и косинус введенного угла местами.

Для чего это нужно

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

Еще одна формула

Просто для общего развития (тех кто не знает само собой :):).
Формула расстояния d 3d

set p = SquareRoot( dx * dx + dy * dy + dz * dz) 
Где dx, dy, dz - соответствующая разница координат.

Цилиндрические координаты

Но не всегда 3d удобно представлять в виде сферы. Пример такого неудобства всевозможные спирали вокруг юнита и так далее. Интуитивно многие приходили к этой системе. И она несколько проще для понимания.

Как это выглядит?

разберемся чем это отличается от сферических координат? В основе все та же полярка, а вот 3я координата вводиться просто и без заумностей, как высота.

Формулы перехода

Формулы тут тоже гораздо проще:
set x = p * Cos( a )
set y = p * Sin( a )
set z = h
Тут угол а - угол полярных координат, h - высота точки, p - длинна проэкции на плоскость.

Для чего это нужно

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

Что такое повороты и с чем их едят

Иногда не очень удобно использовать ту или иную систему координат "как есть".
Например задача: построить окружность в плоскости отличной от горизонтальной.
На первый взгляд решение стоит копать в сторону сферических координат... Но нахождение параметрического уравнения такой окружности в сферических координатах не такая уж простая задача, гораздо удобнее и быстрее (как в человеческом понимании, так и в машинном) работать с поворотами.

Что нам нужно?

Для начала разберемся, что же задает плоскость в пространстве? Для наших целей подойдет 2 угла (a и b) и точка t.
t - точка через которую проходит горизонтальная плоскость (которую и будем поворачивать)
a - угол поворота вокруг оси, параллельной X, проходящей через t
b - угол поворота вокруг оси, параллельной Z, проходящей через t
(на самом деле можно брать любые 2 оси)
Таким образом можно задать любую плоскость в пространстве.

Формулы перехода

Перейдем к формулам.
Пусть есть две точки t1 и t2, и угол на который надо повернуть t2 относительно t1 (пусть это будет угол a) вокруг какой-то оси. Тогда формулы поворота будут иметь вид:
//вокруг оси X:
set x' = x2
set y' = y1 + (y2 - y1) * Cos( a ) + (z1 - z2) * Sin( a )
set z' = z1 + (y2 - y1) * Sin(a ) + (z2 - z1) * Cos( a )
//вокург оси Y:
set x' = x1 + (x2 - x1) * Cos( a ) + (z1 - z2) * Sin( a )
set y' = y2
set z' = z1 + (x2 - x1) * Sin( a ) + (z2 - z1) * Cos( a )
//вокруг оси X:
set x' = x1 + (x2 - x1) * Cos( a ) + (y2 - y1) * Sin( a )
set y' = y1 + (x2 - x1) * Sin( a ) + (y1 - y2) * Cos( a )
set z' = z2
Здесь x', y' и z' - новые координаты точки t2.

Опять к окружностям

Вернемся к нашей задаче. С помощью поворотов и можно построить окружность с центром в какой либо точке и произвольным наклоном. Что для этого нужно? Не так много. Построить окружность с помощью 2d координат, и подействовать на них последовательно двумя поворотами относительно двух любых осей на требуемые углы.
На самом деле мы опять придем к сферической системе координат, но как бы с задней двери.
В примере показаны юниты летающие по поверхности цилиндра и сферы (в 2х вариациях: через сферические координаты и повороты полярной системы координат).
Каждые 5 секунд будут создаться по одному юниту для каждой системы координат.
Выкладываю пример движения по параболе. Основано на векторах, пока без комментариев и дополнений к статье.

Просмотров: 14 949

» Лучшие комментарии


Gam_Over #1 - 8 лет назад 1
мне очень понравилась. даже почти все понял. спасибо, будем парить ось z :)
vasex #2 - 8 лет назад -9
По-моему настолько же бессмысленно, как и "Некоторые приёмы...".
Гемплей - это главное.
BK.Jugg #3 - 8 лет назад 0
vasex, тебе кроме геймплея ничего в голову не идет?
vasex #4 - 8 лет назад -11
Идёт, но такой вот подход к мельчайшим никому не нужным деталям - это просто онанизм.
Dr #5 - 8 лет назад 0
[b]vasex[/b], все эти детали и составляют игровой процесс, а если тебе нравится играть на голой карте, у тебя просто нет хорошего вкуса (небось от мицакулта без ума).
ScorpioT1000 #6 - 8 лет назад 2
прекращаем срач)
vasex без этого не существует триггерное движение
MF #7 - 8 лет назад 0
С помощью этого можно делать более сложные эффекты чем с полярками, собственно как было выяснено, математические функции работают крайне быстро.
vasex #8 - 8 лет назад -10
Дело в том, что интересней играть в готовое, чем смотреть как "разработчики" меряются пиписками НА СТАДИИ РАЗРАБОТКИ.
Моё мнение я высказал. Недовольны - обращайтесь к моему адвокату.
oGre_ #9 - 8 лет назад 4
vasex
Ой лол)
На этом ресурсе разработчики делятся своим опытом, помимо того что выкладывают готовое.
Извени, но твое мнение ниочем как и ты сам)
vasex #10 - 8 лет назад -1
Шикарных разработок здесь наааамного больше, чем хоть каких-нибудь готовых проектов. Не согласен?
ScorpioT1000 #11 - 8 лет назад 0
дак так всегда в жизни =)
интерфейсы для интерфейсов, так сказать
dave_wwid #12 - 8 лет назад 1
Умно, красиво, но достаточно ограничено в применении. Когда мне вдруг придет в голову создать робота работающего в угловой или сферической системе координат обязательно еще перечитаю статью.
PS Без обид, MF_Andreich. Пока ума не приложу для чего кроме спеллов это можно использовать.
ADOLF #13 - 8 лет назад 0
адназначно мы все не шарим ;(
MF #14 - 8 лет назад 1
Эх чую все таки нужно про вектора писать. Дабы все что касается координат сводится либо к системам координат либо к векторам, больше никто ничего не придумал.
Mihahail #15 - 8 лет назад 0
Уря, давно хотел сделать падение монетки в 3d на движке вара)))
оказывается можно просто каждые 0.5 секунды наклонять плоскось изменяя углы)
Афтар, РИСПЕКТ
Slow_Everest #16 - 8 лет назад 0
Аффтар +1 =) Системе найдутся разные применение.. у кого какие фантазии =)
п.с. после 3000 камешков, вулкан не было видно из за камней =)
J #17 - 8 лет назад 0
афтар статьи так и не исправил того что я ему говорил, низачет
J #18 - 8 лет назад 0
эх... я бы даже бы настоял на отправке статьи на перемодерацию, но мне лень
MF #19 - 8 лет назад 1
J, ты про лево-правостороннюю систему координат? Это не суть важно. Соль в примерах, а там все норм.
J #20 - 8 лет назад 0
соль должна быть в статье а не в примерах
ScorpioT1000 #21 - 8 лет назад 0
J +1 и то что я говорил..
MF #22 - 8 лет назад 1
Слушайте, ребята, не будьте буквоедами. Статья писалась чтоб показать смысл самих систем координат. Я думаю те кто что-то из нее понял, сам разберется. А прикапыватся к мелочам можно до бесконечности.
J #23 - 8 лет назад 0
давно бы исправил бы нежели оправдываться, опять низачет
Trepanator #24 - 8 лет назад 0
Сказано же: "А прикапыватся к мелочам можно до бесконечности." Постоянно исправлять - терпения не хватит, а без исправления этих мелочей и так норм.
Статья полезная - я, к примеру, наконец нашёл, как трёхмерку правильно делать, а то я в X и Y брал Cos( t ), а в Z - Sin( t ).
agentex #25 - 7 лет назад 0
Trepanator, ты все верно брал =)
Zanozus #26 - 7 лет назад 0
...Но нахождение параметрического уравнения такой окружности
в сферических координатах не такая уж простая задача...
НИЧЕГО ПОДОБНОГО! Сделал !
Rewenger #27 - 6 лет назад (отредактировано ) 0
...but nothing happens.
Амбидекстрия #28 - 6 лет назад 0
Не открывается в варе, ток ВЕ
Это сообщение удалено