Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория MAXScript.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
278.53 Кб
Скачать

Координатные сетки

Можно создать свою собственную координатную сетку, сделать активной и работать в ее системе координат. Сетка создается при помощи конструктора grid и обладает следующими свойствами:

<grid>.length               длина сетки (float, 50.0 – по умолчанию)

<grid>.width                ширина сетки (float, 50.0 – по умолчанию)

<grid>.grid                  размер ячейки (float, 10.0 – по умолчанию)

Пример:

setka=grid position: [0,0,0] -- создаем координатную сетку

rotate setka 90 [1,0,0] -- поворачиваем на 90 градусов относительно оси Х

activeGrid=$Grid01 -- активируем сетку по имени

in coordsys grid -- в системе координат сетки рисуем сплайн

(

item = splineShape ()

item.name = "Фигура"

item.steps = 0

item.optimize = true

addNewSpline item

addKnot item 1 #corner #line [0,0,0]

addKnot item 1 #corner #line [200,0,0]

addKnot item 1 #corner #line [200, 100,0]

addKnot item 1 #corner #line [0, 100, 0]

close item 1

item.pivot = [50, 0, 0]

updateShape item

in coordsys world setKnotPoint item 1 3 [200, 0, 300] -- в МСК перемещаем точку

addModifier item (Extrude amount: 10) -- применяем модификатор

)

activeGrid=homeGrid -- активируем стандартную сетку

delete setka -- стираем старую сетку

clearlistener() -- очищаем Listener

 

 

Определение угла между двумя векторами

a=[10, 0, 0]; b=[-10, 10, 0] -- первый и второй вектор

--ПЕРВЫЙ СПОСОБ - ПЛОХОЙ

c=cross a b -- вектор-нормаль к плоскости из первых двух векторов

ugol=asin(length(c)/(length(a)*length(b))) -- формула определения угла

messagebox (ugol as string)

--ВТОРОЙ СПОСОБ - ХОРОШИЙ

scalar_mult=a.x*b.x+a.y*b.y+a.z*b.z -- скалярное произведение векторов

ugol=acos(scalar_mult/(length(a)*length(b))) -- формула определения угла

messagebox (ugol as string)

 

Представление ориентации при помощи кватернионов (quaternions)

Кватернион – набор четырех значений, первое (скалярная часть) определяет  поворот вокруг вектора, остальные три (векторная часть) определяют вектор оси поворота. Нормированный (normalized) кватернион, т.е. тот, у которого сумма квадратов всех компонентов равна единице, обладает следующими свойствами: скалярная часть равна косинусу половины угла поворота, векторная часть – ось вращения, длина вектора оси равна синусу половины угла поворота. Нормированный кватернион может определять повороты только от –PI до +PI.

Именно кватернионы, а не углы Эйлера используются в 3ds max (и вообще в компьютерной графике) для хранения поворотов объектов, поскольку это наиболее надежный и удобный способ. Вектор можно выразить через кватернион, у которого скалярная часть равна нулю.

Повороты в MAXScript происходят по правилу правой руки, т.е. против часовой стрелки вокруг положительного направления оси при вращении на положительный угол.

Конструкторы:

1.      quat <x_float> <y_float> <z_float> <w_float>, где x, y, z – вектор, w – поворот.

2.      quat <degrees_float> <axis_point3>, где <degrees_float> – угол в градусах, <axis_point3> – ось вращения (величина Point3).

3.      <angleaxis> as quat – перевести величину <angleaxis> (ось и угол) в кватернион. Выражение типа <angleaxis> представляет собой набор из двух значений: угла поворота в градусах и вектора оси вращения (величина Point3).

4.      <eulerangle> as quat – перевести величину <eulerangle> (угол Эйлера) в кватернион. Выражение типа <eulerangle> представляет собой набор углов поворотов вокруг осей координат: x, y, z.

5.      <matrix3> as quat – перевести в кватернион ту часть матрицы 4х3, которая отвечает за поворот.

Можно и кватернионы переводить в углы Эйлера, выражения типа ось и угол или матрицы: <quat> as eulerAngles, <quat>as angleaxis, <quat> as matrix3.

Свойства: <quat>.w; <quat>.x; <quat>.y; <quat>.z – у всех тип Float.

Вычисляемые свойства: <quat>.angle – тип Float, <quat>.axis – тип Point3.

Некоторые из методов:

normalize <quat> – возвращает нормированный кватернион.

inverse <quat> – возвращает обратный кватернион (1/q).

Вектор q*v*(1/q) равен повернутому вектору v, выраженному через кватернион.