Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Функция для определения направления нормали полигона относительно пользовательского объекта
- fn isNormalFacingTarget polyObj faceIndex targetObj = (
- local normal = polyOp.getFaceNormal polyObj faceIndex -- Получаем нормаль полигона
- local targetDirection = normalize (targetObj.transform.row3) -- Направление оси Z пользовательского объекта
- -- Проверяем, направлена ли нормаль в сторону пользовательского объекта
- if dot normal targetDirection > 0 then true else false
- )
- -- Функция для вычисления площади полигона
- fn getFaceArea polyObj faceIndex = (
- local verts = polyOp.getFaceVerts polyObj faceIndex -- Получаем вершины полигона
- local points = for v in verts collect polyOp.getVert polyObj v -- Получаем координаты вершин
- -- Вычисляем площадь полигона (упрощённый метод для треугольников и четырёхугольников)
- if points.count == 3 then (
- -- Площадь треугольника
- local edge1 = points[2] - points[1]
- local edge2 = points[3] - points[1]
- length (cross edge1 edge2) / 2
- ) else if points.count == 4 then (
- -- Площадь четырёхугольника (разбиваем на два треугольника)
- local area1 = length (cross (points[2] - points[1]) (points[3] - points[1])) / 2
- local area2 = length (cross (points[3] - points[1]) (points[4] - points[1])) / 2
- area1 + area2
- ) else (
- 0 -- Для полигонов с другим количеством вершин возвращаем 0
- )
- )
- -- Основной скрипт
- if selection.count > 1 then (
- local targetObj = selection[1] -- Первый выбранный объект — это пользовательский объект для направления
- if classOf targetObj != Editable_Poly do (
- -- Перебираем все выбранные объекты, начиная со второго
- for i = 2 to selection.count do (
- local polyObj = selection[i] -- Текущий объект
- if classOf polyObj == Editable_Poly do (
- local allFaces = polyOp.getNumFaces polyObj -- Получаем количество полигонов
- local targetFaceIndex = undefined -- Индекс полигона, который нужно оставить
- local maxArea = 0 -- Максимальная площадь полигона
- -- Перебираем все полигоны
- for faceIndex = 1 to allFaces do (
- local area = getFaceArea polyObj faceIndex -- Получаем площадь полигона
- if area > maxArea and isNormalFacingTarget polyObj faceIndex targetObj then (
- maxArea = area
- targetFaceIndex = faceIndex -- Запоминаем полигон с максимальной площадью и нужной нормалью
- )
- )
- -- Удаляем все полигоны, кроме targetFaceIndex
- if targetFaceIndex != undefined then (
- for faceIndex = allFaces to 1 by -1 do ( -- Перебираем в обратном порядке, чтобы избежать смещения индексов
- if faceIndex != targetFaceIndex then (
- polyOp.deleteFaces polyObj #{faceIndex} -- Удаляем полигон
- )
- )
- print ("В объекте " + polyObj.name + " оставлен полигон с индексом " + targetFaceIndex as string)
- ) else (
- print ("В объекте " + polyObj.name + " не найден полигон с нужной нормалью и максимальной площадью.")
- )
- )
- )
- )
- ) else (
- print "Пожалуйста, выберите минимум два объекта: первый — пользовательский объект для направления, остальные — объекты для обработки."
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement