Рассадка одного объекта на вершины другого объекта 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Рассадка одного объекта на вершины другого объекта



delete $*_Clone_* -- Для повторного выполнения скрипта предварительно удаляются предыдущие объекты
delete $GeoSphere* -- Для повторного выполнения скрипта предварительно удаляются предыдущие объекты
delete $box* -- Для повторного выполнения скрипта предварительно удаляются предыдущие объекты
TargetObj = Geosphere radius: 200 -- Целевой объект - геосфера радиусом 200
SourceObj = box() -- Объект источник - бокс
MeshObj = snapshotAsMesh TargetObj -- snapshotAsMesh - это снимок параметров геометрии объекта в глобальной системе координат, универсально работающий и для mesh и для Poly
for v = 1 to MeshObj.numVerts by 1 do -- для каждой вершины v начиная с v = 1 до последней вершины (количество вершин.numVerts) объекта MeshObj, по одной - by 1 (так же можно например и через одну установить by 2) делать
(
NewObj = instance SourceObj -- Создать новый объект инстансовый объекту источника
NewObj.name = uniquename (SourceObj.name + "_Clone_") -- задаётся уникальное имя
NewObj.transform = matrixFromNormal (getNormal MeshObj v) -- Задаётся матрица трансформации объекта равной матрице нормали (взять нормаль вершины объекта MeshObj)
NewObj.pos = getVert MeshObj v -- установить позиции вершин объекта MeshObj
NewObj.parent = TargetObj -- Сделать для объекта NewObj парентом целевой объект
)

_______________________________________________________________

Рассчитывается угол между объектами (повёрнут ли один объект в сторону другого)

(
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”, после вычисления блока будет возвращено значение переменной.

_______________________________________________________________



Поделиться:


Последнее изменение этой страницы: 2021-04-13; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.64.47 (0.011 с.)