Render.ru

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

Макетер

Пользователь сайта
Рейтинг
2
#84
Всем привет! не работает undo on, прошу совета

Код:
if WeldShapes != undefined do destroyDialog WeldShapes
rollout WeldShapes "WeldShapes" width:126 height:72
(

button CornerVerts "CornerVerts" pos:[8,40] width:74 height:22 toolTip:"Set corner type for all vertices"

on CornerVerts pressed do undo on
(
for s in selection where superclassof s == shape do (
for ss=1 to numsplines s do (
for sss=1 to numKnots s ss do
(
setKnotType s ss sss #corner
)
)
updateshape s
)
)

)
createdialog WeldShapes width:126
 

igorznag

Знаток
Рейтинг
71
#85
Всем привет! не работает undo on, прошу совета
Если сплайны являются уникальными и они не имеют модификаторов, тогда попробуйте такой вариант:
Код:
if WeldShapes != undefined do destroyDialog WeldShapes
rollout WeldShapes "WeldShapes" width:126 height:72
(

button CornerVerts "CornerVerts" pos:[8,40] width:74 height:22 toolTip:"Set corner type for all vertices"

on CornerVerts pressed do undo on
(
for s in selection where superclassof s == shape do (
converttosplineshape s
for ss=1 to numsplines s do (
for sss=1 to numKnots s ss do
(
setKnotType s ss sss #corner
)
)
updateshape s
)
)

)
createdialog WeldShapes width:126
 

Макетер

Пользователь сайта
Рейтинг
2
#86
Вопрос еще, как сделать undo конкретной операции по названию этой операции, которая выпадает в списке операций у кнопки undo вверху?

И где можно почитать более подробнее, чем в хелпе про thehold?
 
Последнее редактирование:
Рейтинг
69
#87
Как сохранить скрипт mse, чтоб повторно не открывать через run, сам скрипт появляется в modifier list , открываю макс , его нет , приходится добавлять
 
Рейтинг
69
#90
Как сохранить другой вид скриптов mse , точнее они нужны на панельки но не в modifer list , попробовал из туда закинуть, при открытие макса, все скрипты выскакивают сами
 

Paguo-86PK

Пользователь сайта
Рейтинг
2
#91
Пользовался на днях сервисами работы с планировками и дизайном квартир. (не поймите как рекламу: Сервисы перечислил для того, может что упустил)
Ни один из сервисов не понравился, т.к. нет там режима сборки помещений из типовых панелей (где все окна/двери уже расчитаны и под розетки дырки). До этого создал максимально приближённую модель своей квартиры в Sim 3 (ссылку на youtube не даю здесь) (обои, пол, стены - максимально по дизайну близки к реалиям) (сами 2 сима жить не могут там: тесно! но мы же живём семером!).
Решил я воспользоваться 3D-Max очередной раз (до этого я тупо рисовал сплайн нашей квартиры и выдавливал стены по нему) уже серъёзно: из типовым Ж/Б-плит. (встроенная стена не подходит - типовушности СССР квартир не даёт).
Код:
unRegisterRedrawViewsCallback showObjectNames
fn showObjectNames = (
    gw.setTransform(Matrix3 1)
    for o in objects where not o.isHidden do (
        local t = StringStream ""
        format "%d\n%\n%" o.pos.x o.pos.y o.pos.z to:t
        gw.text o.pos (o.name) color:yellow
        gw.text (o.pos+[0,0,-2]) (t) color:yellow
    )
--    gw.text [0,0,0] (viewport.GetTM() as string) color:green
    gw.Polyline #([0,0,0],[200,0,0],[200,100,0],[0,100,0]) true
    gw.enlargeUpdateRect #whole
    gw.updateScreen()
)
-- registerRedrawViewsCallback showObjectNames
-- showObjectNames()
fn transformMesh theTriMesh theMatrix = (
    for v = 1 to theTriMesh.numverts do (
        setVert theTriMesh v ((getVert theTriMesh v)*theMatrix)
    )
    theTriMesh
)

