Читайте также:
|
|
По своей сути произвольный поворот весьма похож на кватернион. Отличия заключаются в том, что угол поворота, задаваемый кватернионом, должен лежать в диапазоне от –180 до +180 градусов, да еще в солидном количестве методов для работы с кватернионами.
Литералы
Произвольный поворот не может быть определен с помощью литерала
Конструкторы
Проще всего задать поворот подобно кватерниону, с помощью угла и оси поворота.
angleaxis Число Точка_в_3D_пространстве
Число задает угол поворота в градусах, а точка – вектор оси поворота. Кроме этого угол может быть преобразован из кватерниона, углов Эйлера или матрицы 4х3 с помощью операции преобразования типа.
Кватернион as angleaxis
Углы_Эйлера as angleaxis
Матрица_4х3 as angleaxis
Операторы
К углу поворота можно применять следующие операторы. Операции сравнения – равенство и неравенство
Произвольный_поворот_1 = = Произвольный_поворот_2
Произвольный_поворот_1! = Произвольный_поворот_2
и операцию преобразования типа
Произвольный_поворот as Другой_класс
Произвольный поворот может быть преобразован в кватернион, матрицу 4х3 или углы Эейлера.
Свойства
Величину угла поворота в градусах возвращает свойство
Произвольный_поворот. angle
Вектор оси поворота – свойство
Произвольный_поворот. axis
Число полных оборотов вокруг оси
Произвольный_поворот. numrevs
Например, зададим поворот вокруг оси Z на 765 градусов, то есть на два полных оборота и еще 45 градусов
a = angleaxis 765 z_axis
a.angle -- Возвращает 765
a.axis -- Возвращает [0,0,1]
a.numrevs -- Возвращает 2
Методы
Для поворота предусмотрены два метода – копирования
copy Произвольный_поворот
создает копию указанного поворота, и генерация случайного поворота
random Произвольный_поворот_1 Произвольный_поворот_2
возвращает поворот в диапазоне от первого до второго.
Углы Эйлера
Подобно тому, как местоположение любого объекта может быть однозначно определено с помощью трех координат, ориентация тела в пространстве может быть определена с помощью трех углов, называемых углами Эйлера. Для получения заданной углами Эйлера ориентации необходимо последовательно повернуть тело относительно осей системы координат. Следует отметить, что порядок, в котором производятся повороты, важен, и при выполнении поворота, объект сначала поворачивается относительно оси X, затем Y и затем Z.
Литералы
Для углов Эйлера специальных литералов не предусмотрено.
Конструкторы
Углы Эйлера могут быть заданы своими значениями
EulerAngles Число_1 Число_2 Число_3
где числа задают повороты относительно осей X, Y и Z в градусах, либо с помощью операции преобразования типа из кватерниона или произвольного поворота.
Кватернион as EulerAngles
Произвольный_поворот as EulerAngles
Операторы
Для углов Эйлера определены две операции сравнения
Углы_Эйлера_1 = = Углы Эйлера_2
Углы_Эйлера_1! = Углы Эйлера_2
равенство и неравенство, и операция преобразования типа.
Углы_Эйлера as Другой_класс
Углы Эйлера могут быть преобразованы в кватернион, произвольный поворот или матрицу 4х3.
Свойства
Углы Эйлера имеют только три свойства
Углы_Эйлера. x
Углы_Эйлера. y
Углы_Эйлера. z
которые возвращают повороты вокруг соответствующих осей в градусах.
Методы
Для углов Эйлера определен метод копирования
copy Угол_Эйлера
и генерация случайных углов Эйлера
random Угол_Эйлера_1 Угол_Эйлера_2
при этом случайные углы выбираются из диапазона, заданного указанными углами. Прочие методы предназначены для более хитрого перевода углов Эйлера в кватернионы и обратно. Их рассмотрение пока отложим.
Матрица 4х3
Кватернионы, углы Эйлера и повороты позволяют оперировать только с ориентацией объекта, хотя кватернионы еще и масштабируют. Матрица, наряду с этим позволяет и масштабировать, и перемещать объект в пространстве. Благодаря этим свойствам, матрица имеет большое количество конструкторов
Конструкторы
Самым естественным, но не самым простым способом матрица задается полым набором своих элементов.
matrix3 Точка_в_3D_пристранстве_1 Точка_в_3D_пристранстве_2 Точка_в_3D_пристранстве_3 Точка_в_3D_пристранстве_4
четыре точки при этом изображают четыре строки матрицы, по три элемента в каждой. Могут быть заданы нулевая матрица
matrix3 0
или единичная
matrix3 1
Просто задаются матрицы осуществляющие повороты вокруг осей координат
rotateXMatrix Число
rotateYMatrix Число
rotateZMatrix Число
где число – угол поворота в градусах.
Матрица, переносящая объект в пространстве задается так
transMatrix Точка_в_3D_пространстве
где указанная точка задает смещения по трем координатам. Масштабирование объекта можно осуществить с помощью матрицы заданной таким образом
scaleMatrix Точка_в_3D_пространстве
Здесь точка задает коэффициенты сжатия или расширения по соответствующим осям. Можно задать матрицу для поворота сразу по трем осям
rotateYPRMatrix Число_1 Число_2 Число_3
первое число соответствует повороту объекта относительно оси Y, второе X, третье Z. Буквы YPR – сокращение от английских названий углов Эйлера – yaw, pitch и roll. Имеется еще одна, несколько замысловатая возможность создания матрицы.
matrixFromNormal Точка_в_3D_пространстве
При этом созданная матрица определяет такой поворот объекта, что его ось Z повернется в направлении вектора, определенного указанной точкой.
Операторы
Для матриц определены операции сложения, вычитания и умножения.
Матрица_3х4_1 + Матрица_3х4_2
Матрица_3х4_1 - Матрица_3х4_2
Матрица_3х4_1 * Матрица_3х4_2
Умножение матриц, разумеется, не коммутативно, то есть a*b не равно b*a. Если нам надо провести над объектом сначала преобразование, определяемое матрицей M1, а затем другое преобразование, определяемое матрицей M2, то проще вычислить матрицу M1*M2, и применить к объекту преобразование, заданное результирующей матрицей. При этом порядок умножения должен быть именно таков – матрица первого преобразования слева.
Хотя в руководстве этого не сказано, но для матриц, как и для всякого класса, производного от Value, определены операции сравнения – равенство и неравенство.
Матрица_3х4_1 = = Матрица_3х4_2
Матрица_3х4_1!= Матрица_3х4_2
Свойства
Можно получить строки матрицы
Матрица_3х4. row1
Матрица_3х4. row2
Матрица_3х4. row3
Матрица_3х4. row4
Поскольку четвертая строка является частью, отвечающей за смещение объекта, то последнее свойство может записываться и так
Матрица_3х4. translation
Следующие свойства матрицы могут только читаться
Матрица_3х4. rotationpart
возвращает кватернион, определяющий тот же поворот, что и матрица.
Матрица_3х4. translationpart
возвращает точку в трехмерном пространстве, которая определяет тот же сдвиг, что и матрица.
Матрица_3х4. scalerotationpart
возвращает кватернион, определяющий поворот и масштабирование объекта.
Матрица_3х4. scalepart
возвращает точку в трехмерном пространстве, определяющую масштабирование объекта.
Матрица_3х4. determinantsign
возвращает знак определителя матрицы.
Методы
Функция копирования
copy Матрица_3х4
создает копию указанной матрицы. Чтобы проверить, является ли матрица единичной, можно использовать функцию
isIdentity Матрица_3х4
Она возвращает true, только если матрица единична. Функция
inverse Матрица_3х4
возвращает матрицу, обратную заданной. При этом заданная матрица не изменяется.
Иногда возникает необходимость перевести преобразования, заданные матрицей в другую систему координат. В этом случае используется функция
xformMat Матрица_3х4_1 Матрица_3х4_2
Первая матрица задает преобразования, вторая – систему координат, в которую они будут пересчитываться. Результатом будет матрица преобразований в новой системе координат.
Все описанные далее методы для работы с матрицами 4х3 являются картированными, то есть могут работать как с одиночной матрицей, так и с массивами матриц. Функция
identity Матрица_3х4
делает заданную матрицу единичной, а
zero Матрица_3х4
нулевой. Сделать все оси системы координат, определяемой матрицей, взаимно перпендикулярными, можно с помощью функции
orthogonalize Матрица_3х4
Эта функция соответствующим образом изменяет заданную матрицу. Чтобы добавить к матрице преобразование перемещения, применяется функция
translate Матрица_3х4 Точка_в_3D_пространстве
Для добавления к исходной матрице преобразования поворота можно использовать функции
rotateX Матрица_3х4 Число
rotateY Матрица_3х4 Число
rotateZ Матрица_3х4 Число
Они добавляют к заданной матрице повороты вокруг соответствующей оси на угол, заданный вторым параметром. Величина угла задается в градусах. Поворот, заданный кватернионом добавляется к матрице с помощью функции
rotate Матрица_3х4 Кватернион
Преобразование масштабирования добавляется к матрице с помощью функции
scale Матрица_3х4 Точка_в_3D_пространстве Логическое_значение
Точка в трехмерном пространстве задает масштабирование по соответствующим осям. Третий параметр функции scale необязателен и введен после обнаружения ошибки в предыдущих версиях 3ds max. Дело в том, что функция scale применяла преобразование масштабирования только к первым трем строкам матрицы. Для сохранения совместимости с ранее разработанными скриптами был введен третий параметр. Если он не указан, или равен false, то масштабирование к четвертой строке матрицы, как и ранее, не применяется. При значении третьего параметра true, четвертая строка матрицы масштабируется.
Шесть описанных выше функций добавляют преобразование к преобразованиям, заданным матрицей. Рассмотрим пример
m = rotateXMatrix 45
translate m [ 1, 1, 1 ]
Первая строка создает матрицу поворота, вторая добавляет к ней сдвиг. В результате работы данного скрипта, матрица m будет содержать следующие преобразования. Сначала поворот относительно оси X, а затем сдвиг по всем осям на единицу. Ну а если перед Вами стоит обратная задача – добавить к некому преобразованию, преобразования, содержащиеся в матрице? В этом случае можно применять следующие функции, аналогичные приведенным.
preTranslate Матрица_3х4 Точка_в 3D_пространстве
preRotateX Матрица_3х4 Число
preRotateY Матрица_3х4 Число
preRotateZ Матрица_3х4 Число
preRotate Матрица_3х4 Кватернион
preScale Матрица_3х4 Точка_в_3D_пространстве Логическое_значение
Все они действуют точно так же, как и описанные ранее, за следующим исключением. Если переписать предыдущий пример так
m = rotateXMatrix 45
preTranslate m [ 1, 1, 1 ]
то в результате получится матрица m, которая вначале сдвигает объект на единицу по всем осям, а затем поворачивает его относительно оси X на 45 градусов.
Дата добавления: 2015-10-31; просмотров: 145 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Точка в двумерном пространстве | | | Матрица произвольных размеров |