Render.ru

Editable poly, выравнивание вершины

igorznag

Мастер
Рейтинг
103
#21
Цитата igorznag #19:
Цитата Сергей Попов #15:Не интересует применение додификатора FFD и скрипта для выравнивания вершин между 2мя выбранными.
Почему вас не интересует применение додификатора FFD и скрипта для выравнивания вершин между 2мя выбранными?
Вы тратите много времени или результат вас не устраивает?
Цитата Сергей Попов #15:Я заметил, что при использовании локальной системы координат крайние ребра с зажатым Shift выдавливаются не так как хотелось бы.
Попробуйте такой вариант:
Выделяем открытое-крайнее ребро базового объекта Editable Poly.
Запускаем скрипт. В новом окне нажимаем кнопку Apply.
Удерживая клавишу Shift, выдавливаем ребро.
Кнопку Apply нужно нажимать каждый раз, когда выделяется открытое ребро.
rollout igorznag_open_edge_coord "Open Edge Coord"
(
button btn_apply "Apply"; on btn_apply pressed do
(
undo off
(
if(selection.count==1)then
(
obj=selection[1].baseobject
if(classof obj==Editable_Poly)then
(
es_ba=polyop.getEdgeSelection obj
es_open_a=(es_ba*(polyOp.getOpenEdges obj)) as array
if(es_open_a.count>0)then
(
edge_index=es_open_a[1]
edge_faces=polyOp.getEdgeFaces obj edge_index
edge_verts=polyOp.getEdgeVerts obj edge_index
p1=polyop.getVert obj edge_verts[1] node:selection[1]
p2=polyop.getVert obj edge_verts[2] node:selection[1]
v2=normalize (p2-p1); c=(p1+p2)/2
v3=polyop.getFaceNormal obj edge_faces[1] node:selection[1]
fc=polyop.getFaceCenter obj edge_faces[1] node:selection[1]
v1=normalize (cross v3 v2)
fc_p1=normalize(fc-p1); if(dot fc_p1 v1 > 0)then v1=-v1
m=matrix3 v1 v2 v3 c
try delete $shift_plane_igorznag catch ()
sp=plane name:"shift_plane_igorznag" length:0 width:0
sp.lengthsegs=1; sp.widthsegs=1;sp.transform=m
sp.renderable=off;freeze sp; hide sp; toolmode.coordsys sp
)--if(es_open_a.count>0)then
)--if(classof obj=Editable_Poly)then
)--if(selection.count==1)then
)--undo off
)--on btn_apply pressed do
); createDialog igorznag_open_edge_coord

По поводу того, почему не пользоваться модификатором. Да , мне кажется, что тратится много времени, когда делаю модельку, очень отвлекает выделять и накладывать сверху модификатор, а потом опять жать convert to editable poly. Я просто исхожу из того, что возможно кто-то знает альтернативный путь решения стандартными средствами макса и не выходя за рамки функционала editable poly. Кстати за скрипт отдельное спасибо. А можно немного теории по поводу этого скрипта, хотелось бы узнать что он делает. И почему без него работает именно так, как оно работает. В скриптах я не разбираюсь совсем.
Сергей Попов
У вас получилось вернуть точку на плоскость с помощью скрипта из поста 5?
У вас получилось выдавливать крайние ребра с зажатым Shift в нужном напрвалении с помощью скрипта из поста 19?
 

Сергей Попов 144982

Пользователь сайта
Рейтинг
2
#22
Сергей Попов У вас получилось вернуть точку на плоскость с помощью скрипта из поста 5?
Да, получилось. отлично работает. Сюда еще вопрос. заметил, что если полигон не один и точка этого полигона смежная с другим полигоном, то скрипт не работает, с одной стороны оно и понятно, потому что тогда другой полигон станет не планарным, отсюда вопрос, можно сделать скрипт, который бы после выделения массива связанных полигонов т.е. сетки делал бы все её полигоны планарными, пускай даже это повлечет незначительное изменение геометрии сетки в целом.
 

igorznag

Мастер
Рейтинг
103
#23
отсюда вопрос, можно сделать скрипт, который бы после выделения массива связанных полигонов т.е. сетки делал бы все её полигоны планарными, пускай даже это повлечет незначительное изменение геометрии сетки в целом.
Выделяем непланарные полигоны базового объекта Editable Poly.
Запускаем скрипт. В новом окне нажимаем кнопку "Make Planar".
Код:
rollout igorznag_make_planar_all "Make planar all" 
(  
button bnt_make_planar "Make planar" pos:[40,30]
spinner sp_iterations "Iterations" fieldWidth:45 range:[1, 10, 2] pos:[40,5] type:#integer
on bnt_make_planar pressed do 
( 
undo on
(
if(selection.count==1)then 
( 
obj=selection[1].baseobject 
if(classof obj==Editable_Poly)then 
(
fs_a=(polyop.getFaceSelection obj)as array
for j=1 to sp_iterations.value do
for i=1 to fs_a.count do polyOp.makeFacesPlanar obj fs_a[i]
redrawViews()
)--if(classof obj==Editable_Poly)then 
)--if(selection.count==1)then 
)--undo on
)--on bnt_make_planar pressed do 
); createdialog igorznag_make_planar_all 150 60
 
Рейтинг
22
#25
Наличием параметра Iterations, правда у меня не получилось его использовать.
igorznag, как им правильно пользоваться?
 

