rollout unnamedRollout "KUBY" width:160 height:185
(
label lbl1 "Select single cube -BlokTravy_Obrasez-, add to the selected -surface_For_Cubes-, push - GO !" pos:[25,5] width:140 height:82
button btn1 "GO !" pos:[30,75] width:100 height:25
label lbl2 "Paint" pos:[65,105] width:40 height:22
button btn2 "Red - Green" pos:[30,125] width:100 height:25
button btn3 "All Gray" pos:[50,155] width:55 height:25
fn sortPoint3ArrByAxis_fn v1 v2 axis: =
(local v = case axis of
(
#x:(v1.x - v2.x)
#y:(v1.y - v2.y)
#z:(v1.z - v2.z)
)
case of
(
(v < 0):-1
(v > 0):1
default:0
)
)
fn PosCubesForVerts_fn a b =
(local aGab=(a.max.z-a.min.z)
pv_b=for i=1 to b.verts.count collect b.verts[i].pos
xpv_b=for i=1 to pv_b.count collect ((pv_b[i][1]/aGab) as integer)*aGab
ypv_b=for i=1 to pv_b.count collect ((pv_b[i][2]/aGab) as integer)*aGab
zpv_b=for i=1 to pv_b.count collect ((pv_b[i][3]/aGab) as integer)*aGab
npv_b=for i=1 to b.verts.count collect [(xpv_b[i]),(ypv_b[i]),(zpv_b[i])]
makeUniqueArray npv_b
)
on btn1 pressed do
(undo on
(if selection.count==2 then
(a1=$[1]; b1=$[2]
arrPos_a2=PosCubesForVerts_fn a1 b1
qsort arrPos_a2 sortPoint3ArrByAxis_fn axis:#z
clearselection(); hide b1
for i=1 to arrPos_a2.count do
(a2=copy a1 pos:(arrPos_a2[i]) name:("BlokRG"+i as string) parent:b1
)
unhide b1; select b1; max views redraw
)
else (messageBox "! ! ! Vydeli Kub, CTRL + Vydeli Poverhnost")
)
)
on btn2 pressed do
(undo on
(all_bl=$b* as array
bl_rg=$blokrg* as array
gbrt=(bl_rg[1].max.z-bl_rg[1].min.z)
for j=1 to bl_rg.count do bl_rg[j].wirecolor=red
for i in all_bl do
for b in bl_rg where distance b.pos [i.pos.x,i.pos.y,i.pos.z-gbrt]<0.01 do b.wirecolor=green
)
)
on btn3 pressed do
(undo on
(all_bl=$b* as array
for j=1 to all_bl.count do all_bl[j].wirecolor=gray
)
)
)
createDialog unnamedRollout pos:[40,110]
Как автоматизировать обновление списка dropdownList в случае удаления объекта из сцены?
Пока указываю явно при выборе имени этого объекта в списке :
local arrObj = #()
fn Select_Complete = (selection.count > 0)
on btnadd pressed do (
if Select_Complete () do (
for i in selection do appendIfUnique arrObj i
ddl1.items = for i in arrObj collect i.name
)
)
on ddl1 selected ob do (
case of
(
( arrObj[ddl1.selection] != undefined and\
not isdeleted arrObj[ddl1.selection]
) : ( select arrObj[ddl1.selection] )
( arrObj[ddl1.selection] == undefined or\
isdeleted arrObj[ddl1.selection]
) : ( deleteItem arrObj ddl1.selection
ddl1.items = for i in arrObj collect i.name
)
)
)
global rulot
fn fn_auto_update_dropdownList =
(
temp_arrObj = #()
for i in rulot.arrObj where not isdeleted i do append temp_arrObj i
rulot.arrObj=temp_arrObj
rulot.ddl1.items = for i in rulot.arrObj collect i.name
)
try destroydialog rulot catch()
rollout rulot "Copy"
(
button btnadd " Add obj "
dropdownList ddl1 "Copy"
local arrObj=#()
fn Select_Complete = (selection.count > 0)
on btnadd pressed do (
if Select_Complete () do (
for i in selection do appendIfUnique arrObj i
ddl1.items = for i in arrObj collect i.name
try callbacks.removeScripts id:#id_auto_update_dropdownList catch()
callbacks.addScript #nodePostDelete "fn_auto_update_dropdownList()" id:#id_auto_update_dropdownList
)
)
on ddl1 selected ob do (
case of
(
( arrObj[ddl1.selection] != undefined and\
not isdeleted arrObj[ddl1.selection]
) : ( select arrObj[ddl1.selection] )
)
)
)
createdialog rulot
Добрый день!
Обращаюсь к знатокам за подсказкой...
Изначальная задача такая:
- двигать вершины(в режиме ручного редактирования) в модификаторе EditPoly объекта, но чтобы они смещались по заданному правилу (нужно чтобы они все двигались
по линиям-лучам исходящим из одной точки) т.е. если перемещаем сразу несколько точек - то у каждой точки свое направление перемещения
Для себя определил такой возможный вариант реализации:
- регистрируем функцию на NodeEventCallback geometryChanged
- при изменении координат вершин в объекте - запускается наша функция
которая определяет откуда и куда сместились точки - и корректирует их координаты
так чтобы они вернулись на линии-лучи
Может есть какой-нибудь способ лучше - это реализовать, подскажите если знаете?
IronixИзначальная задача такая:
- двигать вершины(в режиме ручного редактирования) в модификаторе EditPoly объекта, но чтобы они смещались по заданному правилу (нужно чтобы они все двигались
по линиям-лучам исходящим из одной точки) т.е. если перемещаем сразу несколько точек - то у каждой точки свое направление перемещения
Для чего вам это нужно?
Почему именно модификатор Edit Poly, а не базовый объект Editable Poly?
Модификатор Edit Poly принадлежит одному объекту или нескольким объектам?
Почему именно в режиме ручного редактирования?
Можно создать окно и двигать выделенные вершины с помощью Spinner.
Где находится точка из которой исходят линии-лучи?
Эта точка находится в позиции камеры или вида Perspective?
igorznagДля чего вам это нужно?
Почему именно модификатор Edit Poly, а не базовый объект Editable Poly?
Модификатор Edit Poly принадлежит одному объекту или нескольким объектам?
Почему именно в режиме ручного редактирования?
Можно создать окно и двигать выделенные вершины с помощью Spinner.
Где находится точка из которой исходят линии-лучи?
Эта точка находится в позиции камеры или вида Perspective?
Привет.
Есть идея сделать инструмент, хотя даже не уверен
будет ли он удобен и полезен - но желание проверить не дает покоя )
Суть идеи:
моделирование предмета по фотографии, когда нет возможности
раздобыть фотографии в профиль. Для этого мы размещаем фото общего вида
перед камерой, и наносим базовую основу сетки по фотографии, пока в одной
плоскости. После этого начинаем двигать точки в глубину, но если мы будем
двигать вдоль оси z в координатах screen камеры, то точки будут уезжать с установленных
мест относительно фото (это уже проверено). Спиннером я пробовал делать -
работало, правда мне показалось, что будет удобнее двигать руками по глубине
от камеры(так как основу делаем тоже руками в edit_poly или editable_poly), и чтобы оно само
корректировалось по "лучам" из камеры, но тогда у меня не хватило опыта
сделать то что хочу, и я забросил до появления новых идей, и вот теперь
накопал возможность сделать через NodeEventCallback и кажется может заработать.
Пробовал программу моделирования по фотографии Autodesk ImageModeler - не понравилось.
Хотел реализовать немного другую методику в привычном максе)
Ironixнакопал возможность сделать через NodeEventCallback и кажется может заработать.
Мне кажется, что не заработает.
Корректировка в NodeEventCallback вызывает его рекурсивно.
Корректировка в Change Handlers and When Constructs происходит после завершения движения.
Можно нажать кнопку (клавишу) и создать один Dummy в центре выделенных вершин.
Включаем When transform Dummy change.
Двигаем руками Dummy. Выделенные вершины корректируются при движении Dummy.
Нажимаем ещё раз кнопку (клавишу), чтобы удалить Dummy и возвращаемся к Editable Poly.
Такой вариант для вас подходит?
igorznagМне кажется, что не заработает.
Корректировка в NodeEventCallback вызывает его рекурсивно.
Да верно, столкнулся с этим сегодня, когда разбирался с механизмом подробнее. Но есть вариант сохранять переменную-метку, о том что последнее изменение произошло через скрипт, и при следующем запуске callback функции её сразу завершать. В принципе способ рабочий, только есть особенность - не корректируется сразу положение точек когда ты их тащишь (Drag) - но если вызывать callback когда отпускается кнопка мыши, то нормально точки возвращаются на "лучи"
igorznagКорректировка в Change Handlers and When Constructs происходит после завершения движения.
С этими методами я еще не разобрался, как то давно пробовал, но не заработало у меня ( что то не правильно делал, или не правильно понял.
igorznag
Можно нажать кнопку (клавишу) и создать один Dummy в центре выделенных вершин.
Включаем When transform Dummy change.
Двигаем руками Dummy. Выделенные вершины корректируются при движении Dummy.
Нажимаем ещё раз кнопку (клавишу), чтобы удалить Dummy и возвращаемся к Editable Poly.
Такой вариант для вас подходит?
Спасибо за идею, хотя получаются "лишние" нажимания кнопок(клавиш). Наверно тогда уж лучше через спиннер.
Еще появилась идея, если двигать по одной точке за раз то можно изменять toolMode.coordsys на объект с развернутой координатой параллельно нужному лучу, и тогда точка уже без проблем будет "ездить" вдоль луча, а при выделении новой точки опять поворачивать координаты в нужном направлении.
Только пока не разобрался как мне повернуть pivot так чтобы Z ось смотрела в направлении вектора V, нет ли какого нибудь изящного способа?
IronixТолько пока не разобрался как мне повернуть pivot так чтобы Z ось смотрела в направлении вектора V, нет ли какого нибудь изящного способа?
Pivot лучше не трогать. Можно повернуть transform. Изящная матрица получается так:
matrixFromNormal V
Еще появилась идея, если двигать по одной точке за раз то можно изменять toolMode.coordsys на объект с развернутой координатой параллельно нужному лучу, и тогда точка уже без проблем будет "ездить" вдоль луча, а при выделении новой точки опять поворачивать координаты в нужном направлении.
Такой скрипт я уже написал в теме: Движение объектов, вертексов вдоль оси просмотра камеры. Сообщение 19.
Пример:
В новой сцене создаём один чайник и конвертируем его в Editable Poly.
Создаём одну камеру с названием "projection".
Выделяем одну вершину чайника.
Запускаем скрипт. Перемещаем вершину в новой системе координат.
Выделяем другую вершину чайника. Перемещаем вершину в новой системе координат.
igorznagPivot лучше не трогать. Можно повернуть transform. Изящная матрица получается так:
matrixFromNormal V
Такой скрипт я уже написал в теме: Движение объектов, вертексов вдоль оси просмотра камеры. Сообщение 19.
Пример:
В новой сцене создаём один чайник и конвертируем его в Editable Poly.
Создаём одну камеру с названием "projection".
Выделяем одну вершину чайника.
Запускаем скрипт. Перемещаем вершину в новой системе координат.
Выделяем другую вершину чайника. Перемещаем вершину в новой системе координат.
Добрый вечер. Написал небольшой скрипт который записывает нужную мне инфу после рендера в блокнот и сохраняет в ту же папку куда и рендер. Работает как post script. Но только на одном кадре
Вот думаю как это осуществить на анимированной камере, что бы он вносил дополнительную информацию в этот блок но уже после каждого отрендереного кадра.
Post script в данном случаем у меня не работает потому что он запускается только после того как отсчитается последний кадр в анимации, а нужно как то его запускать после каждого кадра.
Может кто подскажет
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
igorznag
rollout unnamedRollout "KUBY" width:160 height:185 ( label lbl1 "Select single cube -BlokTravy_Obrasez-, add to the selected -surface_For_Cubes-, push - GO !" pos:[25,5] width:140 height:82 button btn1 "GO !" pos:[30,75] width:100 height:25 label lbl2 "Paint" pos:[65,105] width:40 height:22 button btn2 "Red - Green" pos:[30,125] width:100 height:25 button btn3 "All Gray" pos:[50,155] width:55 height:25 fn sortPoint3ArrByAxis_fn v1 v2 axis: = (local v = case axis of ( #x:(v1.x - v2.x) #y:(v1.y - v2.y) #z:(v1.z - v2.z) ) case of ( (v < 0):-1 (v > 0):1 default:0 ) ) fn PosCubesForVerts_fn a b = (local aGab=(a.max.z-a.min.z) pv_b=for i=1 to b.verts.count collect b.verts[i].pos xpv_b=for i=1 to pv_b.count collect ((pv_b[i][1]/aGab) as integer)*aGab ypv_b=for i=1 to pv_b.count collect ((pv_b[i][2]/aGab) as integer)*aGab zpv_b=for i=1 to pv_b.count collect ((pv_b[i][3]/aGab) as integer)*aGab npv_b=for i=1 to b.verts.count collect [(xpv_b[i]),(ypv_b[i]),(zpv_b[i])] makeUniqueArray npv_b ) on btn1 pressed do (undo on (if selection.count==2 then (a1=$[1]; b1=$[2] arrPos_a2=PosCubesForVerts_fn a1 b1 qsort arrPos_a2 sortPoint3ArrByAxis_fn axis:#z clearselection(); hide b1 for i=1 to arrPos_a2.count do (a2=copy a1 pos:(arrPos_a2[i]) name:("BlokRG"+i as string) parent:b1 ) unhide b1; select b1; max views redraw ) else (messageBox "! ! ! Vydeli Kub, CTRL + Vydeli Poverhnost") ) ) on btn2 pressed do (undo on (all_bl=$b* as array bl_rg=$blokrg* as array gbrt=(bl_rg[1].max.z-bl_rg[1].min.z) for j=1 to bl_rg.count do bl_rg[j].wirecolor=red for i in all_bl do for b in bl_rg where distance b.pos [i.pos.x,i.pos.y,i.pos.z-gbrt]<0.01 do b.wirecolor=green ) ) on btn3 pressed do (undo on (all_bl=$b* as array for j=1 to all_bl.count do all_bl[j].wirecolor=gray ) ) ) createDialog unnamedRollout pos:[40,110]Penter
rollout rulot "Copy" ( button btnadd " Add obj " dropdownList ddl1 "Copy" dropdownList ddl2 "Location: " items:#( "top", "front", "left" ) pickbutton tyk " Stage " on rulot open do ( bo1=box(); bo2=box pos:[50, 0, 0] width:20 length:30 height:10 select #(bo1, bo2) ) local arrObj=#() on btnadd pressed do (if selection.count>0 then for i=1 to selection.count do insertItem selection[i] arrObj 1 ddl1.items=for i in arrObj collect i.name ) on tyk picked obj do ( undo on ( pp=#( [obj.center.x, obj.center.y, obj.max.z],\ [obj.min.x-(obj.max.x-obj.min.x)/2, obj.center.y, obj.min.z],\ [obj.center.x, obj.min.y-(obj.max.y-obj.min.y)/2, obj.min.z] ) bb=copy arrObj[ddl1.selection] pos:pp[3] max views redraw ) ) ) createdialog rulotigorznag
Penter
Penter
Пока указываю явно при выборе имени этого объекта в списке :
local arrObj = #() fn Select_Complete = (selection.count > 0) on btnadd pressed do ( if Select_Complete () do ( for i in selection do appendIfUnique arrObj i ddl1.items = for i in arrObj collect i.name ) ) on ddl1 selected ob do ( case of ( ( arrObj[ddl1.selection] != undefined and\ not isdeleted arrObj[ddl1.selection] ) : ( select arrObj[ddl1.selection] ) ( arrObj[ddl1.selection] == undefined or\ isdeleted arrObj[ddl1.selection] ) : ( deleteItem arrObj ddl1.selection ddl1.items = for i in arrObj collect i.name ) ) )igorznag
global rulot fn fn_auto_update_dropdownList = ( temp_arrObj = #() for i in rulot.arrObj where not isdeleted i do append temp_arrObj i rulot.arrObj=temp_arrObj rulot.ddl1.items = for i in rulot.arrObj collect i.name ) try destroydialog rulot catch() rollout rulot "Copy" ( button btnadd " Add obj " dropdownList ddl1 "Copy" local arrObj=#() fn Select_Complete = (selection.count > 0) on btnadd pressed do ( if Select_Complete () do ( for i in selection do appendIfUnique arrObj i ddl1.items = for i in arrObj collect i.name try callbacks.removeScripts id:#id_auto_update_dropdownList catch() callbacks.addScript #nodePostDelete "fn_auto_update_dropdownList()" id:#id_auto_update_dropdownList ) ) on ddl1 selected ob do ( case of ( ( arrObj[ddl1.selection] != undefined and\ not isdeleted arrObj[ddl1.selection] ) : ( select arrObj[ddl1.selection] ) ) ) ) createdialog rulotPenter
Ironix
Обращаюсь к знатокам за подсказкой...
Изначальная задача такая:
- двигать вершины(в режиме ручного редактирования) в модификаторе EditPoly объекта, но чтобы они смещались по заданному правилу (нужно чтобы они все двигались
по линиям-лучам исходящим из одной точки) т.е. если перемещаем сразу несколько точек - то у каждой точки свое направление перемещения
Для себя определил такой возможный вариант реализации:
- регистрируем функцию на NodeEventCallback geometryChanged
- при изменении координат вершин в объекте - запускается наша функция
которая определяет откуда и куда сместились точки - и корректирует их координаты
так чтобы они вернулись на линии-лучи
Может есть какой-нибудь способ лучше - это реализовать, подскажите если знаете?
igorznag
Почему именно модификатор Edit Poly, а не базовый объект Editable Poly?
Модификатор Edit Poly принадлежит одному объекту или нескольким объектам?
Почему именно в режиме ручного редактирования?
Можно создать окно и двигать выделенные вершины с помощью Spinner.
Где находится точка из которой исходят линии-лучи?
Эта точка находится в позиции камеры или вида Perspective?
Ironix
Есть идея сделать инструмент, хотя даже не уверен
будет ли он удобен и полезен - но желание проверить не дает покоя )
Суть идеи:
моделирование предмета по фотографии, когда нет возможности
раздобыть фотографии в профиль. Для этого мы размещаем фото общего вида
перед камерой, и наносим базовую основу сетки по фотографии, пока в одной
плоскости. После этого начинаем двигать точки в глубину, но если мы будем
двигать вдоль оси z в координатах screen камеры, то точки будут уезжать с установленных
мест относительно фото (это уже проверено). Спиннером я пробовал делать -
работало, правда мне показалось, что будет удобнее двигать руками по глубине
от камеры(так как основу делаем тоже руками в edit_poly или editable_poly), и чтобы оно само
корректировалось по "лучам" из камеры, но тогда у меня не хватило опыта
сделать то что хочу, и я забросил до появления новых идей, и вот теперь
накопал возможность сделать через NodeEventCallback и кажется может заработать.
Пробовал программу моделирования по фотографии Autodesk ImageModeler - не понравилось.
Хотел реализовать немного другую методику в привычном максе)
igorznag
Корректировка в NodeEventCallback вызывает его рекурсивно.
Корректировка в Change Handlers and When Constructs происходит после завершения движения.
Можно нажать кнопку (клавишу) и создать один Dummy в центре выделенных вершин.
Включаем When transform Dummy change.
Двигаем руками Dummy. Выделенные вершины корректируются при движении Dummy.
Нажимаем ещё раз кнопку (клавишу), чтобы удалить Dummy и возвращаемся к Editable Poly.
Такой вариант для вас подходит?
Ironix
С этими методами я еще не разобрался, как то давно пробовал, но не заработало у меня ( что то не правильно делал, или не правильно понял.
Спасибо за идею, хотя получаются "лишние" нажимания кнопок(клавиш). Наверно тогда уж лучше через спиннер.
Еще появилась идея, если двигать по одной точке за раз то можно изменять toolMode.coordsys на объект с развернутой координатой параллельно нужному лучу, и тогда точка уже без проблем будет "ездить" вдоль луча, а при выделении новой точки опять поворачивать координаты в нужном направлении.
Только пока не разобрался как мне повернуть pivot так чтобы Z ось смотрела в направлении вектора V, нет ли какого нибудь изящного способа?
igorznag
Такой скрипт я уже написал в теме:
Движение объектов, вертексов вдоль оси просмотра камеры. Сообщение 19.
Пример:
В новой сцене создаём один чайник и конвертируем его в Editable Poly.
Создаём одну камеру с названием "projection".
Выделяем одну вершину чайника.
Запускаем скрипт. Перемещаем вершину в новой системе координат.
Выделяем другую вершину чайника. Перемещаем вершину в новой системе координат.
Ironix
Skap
Вот думаю как это осуществить на анимированной камере, что бы он вносил дополнительную информацию в этот блок но уже после каждого отрендереного кадра.
Post script в данном случаем у меня не работает потому что он запускается только после того как отсчитается последний кадр в анимации, а нужно как то его запускать после каждого кадра.
Может кто подскажет
igorznag
Пример. В новой сцене запускаем скрипт.
Открываем окно MaxScript Listener (клавиша F11).
Визуализируем сцену с кадра 0 до кадра 100.
fn fn_postRenderFrame= ( print ("Rendering frame: " + ((currentTime.frame as integer) as string)) ) callbacks.removeScripts id:#igorznag_postRenderFrame callbacks.addScript #postRenderFrame "fn_postRenderFrame()" id:#igorznag_postRenderFrameSkap
fn CreateTxtFile = ( TXTfile = (createFile (TxtFilePathName)) format "firstText" to: TXTfile ) fn ReditTxtFile = ( txtopen = openFile TxtFilePathName mode: "a" --inetxt = readLine 1 --deleteFile TxtFilePathName ) TxtFilePathName = "D:/MyTest.txt" CreateTxtFile() ReditTxtFile() close TXTfileНе могу разобраться почему он не даёт мне открыть и дописатьОшибка
-- Runtime error: FileStream cannot create: D:\MyTest.txt
Или киньте в меня ссылочкой, как через maxscript редактировать ранее созданный txt файл
igorznag
TxtFilePathName = "D:/MyTest.txt" fn CreateTxtFile = ( TXTfile = (createFile (TxtFilePathName)) format "firstText" to: TXTfile close TXTfile ) fn ReditTxtFile = ( txtopen = openFile TxtFilePathName mode: "a" format " secondText" to: txtopen close txtopen ) CreateTxtFile(); ReditTxtFile()Skap
как его выбрать?
WallUNameU=(($.name)+"wu") select $WallUNameUилиWallUNameU="$"+(($.name)+"wu") select (WallUNameU)не то не то не работаетВ первом варианте я примерно понимаю почему
а вот втором пишет
No ""select"" function for "$Plane001wu"
igorznag
Вариант 2: