Advertisement
Pmaaaax

maxscript

Jan 27th, 2025
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. -- Функция для определения направления нормали полигона относительно пользовательского объекта
  2. fn isNormalFacingTarget polyObj faceIndex targetObj = (
  3. local normal = polyOp.getFaceNormal polyObj faceIndex -- Получаем нормаль полигона
  4. local targetDirection = normalize (targetObj.transform.row3) -- Направление оси Z пользовательского объекта
  5. -- Проверяем, направлена ли нормаль в сторону пользовательского объекта
  6. if dot normal targetDirection > 0 then true else false
  7. )
  8.  
  9. -- Функция для вычисления площади полигона
  10. fn getFaceArea polyObj faceIndex = (
  11. local verts = polyOp.getFaceVerts polyObj faceIndex -- Получаем вершины полигона
  12. local points = for v in verts collect polyOp.getVert polyObj v -- Получаем координаты вершин
  13. -- Вычисляем площадь полигона (упрощённый метод для треугольников и четырёхугольников)
  14. if points.count == 3 then (
  15. -- Площадь треугольника
  16. local edge1 = points[2] - points[1]
  17. local edge2 = points[3] - points[1]
  18. length (cross edge1 edge2) / 2
  19. ) else if points.count == 4 then (
  20. -- Площадь четырёхугольника (разбиваем на два треугольника)
  21. local area1 = length (cross (points[2] - points[1]) (points[3] - points[1])) / 2
  22. local area2 = length (cross (points[3] - points[1]) (points[4] - points[1])) / 2
  23. area1 + area2
  24. ) else (
  25. 0 -- Для полигонов с другим количеством вершин возвращаем 0
  26. )
  27. )
  28.  
  29. -- Основной скрипт
  30. if selection.count > 1 then (
  31. local targetObj = selection[1] -- Первый выбранный объект — это пользовательский объект для направления
  32. if classOf targetObj != Editable_Poly do (
  33. -- Перебираем все выбранные объекты, начиная со второго
  34. for i = 2 to selection.count do (
  35. local polyObj = selection[i] -- Текущий объект
  36. if classOf polyObj == Editable_Poly do (
  37. local allFaces = polyOp.getNumFaces polyObj -- Получаем количество полигонов
  38. local targetFaceIndex = undefined -- Индекс полигона, который нужно оставить
  39. local maxArea = 0 -- Максимальная площадь полигона
  40.  
  41. -- Перебираем все полигоны
  42. for faceIndex = 1 to allFaces do (
  43. local area = getFaceArea polyObj faceIndex -- Получаем площадь полигона
  44. if area > maxArea and isNormalFacingTarget polyObj faceIndex targetObj then (
  45. maxArea = area
  46. targetFaceIndex = faceIndex -- Запоминаем полигон с максимальной площадью и нужной нормалью
  47. )
  48. )
  49.  
  50. -- Удаляем все полигоны, кроме targetFaceIndex
  51. if targetFaceIndex != undefined then (
  52. for faceIndex = allFaces to 1 by -1 do ( -- Перебираем в обратном порядке, чтобы избежать смещения индексов
  53. if faceIndex != targetFaceIndex then (
  54. polyOp.deleteFaces polyObj #{faceIndex} -- Удаляем полигон
  55. )
  56. )
  57. print ("В объекте " + polyObj.name + " оставлен полигон с индексом " + targetFaceIndex as string)
  58. ) else (
  59. print ("В объекте " + polyObj.name + " не найден полигон с нужной нормалью и максимальной площадью.")
  60. )
  61. )
  62. )
  63. )
  64. ) else (
  65. print "Пожалуйста, выберите минимум два объекта: первый — пользовательский объект для направления, остальные — объекты для обработки."
  66. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement