Maxscript. Быстрый Mirror относительно выбранного Center Point.

Автор
Сообщение
На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург

Подскажите пожалуйста, как можно отзеркалить объект в мировых осях, относительно выбранной опорной точки?

Не могу разобраться каким образом вообще в максе происходит отзеркаливание.

Нашёл инфу, что это делается через обычное масштабирование с отрицательными значениями по осям.

Вариант для локальных осей: $.transform  = prescale $.transform [1,-1,1]

А нужно использовать мировые оси и опорную точку.

Определить активный Center Point достаточно просто. 

getCoordCenter()

-- #local

-- #selection

-- #System

Необходимо сделать обычный Mirror для каждой мировой оси X Y Z и выбранной опорной точки, используя функцию выше.

Также интересно, как можно отзеркалить таким же образом полигоны в режиме подобъектов.

Вот пример для оси Y. Но там используется переменная для координатных осей, а не опорной точки.

https://pastebin.com/86YsVHN5 

На сайте c 31.03.2008
Сообщений: 1095
Москва

https://pastebin.com/fqwmJm3j 

Добро пожаловать в матрицы трансформаций и удачи в понимании манипуляций с ними :D

Я в своё время намучился.

Написанные выше методы не единственно возможные.

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:

https://pastebin.com/fqwmJm3j  

Добро пожаловать в матрицы трансформаций и удачи в понимании манипуляций с ними :D

Я в своё время намучился.

Написанные выше методы не единственно возможные.

У меня просто нет слов... ОГРОМНОЕ СПАСИБО -NIK- !!! Твой опыт бесценен!

Скрипт получился просто Шикарный! Осталось только всё соединить и выложить готовую версию!

Буду дальше разбираться с подобъектами)

https://pastebin.com/n5ujkmqM 

На сайте c 31.03.2008
Сообщений: 1095
Москва
С подобъектами советую остановиться на модификаторе mirror и не морочить голову.
На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург

Цитата -NiK-:

https://pastebin.com/fqwmJm3j  

Добро пожаловать в матрицы трансформаций и удачи в понимании манипуляций с ними :D

Я в своё время намучился.

Написанные выше методы не единственно возможные.

Осталось ещё разобраться, как несколько выбранных объектов зеркалить.

local objA =if classof obj == objectSet or classof obj == array then obj else #(obj)

Если добавить массив, то в локальных координатах и относительно центра объекты не зеркалятся, тут уже либо перебором каждого объекта, либо есть проще способ.

Цитата -NiK-:
С подобъектами советую остановиться на модификаторе mirror и не морочить голову.

Согласен, я с с него начал, но тоже запутался с этими матрицами, сейчас думаю уже разберусь)

На сайте c 31.03.2008
Сообщений: 1095
Москва

Метод этого господина хоть и выглядит топорно, но он будет гораздо надёжней.

http://www.scriptspot.com/3ds-max/scripts/unimirror 

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:

Метод этого господина хоть и выглядит топорно, но он будет гораздо надёжней.

http://www.scriptspot.com/3ds-max/scripts/unimirror  

Спасибо, посмотрю)

___________________________

Посмотрел я скрипт выше, так выворачивать полигоны, не отделяя их от сетки это конечно сильно)

Чаще всего мне нужно просто зеркалить элемент или уже кусок элемента, так что стандартный <<macros.run "PolyTools" "MirrorElementX">> мне вполне подходит, осталось только придумать, как перемещать отзеркаленные куски на то-же расстояние только в "минус", относительно опорной точки.

В RappaTools тоже так сделано.

Но там только относительно локальной и мировой опорной точки, и всё на разных командах.Зачем нужно 24 клавиши, если можно обойтись только 5-ю?

1 кнопка на цикл для Center Point

2 клавиши на Copy и Instance

2 клавиши на Mirror по горизонту и вертикали

_________________________________

Появился вопрос, как рассчитать положение подъобъекта в пространстве и переместить его относительно локального центра объекта?

Есть функция snapshotAsMesh $ , с ней можно получить информацию о положении всех вершин объекта в пространстве (с рёбрами и полигонами почему-то не выходит, видимо из-за того, что она записывает триангулированный Mesh).

Итак, сначала нам нужно получить координаты элемента в пространстве.

Конвертируем его в вершины и записываем их в массив:

VertSel = (SelMod.GetSelection #Vertex) as array

Затем необходимо узнать их общее положение (Как ???)

Можно ли записать через среднее значение координат выбранных точек?

MeshObj = snapshotAsMesh $

local SelMod = Filters.GetModOrObj()

local VertSel = (SelMod.GetSelection #Vertex) as array

local N = #{}

local Nv = VertSel.count

for i=1 to Nv do N=N+(getVert MeshObj VertSel[i]))

T = N/Nv -- Координаты элемента

move $.selectedVerts [0, -T.y ,0] -- Перемещение вдоль оси Y относительно [0,0,0]

TLp = $.transform p3 -- Координаты Local Point

Будет ли это работать?

move $.selectedVerts [0, TLp.y-T.y ,0]) -- Переместит ли он зеркально относительно Local Point?

На сайте c 31.03.2008
Сообщений: 1095
Москва

Не зря я вам модификатор Mirror предлагал. Я и сам его использовал в подобном макросе.

Чем глубже вы лезете в эти дебри, тем менее надежным будет ваш скрипт. Единственная разумная причина решать такую простую задачу таким сложным образом - самообучение.

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:

Не зря я вам модификатор Mirror предлагал. Я и сам его использовал в подобном макросе.

Чем глубже вы лезете в эти дебри, тем менее надежным будет ваш скрипт. Единственная разумная причина решать такую простую задачу таким сложным образом - самообучение.

Много разной интересной информации, а я как раз сейчас учусь делать что-то посложнее обычных макросов. 

Положение подобъектов в пространстве и их ориентация - это очень нужная вещь.

Например, благодаря знаниям о положении вершин, я написал простенький скрипт для создания цилиндра, бокса и сферы сразу в выбранной вершине объекта, но чтобы они создавались в центре выбранного ребра или полигона, нужно уже рассчитать положение нескольких точек.

На сайте c 31.03.2008
Сообщений: 1095
Москва

Обучение это святое.

У подобъектов нет ориентации в пространстве (если под ориентацией подразумевается поворот, масштаб и тд).

Подобъекта "элемент" не существует. Полигоны элемента можно получить через getElementsUsingFace.

Советую сразу идти в polyop и meshop и изучать все эти методы. Центры полигонов/фейсов - getFaceCenter.

Далеко не все методы, которые приходят вам в голову будут в готовом виде, как getFaceCenter. Центр эджа, конечно это центроид двух его точек, а центр элемента это центроид всех его точек.

snapshotAsMesh "конвертирует" editablePoly в mesh, поэтому про индексацию всего кроме вертексов можно будет забыть. И всегда делайте delete smesh для этого снапшота по окончанию функции, сам он не удаляется и будет забивать память.

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:

Обучение это святое.

У подобъектов нет ориентации в пространстве (если под ориентацией подразумевается поворот, масштаб и тд).

Подобъекта "элемент" не существует. Полигоны элемента можно получить через getElementsUsingFace.

Советую сразу идти в polyop и meshop и изучать все эти методы. Центры полигонов/фейсов - getFaceCenter.

Далеко не все методы, которые приходят вам в голову будут в готовом виде, как getFaceCenter. Центр эджа, конечно это центроид двух его точек, а центр элемента это центроид всех его точек.

snapshotAsMesh "конвертирует" editablePoly в mesh, поэтому про индексацию всего кроме вертексов можно будет забыть. И всегда делайте delete smesh для этого снапшота по окончанию функции, сам он не удаляется и будет забивать память.

Благодарю за помощь! Буду дальше разбираться)

Читают эту тему: