Механика векторов и вращений Понимание основной механики является основой для понимания как (и почему) движок Unreal поддерживает объекты в 3D пространстве и путь как он это делает. Вектора В механике есть векторные и скалярные величины. Скалярные имеют только величину, т.е. цифровое значение показывающее их размер. Пример скалярных величин время и масса. Вектора обладают величиной и направлением, например вектора включающее скорость, импульс и любую силу. Любой вектор может быть представлен стрелкой с длиной равной его значению и направлением стрелки соответствующее направлению вектора. Вектор может быть представлен как имеющий несколько частей или компонентов. Вектор будет иметь компоненту для каждой оси, т.е. 2D вектор имеет две компоненты; горизонтальную и вертикальную. Процесс деления вектора на его компоненты известен как разрешение. Векторная математика является более усложненной, чем скалярная математика, т.к. мы должны принять во внимание направление векторов. В диаграмме выше две силы действуют на объект, т.к. они действуют в одном и том же направлении, они усиливают друг друга, таким образом, что результирующая сила в 60N направлена вправо. В этом случае сила 30N действует как сопротивление силе 60N направленной вправо, таким образом результатом будет сила 30N направленная вправо. В общем векторная математика совершается разрешением векторов и подсчитыванием равнодействующей для каждого компонента. Хотя движок Unreal делает все это автоматически для нас, так, что количество математики когда используются вектора в UnrealScript совсем малое на программистский взгляд. Как все это применить к движку Unreal? Unreal имеет предопределенную структуру данных называемую вектор, которая объявляется как показано: //Точка или направление вектора в 3D пространстве struct Vector { var() config float X,Y,Z; } Таким образом мы имеем 3D вектор, сохраненный в виде его компонент. В Unreal: Z вертикаль, X глубина, Y горизонталь. Unreal использует векторную структуру для двух целей. Первая, чтобы определить положение объекта в 3D пространстве, таким образом X, Y, Z становятся координатами объекта. Векторная структура также используется как вектор, такой как в случае скорости actor, он представляет направление и скорость с которой actor перемещается. Таким образом X, Y, Z являются компонентами вектора. Вращения Вращения используются чтобы поддерживать углы в Unreal. Вращения управляют направлением actor, т.е. куда он будет обращен (и так ориентируется его mesh) и вращающим передвижением. Структура данных типа rotator объявляется как показано ниже: //Ортогональное вращение в 3D пространстве struct Rotator { var() config int Pitch, Yaw, Roll; } Pitch вертикальное вращение (то же самое как наклон самолета вверх или вниз), Yaw управляет горизонтальным вращением (используя руль чтобы поворачивать самолет из стороны в сторону) и Roll (такое же перемещение какое делает катящаяся бочка). Возможно не лучшее объяснение, как вы найдете, но если вы используете летный симулятор, вы поймете что я имею ввиду. Вращение 65535 есть полный круг. Но механика углов измеряется в радианах и тригонометрические функции UnrealScript работают в радианах. Таким образом чтобы сделать какое либо математическое действие с вращениями, нам надо преобразовать данные в радианы. Один радиан определяется как угол стягивающий в центре окружности дугой чья длина равна радиусу. Чтобы преобразовывать радианы и градусы используйте следующие формулы: градус=радиан*180/пи радиан=градус/180*пи Есть 2*пи радиан в полном круге, это значит, что есть 65535/2*пи=10430.2192 анрил единицы в радиане. В движке Unreal возможно преобразование между векторами и вращениями. Таким образом мы могли бы создать вектор указывающий в том же самом направлении вращения, что мы создали и наоборот. Есть только проблема с этим, вращение не имеют величины как таковой, так что если мы преобразовываем вращение в вектор, мы должны дать ему величину: vector myVector; rotator myRotator; //Подъем на 90 градусов вверх myRotator=rot(163384,0,0); //Подъем на 90 градусов вверх с величиной 20 myVector=20*vector(myRotator); Точечный результат двух нормализованных векторов является угол между ними. Функция UnrealScript dot возвращает косинус угла между двумя векторами: var vector A,B; var float Theta; Theta=Normal(A) dot Normal(B); Вращения... Что за черт это такое? Представляются углы. Но вместо 360 градусов, вы имеете 65535 UU (анрил единицы - ае). Каждый actor имеет переменную Rotation которая определяет какое направление указывается actor. Здесь пример, что такое вращение: struct Rotator { var() config int Pitch, Yaw, Roll; }; Вращения имеют три части, Pitch (думаю вверх/вниз...попытайтесь наклониться вперед, это будет считаться падением вниз), Yaw (думаю влево/вправо...сделайте оборот на 360...вы просто отклонились), и наконец Roll (думаю оборот делает оборот вокруг своей оси, это вид оборота). Вы можете модифицировать углы порсто изменив каждое из значений, но вы не можете модифицировать вращение actor прямо, вы должны использовать функцию SetRotation(newRotation) как показано ниже. function ChangeRotation() { local Rotator newRot; //Это будет наше новое вращение. newRot=Rotation; //Установить переменную newRot в значение текущего Rotation newRot.Pitch+=32768; //Так как 65535=360, половина будет соответствовать 180, не так ли ? newRot.Yaw-=16384; //И половина от этого соответствует 90 и так далее... SetRotation(newRot); //После того как мы сделали изменения выше, устанавливаем новое врашение } Что мы сделали только что? Мы сделали чему-то Pitch 32768 ае (180 градусов) и затем повернули на 16384 ае (90 градусов). Воспринимаете? Сейчас вы хотите сделать преобразование между векторами и вращениями: function ConvertMyRotatorsAndVector() { local rotator myRot; //Вращение local vector myVec; //Вектор myVec=vect(0,0,0); //Установка вектора в значения 0,0,0 myRot=Rotation; //Получаем текущее вращение myVec=500*vector(myRot);//Можем мы предположить какое направление указывает myVec? } Если вы предположили, что myVec указывает в направлении Rotation, то вы совершенно правы. Сейчас давайте предположим, что мы добавили другую строку: myRot=rotator(myVec); //Куда сейчас указывает myRot? Сейчас myRot будет указывать в направлении в которое указывал myVec, которое случилось чтобы быть направлением указываемого myRot, н-да, это почти парадоксально или типа того. Я надеюсь, что я не запутал вас здесь... Вы хотите, чтобы myRot указывал на 90 градусов влево... давайте добавим другую строку: myRot.Yaw+=16384; //Сейчас myRot указывает на 90 градусов влево от прежнего положения Не простая штука? Просто помните 65535=360 градусов и используйте SetRotation и вы сделаете все хорошо. Вращения полезны для использования математики оснванной на углах, во многих случаях можно будет использовать в месте векторной математики чтобы сделать некоторые задачи намного проще. К счастью Unreal уже поддерживает преобразование в обе стороны.