Четверг, 21.11.2024, 20:34


Главная
Регистрация
Вход
Welcome to Home Приветствую Вас Гость | RSS  
Меню сайта

Категории раздела
Мои статьи [25]

Мини-чат

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Мои статьи

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

В 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 секунд будут создаться по одному юниту для каждой системы координат.

Категория: Мои статьи | Добавил: Enemy1PK (02.04.2017)
Просмотров: 341 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт

Поиск

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • База знаний uCoz

  • Copyright MyCorp © 2024uCoz