(
selobj = for o in objects collect o -- для каждого О в объектах собрать набор из О
select selobj -- выделить набор
Sel = selection as array -- сделать выделенное массивом
if sel.count >1 -- если количество элементов в массиве sel больше 1
then(-- тогда
o1 = Sel[1]
o2 = Sel[2]
V1 = normalize o1.transform.row1 -- нормализованный (единичный) вектор поворота по X матрицы трансформации
V2 = normalize (o2.pos - o1.pos) -- нормализованный (единичный) вектор направления от o1 до o2
-- угол между векторами, или арккосинус между единичными нормализованными векторами V1 и V2
o1.wirecolor = if angleO < 10 then green else red -- цвет объекта o1 зелёный если угол angleO меньше 10 градусов иначе цвет будет красный.
select sel[1]
angleO
)
)
_______________________________________________________________
Поворачиваем объект с помощью кватерниона
$.rotation =(quat <X> <Y> <Z> <угол вращения>) -- X,Y,Z - координаты вектора вокруг которого будет происходить вращение
Пример:
RotAxis = polyop.getFaceNormal $ 1 -- нормаль выбранного полигона
$.rotation =(quat RotAxis[1] RotAxis[2] RotAxis[3] (acos (dot Vector1 Vector2)))
-- (acos (dot Vector1 Vector2) угол (или арккосинус) между двумя единичными (нормализованными) вектроами, значение в градусах.
|
|
_______________________________________________________________
Матрицы трансформаций
t1 = $Teapot001
t2 = Teapot()
t2.pos = [0,0,50] -- t2 двигается на 50 по оси Z в глобальных координатах
t2.transform *= t1.transform -- устанавливаем положение и ориентацию t2 к t1
_______________________________________________________________
$.transform = rotateXmatrix <int (угол в градусах)> -- поворот матрицы на угол
$.transform = rotateYmatrix <int (угол в градусах)> -- поворот матрицы на угол
$.transform = rotateZmatrix <int (угол в градусах)> -- поворот матрицы на угол
$.dir -- вектор локальной оси z
$.transform = rotateY $.transform 45 -- поворачивает матрицу относительно начала коорд.
$.transform = rotateYmatrix 45 * $.transform -- локальный поворот
_______________________________________________________________
$.transform -- матрица трансформации
$.transform = matrix3 1 -- единичная матрица (начального положения объекта)
$.transform.scalepart -- только просмотр части масштаба от матрицы трансформации
$.transform.rotationpart -- только просмотр части поворота матрицы трансформации
$.transform.translationpart -- только просмотр части перемещения матрицы трансформации
_______________________________________________________________
$.transform.row4 = [0,0,0] -- на прямую Row4 (строка матрицы) не меняется (результата не будет)
-- отдельные трансфортмации матриц трансформации меняются через переменную
tmpTr = $.transform
tmpTr.Row4 = [110,0,0]
$.transform = tmpTr
_______________________________________________________________
SelEdge = polyop.getEdgeSelection $ as array -- массив выделенных рёбер
polyop.getVertsUsingEdge $ SelEdge as array -- Массив использованных рёбрами вершин
_______________________________________________________________
-- Проверка на принадлежность двух элементов массива элементам другого массива (код проверяте, принадлежит ли пара выделенных рёбер отверстию в геометрии)
compare = false
arrOpenEdges = (polyop.getOpenEdges $) as array -- массив рёбер, принадлежащих дыре в геометрии
|
|
SelEdges = (polyop.getEdgeSelection $) as array -- массив выделенных рёбер
for i=1 to arrOpenEdges.count do -- от 1 до конца рёбер из числа открытых делать
if SelEdges[1] == arrOpenEdges[i] then -- Если одно ребро из выделенных есть среди открытых рёбер (рёбер дыры) тогда
for j=1 to arrOpenEdges.count do -- от 1 до конца рёбер из числа открытых делать
if SelEdges[2] == arrOpenEdges[j] then (-- Если второе выделенное ребро есть среди рёбер из числа открытых тогда
compare = true -- переменная станет true
exit -- выход из цикла
)
compare -- возвращается результат после выполнения блока или функции для дальнейшей его обработки если это требуется. То есть вместо “OK”, после вычисления блока будет возвращено значение переменной.
_______________________________________________________________