plugin simpleObject ConcreteMaker
name:"Concrete"
classID:#(0x77B10BDB, 0x1AB51BB7)
category:"Model Apartment" (
    parameters main rollout:params (
        mode            type:#boolean        ui:mode                default:true
        side            type:#boolean        ui:side                default:true
        depth            type:#worldunits    ui:depth            default:0.25
        length            type:#worldunits    ui:length            default:3.00
        height            type:#worldunits    ui:height            default:3.00
        width            type:#worldunits    ui:width            default:0.30
        door_width        type:#worldunits    ui:door_width        default:0.90
        door_height        type:#worldunits    ui:door_height        default:2.00
        door_seek        type:#integer        ui:door_seek        default:30
        view_width        type:#worldunits    ui:view_width        default:60.0
        view_height        type:#worldunits    ui:view_height        default:60.0
        view_seek        type:#integer        ui:view_seek        default:60
        log_x type:#worldunits ui:log_x
        log_y type:#worldunits ui:log_y
        log_z type:#worldunits ui:log_z
    )
    rollout params "Parameters" (
        local    m = viewport.GetFOV()
        checkbox    mode            "Base (Mesh/Box) "    type:#boolean                                fieldwidth:60
        checkbox    side            "Two sided "        type:#boolean                                fieldwidth:60
        spinner        depth            "Floor depth "        type:#worldunits    range:[0.1, 0.5, 0.25]    fieldwidth:60
        group "Wall" (
            spinner    length            "Wall Length "        type:#worldunits    range:[0.1, 8.0, 3.0]    fieldwidth:60
            spinner    height            "Wall Height "        type:#worldunits    range:[0.1, 5.0, 3.0]    fieldwidth:60
            spinner    width            "Wall Width "        type:#worldunits    range:[0.1, 0.50, 0.30]    fieldwidth:60
        )
        group "Door" (
            spinner    door_width        "Door Width "        type:#worldunits    range:[0.1, 9.0, 0.90]    fieldwidth:60
            spinner    door_height        "Door Height "        type:#worldunits    range:[0.1, 10.0, 2.0]    fieldwidth:60
            slider    door_seek        "Door Place "        type:#integer        range:[0, 100, 30]        fieldwidth:60
        )
        group "Window" (
            spinner    view_width        "Window Width "        type:#worldunits    range:[0.1, 9.0, 0.75]    fieldwidth:60
            spinner    view_height        "Window Height "    type:#worldunits    range:[0.1, 10.0, 3.0]    fieldwidth:60
            slider    view_seek        "Window Place "        type:#integer        range:[0, 100, 50]        fieldwidth:60
        )
        spinner log_x "User X " type:#worldunits range:[-999999,99999,0] fieldwidth:60
        spinner log_y "User Y " type:#worldunits range:[-999999,99999,0] fieldwidth:60
        spinner log_z "User Z " type:#worldunits range:[-999999,99999,0] fieldwidth:60
        materialbutton    mat1        "Forward surface"
        materialbutton    mat2        "Backward surface"
    )
    on buildMesh do (
        if door_height > (height - depth) do door_height = height - depth
        if door_width > (length - width) do door_width = (length - width)
        local    hl = length / 2        -- half wall length
        local    hw = width / 2        -- half wall width
        local    hd = door_width / 2    -- half door width
        local    hv = view_width / 2    -- half view width
        local    dp = -hl + (length - door_width) * door_seek / 100 + hd    -- door pos
        local    vp = -hl + (length - view_width) * view_seek / 100 + hv    -- view pos
        if mode then (
            local    wall = createInstance box length:(width / 2) width:length height:(height + depth)
            local    door = createInstance box length:(width / 2) width:door_width height:door_height
            local    view = createInstance box length:(width / 2) width:view_width height:view_height
            local    msh
            msh = transformMesh wall.mesh (transmatrix [0,0,-depth])
            msh -= transformMesh door.mesh (transmatrix [dp,0,0])
            msh -= transformMesh view.mesh (transmatrix [vp,0,door_height - view_height])
            mesh = transformMesh msh (transmatrix [0,width,0])
--            mesh = transformMesh mesh (transmatrix [0,width / 2,0])
--            wall.mesh = transformMesh wall.mesh (transmatrix [0,-width / 4,-depth])
--            wall.mesh -= transformMesh door.mesh (transmatrix [dp,-width / 2,0])
--            wall.mesh -= transformMesh view.mesh (transmatrix [vp,-width / 2,door_height - view_height])
            if side then (
                meshop.flipNormals msh #{1..mesh.numFaces}
                meshop.attach mesh msh
--                mesh += transformMesh msh (transmatrix [0,-width * 2,0])
            )
            free wall
            free door
            free view
            return mesh
        ) else (
-- .3........5
-- ...13..15..
-- ...
-- ...11..17..
-- .1........7
            local    v = #(
                    [-hl,  -hw,depth],
                    [-hl,  -hw,door_height],
                    [dp-hd-1,-hw,door_height],
                    [dp-hd-2,-hw,depth]
                )
            local    f = #([0,2,1],[0,3,2])
            setMesh mesh \
                verts:#(
/* 1  2*/            [-hl,  -hw,-depth],            [-hl,   hw,-depth],
/* 3  4*/            [-hl,  -hw,height],            [-hl,   hw,height],
/* 5  6*/            [hl,   -hw,height],            [hl,    hw,height],
/* 7  8*/            [hl,   -hw,-depth],            [hl,    hw,-depth],
/* 9 10*/            [0,0,0],[0,0,0],
/*11 12*/            [dp-hd,-hw, 0],                [dp-hd, hw, 0],
/*13 14*/            [dp-hd,-hw,door_height],    [dp-hd, hw,door_height],
/*15 16*/            [dp+hd,-hw,door_height],    [dp+hd, hw,door_height],
/*18 18*/            [dp+hd,-hw, 0],                [dp+hd, hw, 0]
                ) \
                faces:#(
                    [11,1,7],[11,7,17],[11,17,18],
                    [13,1,11],[13,3,1],[13,11,12],
                    [15,5,3],[15,3,13],[15,13,14],
                    [17,7,5],[17,5,15],[17,15,16]
                ) --            materialIDs:#(1,2)
        )
--        meshop.flipNormals mesh #{1..mesh.numFaces}
--        print mesh.numFaces
        return (mesh)
        setMesh mesh \
            verts:#( \
                [-hl,  -hw,-depth],            [-hl,   hw,-depth],        --  1  2
                [-hl,  -hw,height],            [-hl,   hw,height],        --  3  4
                [hl,   -hw,height],            [hl,    hw,height],        --  5  6
                [hl,   -hw,-depth],            [hl,    hw,-depth],        --  7  8
                [0,0,0],[0,0,0],
                [dp-hd,-hw,-depth],            [dp-hd, hw,-depth],        -- 11 12
                [dp-hd,-hw,height],            [dp-hd, hw,height],        -- 13 14
                [dp+hd,-hw,height],            [dp+hd, hw,height],        -- 15 16
                [dp+hd,-hw,-depth],            [dp+hd, hw,-depth],        -- 17 18
                [0,0,0],[0,0,0],
                [dp-hd,-hw, 0],                [dp-hd, hw, 0],            -- 21 22
                [dp-hd,-hw,door_height],    [dp-hd, hw,door_height],-- 23 24
                [dp+hd,-hw,door_height],    [dp+hd, hw,door_height],-- 25 26
                [dp+hd,-hw, 0],                [dp+hd, hw, 0]            -- 27 28
            ) \
            faces:#(    \
                [1,11,13],    [1,13,3],    -- Left front
                [11,17,27],    [11,27,21],    -- Bottom front
                [23,25,15],    [23,15,13],    -- Upper front
                [25,24,26],    [25,23,24],    -- Upper entry
                [17,7,5],    [17,5,15],    -- Right front
                [2,12,14],    [2,14,4],    -- Left back
                [12,18,28],    [12,28,22],    -- Bottom back
                [24,26,16],    [24,16,14],    -- Upper back
                [18,8,6],    [18,6,16],    -- Right back
                [22,21,27],    [22,27,28],    -- Bottom entry
                [21,24,23],    [21,22,24],    -- Left entry
                [25,28,27],    [25,26,28]    -- Right entry
            ) \
            smooth:false
--            extrudeFace mesh #{1..8} width 100 dir:#common
    )
    tool create (
        on mousePoint click do
        case click of (
            1: nodeTM.translation = gridPoint
            4: #stop
        )
        on mouseMove click do
        case click of (
            2: (
                log_x = gridDist.x; log_y = gridDist.y; log_z = gridDist.z
                length = abs gridDist.x
                if length > 10 then length = 10
                height = abs gridDist.z
                if height > 5 then height = 5
                door_height = height * 0.75
                view_height = door_height / 2
                door_width = length / 8
                view_width = door_width
            )
            3: (
                log_x = gridDist.x; log_y = gridDist.y; log_z = gridDist.z
                door_width = abs gridDist.x
                if door_width > 10 then door_width = 10
                door_height = abs gridDist.y
                if door_height >= height - 0.5 then door_height = height - 0.5
                view_height = door_height / 2
            )
            4: (
                log_x = gridDist.x; log_y = gridDist.y; log_z = gridDist.z
--                door_width = abs gridDist.y
                if door_width > 10 then door_width = 10
                door_seek = abs gridDist.x
                if door_seek > 100 then door_seek = 100
            )
        )
    )
)
Всё бы хорошо, но никак не выгугливается решение задачи: Как совместить, скажем, два бокса, один - с лицевыми сторонами, второй - вывернутый наизнанку.
В скрипте пока написал два режима: Из готовых стандартных боксов и из собственной мэши.
1. Собственная мэш очень сильно грешит треугольниками при некоторых ракурсах (бликует или затеняется) и портит текстуру стены;
2. Боксы очень неверно сливаются и не дают нужного результата.

Что должно получиться: Двусторонняя стена для дальнейщей возможности применить к ней 2-side material (одни обои на стороне в одну комнату, другие обои - для другой комнаты).
Код:
plugin simpleObject ApartmentDesign
classID:#(0x77B10BDB, 0x1AB51BB7)
category:"Wall Accessuars"
name:"Switch" (
  fn transformMesh theTriMesh theMatrix = (
    for v = 1 to theTriMesh.numverts do (
      setVert theTriMesh v ((getVert theTriMesh v) * theMatrix)
    )
  theTriMesh
  )
  parameters main rollout:params (
    lamp1 type:#node ui:light1
    lamp2 type:#node ui:light2
    lamp3 type:#node ui:light3
  )
  fn light_filt obj = isKindOf obj light
  rollout params "Parameters" (
    group "Switches && Lights" (
      label lab1 "Pick the lights You are needed"
      pickbutton light1 "Pick" filter:light_filt autodisplay:true across:3
      pickbutton light2 "Pick" filter:light_filt autodisplay:true
      pickbutton light3 "Pick" filter:light_filt autodisplay:true
    )
    on light1 rightclick do (lamp1 = lamp2; lamp2 = lamp3; lamp3 = $Omni_Light)
    on light2 rightclick do (lamp2 = lamp3; lamp3 = $Omni_Light)
    on light3 rightclick do lamp3 = $Omni_Light
  )
  on buildMesh do (
    local lamps = #()
    local hole, body = createInstance box length:2.0 width:6.4 height:6.4
    local offset = 0.1
    if isValidNode lamp1 then append lamps lamp1
    if isValidNode lamp2 then append lamps lamp2
    if isValidNode lamp3 then append lamps lamp3
    if lamps.count == 0 then (
      hole = createInstance torus radius_1:1.6 radius_2:0.3 sliceOn:1 slice_From:-80 slice_To:80
      offset = 3.2
    ) else (
      hole = createInstance box length:1.8 width:6.2 height:6.2
     for i = 1 to lamps.count do (
     pad = createInstance box width:(5.9 / lamps.count) length:1.0 height:6.0
     pad_mesh = transformMesh pad.mesh (transmatrix [0, 0, -3.0])
     rotate pad_mesh (eulerangles (if lamps[i].enabled then -5 else 5) 0 0)
     pad_mesh = transformMesh pad_mesh (transmatrix [6.0 / lamps.count * (i - 1) - (3.0 - 3.0 / lamps.count), -0.8, 3.2])
     if i > 1 then
       mesh += pad_mesh
     else
       mesh = pad_mesh
       free pad
      )
    )
    mesh += (body.mesh - transformMesh hole.mesh (transmatrix [0, -0.5, offset]))
    free hole
    free body
  )
  tool create (
    on mousePoint click do
     case click of (
     1: nodeTM.translation = gridPoint
     2: #stop
    )
  )
)
Та же беда: Проявление треугольников на поверхности розетки в местах отверстий.
(если нажимать кнопки и указывать на лампы - розетка станет выключателем (до трёх позиций), реагирующим на параметр On лампы)
Вопросы:
1. Как побороть проблему с треугольностью текстур на стене?
2. Как совместить два бокса: Нормальный и вывернутый?

P.S.: Как видите из интерфейса, ограничений уйма: Длина стены - до 8м, высота - до 5м, толшина - до 50см (прикинул из стандартов ЖБИ).

Спасибо.
 

Вложения

Последнее редактирование:

Александр Тюрюмин

Пользователь сайта
Рейтинг
4
#92
Помогите, не работает макс скрипт, запускаю через ран скрипт и ничего не происходит, ноль внимания, ни один скрипт не работает. мак 2013-й, переустонавливал не помогает, устонавливал 2014-й та же история, что происходит ?
 

KoL'T

Пользователь сайта
Рейтинг
4
#93
Помогите, не работает макс скрипт, запускаю через ран скрипт и ничего не происходит, ноль внимания, ни один скрипт не работает. мак 2013-й, переустонавливал не помогает, устонавливал 2014-й та же история, что происходит ?
Назначь скрипту горячую клавишу.
Или открой нужный скрипт MAXScript > Open Script... Выдели текст скрипта и перенеси его на тулбар, появится кнопка, при нажатии всё должно работать.
Что за скрипт хоть?
 

KoL'T

Пользователь сайта
Рейтинг
4
#94
Народ, нужна помощь.
В Custom User Interface назначил горячую клавишу на команду Bridge в группе Editable Poly, но она почему-то не срабатывает.
Занёс эту команду отдельно в скрипт и всё заработало, но находится он теперь в группе MainUI. Как сделать так, чтобы этот скрипт лежал в группе Editable Poly?

Сам скрипт:

macroScript Bridge
category: "Editable Polygon Object"
tooltip: "Bridge"
(
$.EditablePoly.Bridge ()
)
 
Рейтинг
221
#95

KoL'T

Пользователь сайта
Рейтинг
4
#96
Не срабатывает скорее всего из за того что не нажата кнопка Keyboard Shortcut Override Toggle
Надо было мне уточнить, она срабатывает, но в этом случае кнопка Bridge зажимается и чтобы соединить рёбра мостом необходимо тянуть от одного ребра до другого, а скрипт сразу соединяет выбранные рёбра.
 
Последнее редактирование:

Belprof

Пользователь сайта
Рейтинг
2
#98
Добрый вечер, форумчане
подскажите как макс скриптом изменять координаты костного рига для анимации?
Имеется изменение координат узловых точек мокапа человека, соответствующих
точкам сгиба конечностей рига.
Каким образом можно передавать этот массив данных в макс ?
изменение данных 30 раз в секунду
Какой тип передачи данных в 3ds max может использоваться в этом случае?
 

Belprof

Пользователь сайта
Рейтинг
2
#99
да, еще
это должно быть в реальном времени,
и точки сгиба могут быть привязаны к хелперам,
если прямое назначение координат не предусмотрено
 

igorznag

Знаток
Рейтинг
71
Имеется изменение координат узловых точек мокапа человека, соответствующих
точкам сгиба конечностей рига.
Предоставьте файл с массивом данных, если можно.
Каким образом вы получили этот массив данных?
Изменения координат являются абсолютными или относительными?
Сколько узловых точек изменяют свои координаты?
Каким образом можно передавать этот массив данных в макс ?
Это можно сделать с помощью функций FileStream: openFile, readValue, readLine.
Пример: Read Geometry Data From Text File - Part One
изменение данных 30 раз в секунду
это должно быть в реальном времени
Может быть лучше создавать ключи анимации в каждом кадре для точках сгиба конечностей рига, а потом масштабировать ключи?
Сколько секунд длится анимация?
 
Сверху