Render.ru

Вопросы по Max Script (всего понемногу)

igorznag

Мастер
Рейтинг
103
#61
Код:
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

Пользователь сайта
Рейтинг
4
#62
Как увязать выбор из массива Point3-(pp) с выбором из списка ddl-(ddl2)
Код:
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 rulot
 

Penter

Пользователь сайта
Рейтинг
4
#64
Всем здравствуйте. Может у кого есть ссылки на уроки по Mouse Tool Clauses и mouseTrack() Function, если такие существуют.
 

Penter

Пользователь сайта
Рейтинг
4
#65
Как автоматизировать обновление списка 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
       )
  )
)
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#66
Код:
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
 

Ironix

Активный участник
Рейтинг
7
#68
Добрый день!
Обращаюсь к знатокам за подсказкой...


Изначальная задача такая:
- двигать вершины(в режиме ручного редактирования) в модификаторе EditPoly объекта, но чтобы они смещались по заданному правилу (нужно чтобы они все двигались
по линиям-лучам исходящим из одной точки) т.е. если перемещаем сразу несколько точек - то у каждой точки свое направление перемещения

Для себя определил такой возможный вариант реализации:
- регистрируем функцию на NodeEventCallback geometryChanged
- при изменении координат вершин в объекте - запускается наша функция
которая определяет откуда и куда сместились точки - и корректирует их координаты
так чтобы они вернулись на линии-лучи

Может есть какой-нибудь способ лучше - это реализовать, подскажите если знаете?
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#69
Изначальная задача такая:
- двигать вершины(в режиме ручного редактирования) в модификаторе EditPoly объекта, но чтобы они смещались по заданному правилу (нужно чтобы они все двигались
по линиям-лучам исходящим из одной точки) т.е. если перемещаем сразу несколько точек - то у каждой точки свое направление перемещения
Для чего вам это нужно?
Почему именно модификатор Edit Poly, а не базовый объект Editable Poly?
Модификатор Edit Poly принадлежит одному объекту или нескольким объектам?
Почему именно в режиме ручного редактирования?
Можно создать окно и двигать выделенные вершины с помощью Spinner.
Где находится точка из которой исходят линии-лучи?
Эта точка находится в позиции камеры или вида Perspective?
 

Ironix

Активный участник
Рейтинг
7
#70
Для чего вам это нужно?
Почему именно модификатор Edit Poly, а не базовый объект Editable Poly?
Модификатор Edit Poly принадлежит одному объекту или нескольким объектам?
Почему именно в режиме ручного редактирования?
Можно создать окно и двигать выделенные вершины с помощью Spinner.
Где находится точка из которой исходят линии-лучи?
Эта точка находится в позиции камеры или вида Perspective?
Привет.
Есть идея сделать инструмент, хотя даже не уверен
будет ли он удобен и полезен - но желание проверить не дает покоя )
Суть идеи:
моделирование предмета по фотографии, когда нет возможности
раздобыть фотографии в профиль. Для этого мы размещаем фото общего вида
перед камерой, и наносим базовую основу сетки по фотографии, пока в одной
плоскости. После этого начинаем двигать точки в глубину, но если мы будем
двигать вдоль оси z в координатах screen камеры, то точки будут уезжать с установленных
мест относительно фото (это уже проверено). Спиннером я пробовал делать -
работало, правда мне показалось, что будет удобнее двигать руками по глубине
от камеры(так как основу делаем тоже руками в edit_poly или editable_poly), и чтобы оно само
корректировалось по "лучам" из камеры, но тогда у меня не хватило опыта
сделать то что хочу, и я забросил до появления новых идей, и вот теперь
накопал возможность сделать через NodeEventCallback и кажется может заработать.

Пробовал программу моделирования по фотографии Autodesk ImageModeler - не понравилось.
Хотел реализовать немного другую методику в привычном максе)
 

igorznag

Мастер
Рейтинг
103
#71
накопал возможность сделать через NodeEventCallback и кажется может заработать.
Мне кажется, что не заработает.
Корректировка в NodeEventCallback вызывает его рекурсивно.
Корректировка в Change Handlers and When Constructs происходит после завершения движения.

Можно нажать кнопку (клавишу) и создать один Dummy в центре выделенных вершин.
Включаем When transform Dummy change.
Двигаем руками Dummy. Выделенные вершины корректируются при движении Dummy.
Нажимаем ещё раз кнопку (клавишу), чтобы удалить Dummy и возвращаемся к Editable Poly.
Такой вариант для вас подходит?
 

Ironix

Активный участник
Рейтинг
7
#72
Мне кажется, что не заработает.
Корректировка в NodeEventCallback вызывает его рекурсивно.
Да верно, столкнулся с этим сегодня, когда разбирался с механизмом подробнее. Но есть вариант сохранять переменную-метку, о том что последнее изменение произошло через скрипт, и при следующем запуске callback функции её сразу завершать. В принципе способ рабочий, только есть особенность - не корректируется сразу положение точек когда ты их тащишь (Drag) - но если вызывать callback когда отпускается кнопка мыши, то нормально точки возвращаются на "лучи"
Корректировка в Change Handlers and When Constructs происходит после завершения движения.
С этими методами я еще не разобрался, как то давно пробовал, но не заработало у меня ( что то не правильно делал, или не правильно понял.
Можно нажать кнопку (клавишу) и создать один Dummy в центре выделенных вершин.
Включаем When transform Dummy change.
Двигаем руками Dummy. Выделенные вершины корректируются при движении Dummy.
Нажимаем ещё раз кнопку (клавишу), чтобы удалить Dummy и возвращаемся к Editable Poly.
Такой вариант для вас подходит?
Спасибо за идею, хотя получаются "лишние" нажимания кнопок(клавиш). Наверно тогда уж лучше через спиннер.

Еще появилась идея, если двигать по одной точке за раз то можно изменять toolMode.coordsys на объект с развернутой координатой параллельно нужному лучу, и тогда точка уже без проблем будет "ездить" вдоль луча, а при выделении новой точки опять поворачивать координаты в нужном направлении.
Только пока не разобрался как мне повернуть pivot так чтобы Z ось смотрела в направлении вектора V, нет ли какого нибудь изящного способа?
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#73
Только пока не разобрался как мне повернуть pivot так чтобы Z ось смотрела в направлении вектора V, нет ли какого нибудь изящного способа?
Pivot лучше не трогать. Можно повернуть transform. Изящная матрица получается так:
Код:
matrixFromNormal V
Еще появилась идея, если двигать по одной точке за раз то можно изменять toolMode.coordsys на объект с развернутой координатой параллельно нужному лучу, и тогда точка уже без проблем будет "ездить" вдоль луча, а при выделении новой точки опять поворачивать координаты в нужном направлении.
Такой скрипт я уже написал в теме:
Движение объектов, вертексов вдоль оси просмотра камеры. Сообщение 19.
Пример:
В новой сцене создаём один чайник и конвертируем его в Editable Poly.
Создаём одну камеру с названием "projection".
Выделяем одну вершину чайника.
Запускаем скрипт. Перемещаем вершину в новой системе координат.
Выделяем другую вершину чайника. Перемещаем вершину в новой системе координат.
 

Ironix

Активный участник
Рейтинг
7
#74
Pivot лучше не трогать. Можно повернуть transform. Изящная матрица получается так:
Код:
matrixFromNormal V
Такой скрипт я уже написал в теме:
Движение объектов, вертексов вдоль оси просмотра камеры. Сообщение 19.
Пример:
В новой сцене создаём один чайник и конвертируем его в Editable Poly.
Создаём одну камеру с названием "projection".
Выделяем одну вершину чайника.
Запускаем скрипт. Перемещаем вершину в новой системе координат.
Выделяем другую вершину чайника. Перемещаем вершину в новой системе координат.
Спасибо, буду изучать...
 

Skap

Знаток
Рейтинг
44
#75
Добрый вечер. Написал небольшой скрипт который записывает нужную мне инфу после рендера в блокнот и сохраняет в ту же папку куда и рендер. Работает как post script. Но только на одном кадре
Вот думаю как это осуществить на анимированной камере, что бы он вносил дополнительную информацию в этот блок но уже после каждого отрендереного кадра.
Post script в данном случаем у меня не работает потому что он запускается только после того как отсчитается последний кадр в анимации, а нужно как то его запускать после каждого кадра.
Может кто подскажет
 

igorznag

Мастер
Рейтинг
103
#76
Используйте callback postRenderFrame.

Пример. В новой сцене запускаем скрипт.
Открываем окно 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_postRenderFrame
 

Skap

Знаток
Рейтинг
44
#77
Код:
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

Мастер
Рейтинг
103
#78
Код:
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

Skap

Знаток
Рейтинг
44
#79
Продолжаю возникать вопросы. Не смог нагуглить как правильно
как его выбрать?
Код:
WallUNameU=(($.name)+"wu")
                    select $WallUNameU
или
Код:
WallUNameU="$"+(($.name)+"wu")
                    select (WallUNameU)
не то не то не работает
В первом варианте я примерно понимаю почему
а вот втором пишет
No ""select"" function for "$Plane001wu"
 

igorznag

Мастер
Рейтинг
103
#80
Вариант 1:
Код:
WallUNameU=(($.name)+"wu")
select (getnodebyname WallUNameU)
Вариант 2:
Код:
WallUNameU="$"+(($.name)+"wu")
select (execute WallUNameU)
 
Сверху