MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
Вектора и движение в варкрафт
статья ориентирована на людей, которые имеют представление что такое вектор, но не представляют как их можно использовать.
О чем пойдет речь?В первую очередь я постараюсь дать некоторые теоретические выкладки о векторах и некоторых способах их использования в варкрафте. Представлю вашему вниманию библиотеку для работы с векторами и два примера ее использования.
Все само собой с подробными объяснениями. ТеорияПодробную информацию о векторах можно посмотреть здесь: Вектор_(геометрия).
Теперь , что нам из всего этого можно использовать? Во-первых, нужно понимать что вектор это объект геометрического мира, обозначающий направление в чистом виде. Учитывая, что векторами очень часто обозначают всевозможные характеристики и воздействия в физике, то важна еще и длина вектора. Найти ее можно следующим образом:
Где x, y и z - это координаты вектора.
Что же мы можем делать с вектором? А можем мы следующее: Умножение на числоДля этого достаточно умножить каждую координату на число, что самое полезное, длина вектора тоже умножится на это число. На этом основана одна полезная операция: приведение длины вектора к 1 (еще называют процессом нормализации вектора), или к какому-либо другому числу. Достаточно разделить каждую координату вектора на длину и умножить на требуемое число. При этом направление вектора не изменится.
Сложение векторовПо сути, если есть вектор а и вектор б то складывая их, мы получаем некоторый вектор ц, координаты которого получены с помощью сложения координат векторов а и б. Для чего это? Для имитации физических величин и воздействий. Например, если у объекта есть скорость и ускорение (обе величины вектора), то в каждый момент времени скорость меняется путем сложения с ускорением. Так же примером применения могут служить силы в физике. Если на тело действует несколько сил, то их можно заменить одной результирующей силой, равной сумме всех действующих сил.
Сложение вектора и точкиНеобходимо для перемещения точки по вектору. Операция схожа с предыдущей (и кто то скажет, что это одно и то же, и будет прав с практической точки зрения, теоретически разницу все равно стоит понимать). Складываются координаты точки и вектора. Одна лишь разница, результатом такого сложения будет не вектор, а точка. Пример применения - элементарное движение прожектила. У нас есть вектор его скорости, каждые n секунд мы вычисляем его новую позицию как сумму вектора скорости и его текущей позиции.
Скалярное произведение векторовподробно: Скалярное_произведение
Одна из самых полезных вещей, но ее применение не так очевидно. Найти его можно как произведение длин векторов на косинус угла меду ними... Возникает ряд неудобностей и сложностей. Но есть и еще один способ, более простой и удобный. Скалярное произведение равно
Как можно применять? Применять можно для нахождения проэкций одного вектора на другой. У скалярного произведения есть еще и такой смысл: скалярное произведение двух векторов есть произведение длины одного вектора на проекцию второго на направление первого. Поясню примером, если создается волна из прожектилов источник которой точка. Создать такую волну с дуговым фронтом плевое дело для любого уважающего себя спеллера. А если фронт волны должен выглядеть как прямая? Что делать тогда? Вот тогда и пригодится данная формула. Достаточно знать общее направление волны (центральный вектор равный 1), затем проделывается следующая последовательность операций для векторов скоростей каждого из прожектила в волне:
-находим скалярное произведение этого вектора и центрального вектора -делим вектор скорости прожектила на полученное число После всего этого умножаем все вектора скоростей прожектилов на скорость волны. Векторное произведение векторовЗдесь начинается особая векторная магия
Подробно: Векторное_произведение Самая полезная (и в то же время самая запутанная операция для новичков). Для тех кто понимает что такое определитель матрицы и имеет представление о векторах i, j и k, скажу что оно равно определителю матрицы:
Для тех кто всего этого не знает, скажу что результатом будет вектор с координатами равными:
Какими же свойствами обладает этот вектор и чем он так полезен? А тем что он направлен перпендикулярно обоим векторам. Что очень полезно для нахождения векторов нормалей к всевозможным поверхностям (например при определении вектора отражения в столкновениях).
Библиотека для работы с векторами
» код библиотеки для работы с векторами
Итак, начнем разбиратся с методами.
» пример
» пример
» пример
» пример
» пример
» пример
» пример
» пример
» пример
» пример
» пример
P.S. Не забываем вызывать метод destroy для векторов которые уже не нужны!
Примеры и их описаниеВложение Vectors не содержит в себе функциональной демонстрации, это чистая библиотека. Готовая для копирования и использования.
Вложение Simple_projektils это пример с простым прямолинейным движением прожектилов по прямой в 3d и столкновением с ландшафтом. Для запуска прожектила достаточно применить заклинание "Канал" на любой точке ландшафта. Прожектилы учитывают высоту рельефа и летают строго по прямой. Прошу обратить внимание, что все движение выполнено только на алгебраических функциях (никаких синусов и косинусов), что значительно увеличивает быстродействие. Единственная тригонометрическая функция это Atan2 для определения взгляда прожектила (можно было и использовать взгляд кастера, но сделано так, чтоб показать как это можно делать динамически используя вектор). Все вычисления направления происходят 1 раз для каждого прожектила. В дальнейшем высчитываются только координаты.
Вложение Projectils_with_inertial более сложный пример. Здесь участвует такая вещь как инерция. Прожектилы не просто летят к магу крови. Они еще и учитывают свою текущую скорость. Сделано это с помощью добавления в систему прожектилов вектора ускореня, который всегда направлен в сторону мага. Так же наложены ограничения на скорость в виде пороговой скорости. При этом прожектилы не уничтожаются при столкновении с ландшафтом, они от нее отражаются (определенное количество раз). Реализовано это с помощью векторного и скалярного произведения. Механика такая:
Вот и все. Enjoy and Good Luck!!! Отредактировано MF, 27.07.2009 в 05:19. |
|||||||||
24.07.2009, 09:14 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Тзинч
offline
Опыт:
4,948Активность: |
Кхм... статья интересная, но я на сонную голову пока ничего не понимаю. Я не помню какой предмет, очень знакомый. Просто у нас его читали, но плохо. |
24.07.2009, 09:29 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
MF имхо хорошая статья,зачёт
а за библиотеку векторов отдельное спасибо =) |
24.07.2009, 09:42 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
Не забываем указывать автора в титрах при использовании. ^_^ Если что-то непонятно и нужно более подробно расписать, пишите. Я учту и дополню статью. |
24.07.2009, 09:46 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
dk
offline
Опыт:
61,843Активность: |
Линкану одну старую "библеотеку" по векторам... VectorFunctions.w3x Мб тож пригодится. так все в одном топике будет) Отредактировано dk, 24.07.2009 в 10:30. |
24.07.2009, 09:59 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FREEZE_ball
Cataclysm => жара
offline
Опыт:
15,247Активность: |
А кроме создания прожектилов, вектора ещё можно где-нибудь использовать (займёмся теорикрафтингом)? |
24.07.2009, 10:11 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
FREEZE_ball Прожектилы самый очеведный пример. Вообще вектора использовать можно где и как угодно. Всевозможные системы движения тоже можно делать на векторах. К слову сказать, свой аналог DGUI для проекта я тоже писал используя вектора. |
24.07.2009, 10:19 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
Достаточно интересная вещь, но без оптимизации не обойтись. С тем же рядом проджектилов, есть решения быстрей, напр. с полярками(если я правильно понял задачу)
А вобще, тут есть еще то, с чем я никогда не сталкивался, надо будет заняться :) ScorpioT1000 добавил: зачот |
24.07.2009, 13:28 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
ScorpioT1000 Не думаю что полярки быстрее, так как там используется тригонометрия (косинусы и синусы) и еще, в случае сложных спеллов, куча чего. Вектор же вычисляется путем 3 разностей. Да, если это производится 1 раз, то согласен с тобой, полярки и больше ниче не нужно (хотя я проект свой перевожу на вектора, так как это проще, если понять и вникнуть), если же приходится каждый раз вычислять какие то сложные вещи, да и еще в 3d (переходмим к сферичиским или цилиндричиским координатам) то тут у векторов нет конкурентов по скорости вычисления. |
24.07.2009, 13:35 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,880Активность: |
Думаю понял, после часа пинания андреича в аське. В теории совсем не хвататет картинок. |
24.07.2009, 19:48 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
MF ОФИГИТЕЛЬНАЯ статья. просто мечтал о такой. одну похожую читал, но она непонятная( была. спасибо автору очень много узнал всего...
|
25.07.2009, 02:57 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
PlayerDark
Coraline
offline
Опыт:
10,569Активность: |
Да, векторы действительно рулят. Да, кстати, я видел ОЧЕНЬ похожую библиотеку выложенную где-то в сети. Я не говорю что это плагиат, просто при желании сделать особого труда не доставит. |
25.07.2009, 08:52 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
Цель ставилась не в реализации библиотеки. А в пробуждении интереса к человеческим методам в геймдеве у наших спеллеров. |
25.07.2009, 11:02 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
GhfDllT
offline
Опыт:
3,980Активность: |
Предложение
Я как нуб джасса сначала спрошу, не ошибочен ли такой код, при условии что vectorsum возвращает вектор
Код:
Если не ошибочен, то мне кажется лучше в методах где участвует 2 вектора возвращать вектор(сложение, оба умножения). Не претендую, но так просто удобней: если у меня 3 вектора, то я могу одному присвоить сумму остальных не модифицируя их, и не копируя в другие векторы, что при текущей версии делать неудобно. Да и при нормализации и установке длины тоже вектор возвращать следует, так просто грамотней по-моему и удобней. GhfDllT добавил: А статья хорошая, ради стеба можно еще метод вычитания векторов вставить))) Цитата:
|
|
25.07.2009, 17:30 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
MF
Что-то вокруг не так
offline
Опыт:
26,594Активность: |
GhfDllT
Возвращать вектор значит создавать еще одного представителя данной структуры... Возможно я продублирую методы, те которые изменяют текущий вектор, чтоб возвращали новый не меняя старый. Пока можно делать следующим образом, если нужен новый вектор:
Тогда в векторе b будет результат суммы, при этом v и w не изменятся. |
25.07.2009, 18:41 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
еще раз прочитал, не очень понятно, но всравно чтото понимаю |
25.07.2009, 23:57 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
J
expert
offline
Опыт:
48,747Активность: |
простейшая геометрия, среднии классы... я бы советовал лучше учебники почитать...
не путай гейм дев и модмейкерство J добавил: не, ну народ что здесь отписываеться меня удивил, я конечно знал что многие не знают даже математику школьной программы, но чтобы настолько что не разбираться в подобных вещах... просто шокирующие Отредактировано J, 26.07.2009 в 05:29. |
26.07.2009, 05:33 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,880Активность: |
J, мне можно, у меня это только через месяц начнется =) |
26.07.2009, 06:22 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
J
expert
offline
Опыт:
48,747Активность: |
и? самая глупая ошибка которую допускают школота это подчинение школьной программе, если тебе это было нужно можно получить подробнейшую информацию с той же википедии а не ждать следующего класса когда тебе все разжуют |
26.07.2009, 06:45 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,880Активность: |
Мне это было ненужно. Меня вполне устраивали полярные координаты, и я не видел смысла в изучении векторов раньше времени. Теперь, я понимаю, что с векторами гораздо удобнее и постепенно перехожу на них. |
26.07.2009, 07:16 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|