Vectors & Rotators
В данной доке рассматриваются основы механики в трехмерном пространстве и как это применяется в Анреаловском движке. Особенно важным является материал по rotators - эта штука не всеми осознается сразу. В общем эта дока must have для каждого начинающего скриптера.
В начале данного раздела описывается начало векторной алгебры. Видимо в зарубежном образовании эта тема изучается поздно и у них с этим проблемы :) У нас вектора "долбят" с 9-х классов, так что можете смело сразу переходить сюда.
Итак, вспоминаем механику, кто помнит - переходите к следующему разделу. Как известно, в физике два типа величин - векторные и скалярные. Скаляр - это просто число, например масса. Вектор - это величина имеющая не только размерность но и направление. Типичный пример векторной величины - скорость. Вектор скорости имеет направление (например объект движется вверх), модуль вектора - размерность скорости (например 20 км/ч). Вот скрин.
Вектор можно разложить по отдельным составляющим. Представим себе обычную плоскость.
Как видно из рисунка, вектор можно спроецировать на оси и получить несколько компонент. Например в двумерном пространстве вектор имеет две компоненты. В трехмерном соответственно три. Разложение на компоненты необходимо для представления направления вектора через математические выражения.
Над векторами, как и над обычными числами, можно производить математические операции. Основное отличие векторной алгебры - нам нужно брать в расчет направление векторов.
На вышеприведенном рисунке, две силы воздействуют на объект в одном направлении, т.е. они дополняют друг друга, поэтому результирующий вектор будет направлен в ту же сторону (вправо) и его модуль будет равен 60.
В этом случае на объект действует сила с противоположным направлением. Соответственно, модуль результирующего вектора будет 30 (40+20-30), с прежним направлением (вправо). В общем случае, для расчета результирующего вектора надо разложить на отдельные компоненты каждый вектор участвующий в операции и просуммировать их с учетом направления. К счастью Анреаловский движок автоматически проделывает все эти операции и на долю рядового ускриптера "остается" мало математики :)
Для представления вектора, в движке определена структура vector (Core.Object):
// Координаты точки либо направление вектора в трехмерном пространстве
struct Vector
{
var() config float X, Y, Z;
}
|
Итак, вектор в трехмерном пространстве представляется тремя координатами. Соответствие координатных осей следующее: Z - вертикальная ось, Y - горизонтальная, X - глубина.
Структура vector в Unreal используется для двух целей:
В движке используется специальная структура Rotator - для обозначения угла наклона объекта в трехмерном пространстве (например направление в котором "смотрит" моделька игрока). Структура определена следующим образом (Engine.Object):
struct Rotator { var() config int Pitch, Yaw, Roll; } |
Pitch - вращение объекта в вертикальной плоскости, Yaw - вращение в горизонтальной плоскости (вокруг своей оси), Roll - круговое вращение. Если непонятно, смотрите на скрины.
Углы выражаются в так называемых Unreal units (UU), вся окружность (360 градусов) равна 65536 UU. Однако в механике углы выражаются через радианы, и тригонометрические фукнции в UnrealScript`е (Sin, Cos и т.д.) тоже требуют значения в радианах, поэтому прежде чем проделывать какие-либо вычисления с ротаторами мы должны перевести UU в радианы. Для тех кто не знает (не помнит) чему равен один радиан автор приводит скрин:
Для перевода градусы<->радианы используются следующие формулы:
градусы = радианы * 180 / Π радианы = градусы / 180 * Π
Во всей окружности 2Π радиан, таким образом в одном радиане 65536 / 2Π = 10430.2192 UU.
Также у нас есть возможность перевода vector<->rotator. Например, мы можем создать вектор который будет направлен в ту же сторону что и ротатор, и наоборот. Единственная проблема заключается в том, что у ротаторов нет модуля, так что когда мы преобразовываем ротатор в вектор мы должны задавать модуль вектора:
vector myVector; rotator myRotator; // Присваем направление ротатору - 90 градусов вверх (pitch) myRotator = rot(16384, 0, 0); // Преобразуем ротатор в вектор и задаем модуль вектора myVector = 20 * vector(myRotator); |
Замечание: вы не можете напрямую указывать Rotation акторов, используйте для этого функцию SetRotation.
На вектора распространяются стандартные математические функции: +, -, *, /, <<, >>.
Функция VSize возвращает модуль вектора:
var vector A; var float B; // Линия вдоль горизонтальной оси A = vect(0, 20, 0); // Модуль вектора А B = VSize(A); |
Функция Normal возвращает нормальный вектор (нормаль) - единичный вектор, который используется только для указания направления:
var vector A, B; // Вектор А A = vect(20, 100, 10); // Нормаль вектора А B = Normal(A); |
Функция dot - возвращает косинус угла между двумя единичными векторами:
var vector A, B; var float Theta; Theta = Normal(A) dot Normal(B); |
Оригинальная статья: Vectors & Rotators c сайта CHiMERiC
Автор: mr.self-destruct
Mail: mrsd@unrealscript.com
Web: CHiMERiC
Перевод: Shadow
Mail: shadow_m777@mail.ru