Новости/News | | Туториалы/Tutorials | | Форум/Forum | | ЧаВо/FAQ | | Файлы/Downloads | | Ссылки/Links | | Авторы/About |

Vectors & Rotators

Содержание

Вступление

В данной доке рассматриваются основы механики в трехмерном пространстве и как это применяется в Анреаловском движке. Особенно важным является материал по rotators - эта штука не всеми осознается сразу. В общем эта дока must have для каждого начинающего скриптера.

Vectors

В начале данного раздела описывается начало векторной алгебры. Видимо в зарубежном образовании эта тема изучается поздно и у них с этим проблемы :) У нас вектора "долбят" с 9-х классов, так что можете смело сразу переходить сюда.

Итак, вспоминаем механику, кто помнит - переходите к следующему разделу. Как известно, в физике два типа величин - векторные и скалярные. Скаляр - это просто число, например масса. Вектор - это величина имеющая не только размерность но и направление. Типичный пример векторной величины - скорость. Вектор скорости имеет направление (например объект движется вверх), модуль вектора - размерность скорости (например 20 км/ч). Вот скрин.

Пример вектора

Вектор можно разложить по отдельным составляющим. Представим себе обычную плоскость.

Разложение вектора на составляющие

Как видно из рисунка, вектор можно спроецировать на оси и получить несколько компонент. Например в двумерном пространстве вектор имеет две компоненты. В трехмерном соответственно три. Разложение на компоненты необходимо для представления направления вектора через математические выражения.

Над векторами, как и над обычными числами, можно производить математические операции. Основное отличие векторной алгебры - нам нужно брать в расчет направление векторов.

Сложение векторов

На вышеприведенном рисунке, две силы воздействуют на объект в одном направлении, т.е. они дополняют друг друга, поэтому результирующий вектор будет направлен в ту же сторону (вправо) и его модуль будет равен 60.

Вычитание векторов

В этом случае на объект действует сила с противоположным направлением. Соответственно, модуль результирующего вектора будет 30 (40+20-30), с прежним направлением (вправо). В общем случае, для расчета результирующего вектора надо разложить на отдельные компоненты каждый вектор участвующий в операции и просуммировать их с учетом направления. К счастью Анреаловский движок автоматически проделывает все эти операции и на долю рядового ускриптера "остается" мало математики :)

Для представления вектора, в движке определена структура vector (Core.Object):

// Координаты точки либо направление вектора в трехмерном пространстве
struct Vector
{
  var() config float X, Y, Z;
}

Итак, вектор в трехмерном пространстве представляется тремя координатами. Соответствие координатных осей следующее: Z - вертикальная ось, Y - горизонтальная, X - глубина.

Соответствие координатный осей в Unreal

Структура vector в Unreal используется для двух целей:

  1. Для представления положения объекта в пространстве. Например, у каждого актора есть свойство Location которое и определяет координаты актора (точка (X,Y,Z)) в пространстве.
  2. Для представления самого вектора. Например, у каждого актора есть свойство Velocity которое определяет вектор скорости (X,Y,Z - компоненты вектора) актора (т.е. направление и величину скорости).

Rotators

В движке используется специальная структура Rotator - для обозначения угла наклона объекта в трехмерном пространстве (например направление в котором "смотрит" моделька игрока). Структура определена следующим образом (Engine.Object):

struct Rotator
{
   var() config int Pitch, Yaw, Roll;
}

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.

Vector functions

На вектора распространяются стандартные математические функции: +, -, *, /, <<, >>.
Функция 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);

dot product

Автор

Оригинальная статья: Vectors & Rotators c сайта CHiMERiC
Автор: mr.self-destruct
Mail: mrsd@unrealscript.com
Web: CHiMERiC

Перевод: Shadow
Mail: shadow_m777@mail.ru

Хостинг от uCoz