igorznag

Мастер
Рейтинг
103
#26
а в чём этот скрипт отличается от стандартного Make Planar?
Скрипт выполняет стандартную команду Make Planar для каждого выделенного полигона несколько раз.
igorznag, как им правильно пользоваться?
Что вы имеете в виду? Как запускать скрипт или для чего вообще он нужен?
 

igorznag

Мастер
Рейтинг
103
#28
Как правильно запускать, да.
Вариант 1:
Создаем текстовый файл (NotePad) и копируем текст скрипта.
Сохраняем текстовый файл с названием "test.ms"
В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"

Вариант 2:
Создаем текстовый файл (NotePad) и копируем текст скрипта.
Сохраняем текстовый файл с названием "test.ms"
Выделяем файл "test.ms" и с помощью Drag and Drop перетаскиваем файл в любой Viewport.

Вариант 3:
Создаем текстовый файл (NotePad) и копируем текст скрипта.
Сохраняем текстовый файл с названием "test.ms"
Копируем файл "test.ms" в папку "3dsMax\Scripts\Startup". Запускаем 3ds max.

Вариант 4:
В главное меню MaxScript выбираем пункт New Script.
Копируем текст скрипта в новом окне и нажимаем Ctrl+E.

Вариант 5:
Выделяем текст скрипта и с помощью Drag and Drop перетаскиваем текст скрипта на нужный ToolBar.
Нажимаем новую кнопку на ToolBar-е.
 
Рейтинг
22
#29
Как выполнить скрипт я в курсе, я немного иное хотел спросить, но все равно спасибо за все
возможные варианты запуска скриптов. Он действительно работает, но насчет параметра
Iterations все равно не понял, от его значения по моему ничего не изменяется. Или я не вижу.
На что он должен влиять?
 

igorznag

Мастер
Рейтинг
103
#30
Не обращайте внимание на параметр Iterations и нажмите кнопку Make Planar, столько раз, сколько вам нужно.
Параметр Iterations указывает количество повторений команды Make Planar.
1. Iterations=1. Нажимаем кнопку Make Planar 10 раз.
2. Iterations=10. Нажимаем кнопку Make Planar 1 раз.
Результат в пункте 1 и 2 будет одинаковым.
В код скрипта, если нужно, вы можете изменить максимальное значение для параметра Iterations, например 100000.
 

maiden666

Мастер
Рейтинг
112
#31
придётся всё-таки запустить скрипт, потому-что разрази меня гром не могу понять, что Make Planar может сделать с 10-го раза, что он не сделал с 1-го
 

igorznag

Мастер
Рейтинг
103
#32
Скрипт делает Make Planar выделенным полигонам в плоскости, которую образуют 3 выделенные вершины.
1. Выделяем нужные полигоны базового объекта Editable Poly.
2. Выделяем 3 вершины базового объекта Editable Poly.
3. Запускаем скрипт. В новом окне нажимаем кнопку Make Planar.
Код:
rollout igorznag_three_point_make_planar "3 Point Make planar" 
( 
button bnt_make_planar "Make planar" 
on bnt_make_planar pressed do 
( 
if(selection.count==1)then 
( 
obj=selection[1].baseobject 
if(classof obj==Editable_Poly)then 
( 
vs_ba=polyop.getVertSelection obj; vs_a=vs_ba as array 
fs_ba=polyop.getFaceSelection obj; fs_a=fs_ba as array 
if(vs_a.count==3 and fs_a.count>0)then 
( 
vuf_a=(polyop.getVertsUsingFace obj fs_ba) as array
p1=polyop.getVert obj vs_a[1] node:selection[1]; 
p2=polyop.getVert obj vs_a[2] node:selection[1]; 
p3=polyop.getVert obj vs_a[3] node:selection[1]; 
v1 = normalize (p2 - p1) 
v3 = normalize (cross v1 (normalize (p3 - p1))) 
v2 = normalize (cross v3 v1); m=matrix3 v1 v2 v3 p1; 
in coordsys m 
(
undo on
(
for i=1 to vuf_a.count do
(
p=polyop.getVert obj vuf_a[i] node:selection[1]; 
ct=obj.constrainType;obj.constrainType=0; 
polyop.setVert obj vuf_a[i] [p.x,p.y,0] node:selection[1]
obj.constrainType=ct; 
)--for i=1 to vuf_a.count do
)--in coordsys m 
)--undo on
)--if(va_a.count==1 and fs_a.count>0)then 
)--if(classof $==Editable_Poly)then 
)--if(selection.count==1)then 
)--on bnt_make_planar pressed do 
); createdialog igorznag_three_point_make_planar 180 30
 

INCUS

Знаток
Рейтинг
29
#33
Вообще не понял, почему-то моё "СПАСИБО" поставилось не тому человеку.....
maiden666 извини - не в тебя целился.
Я хотел объявить большую благодарность iqorznaq за скрипты по планарности полигонов, которые, оказывается, много кому полезны.
Люди пердают море пива..
Ещё раз спасибо.
 
Рейтинг
22
#35
igorznag, мне в общем-то скрипты не нужны, я сетку и без них оптимально вроде делаю,
но у меня есть тут один, пользователь, так его назовем, которому они очень понравились.
От его, точнее от ее, имени передаю тебе благодарность (она читает форум под моим
аккаунтом).
 
Сверху