1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Float Controller, группы и прочее

Тема в разделе "MAXScript", создана пользователем Paguo-86PK, 26 май 2012.

Модераторы: Savin Denis
  1. Paguo-86PK

    Paguo-86PK Пользователь сайта

    С нами с:
    26.11.2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    С 3D-Studio MAX знаком лет восемь, но вскольз. Поэтому возникли некоторые проблемы в пустяках. Можно сказать, вообще не понимаю элементарного.
    Гуглил, но что-то не так формулирую.

    1. Каким образом можно создать собственный объект, который не отображается в сцене, но имеет кучу опциональных параметров, свободно регулируемых на-ходу из Control Panel:Modify?
    2. Сейчас для этой цели тупо создал Torus Knot, так-как у него много параметров, чтобы все объекты сцены синхронно действовали, повесил на его Radius скрипт лишь для ради переменных nPhase, bPhase и fPhase (Track View - Curve Editor: Torus Knot01->Transform->Position->Z_Position - Assign Float Controller):
    Код:
    modulo = $Torus_Knot01.Radius2
    global bPhase = (0f + mod currentTime.ticks modulo) / modulo -- beat phase
    global nPhase = (0f + currentTime.ticks) / modulo            -- number of phase
    global fPhase = $Torus_Knot01.P                              -- force of beats
    
    nPhase
    Но как взять значения других параметров не через явное указание имени ($Torus_Knot01), а типо через this?
    3. А если все эти объекты сгруппированны, как получить доступ к соседним объектам в пределах этой группы, не указывая имён?

    Спасибо!
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Вы хотите сделать это вручную или с помощью MaxScript?
    Если вы хотите сделать это с помощью MaxScript, тогда как вы это делаете вручную?
    В справке по MaxScript есть пример. 'This' Local Variable in Scripted Controllers
    Сначала получяем доступ к родителю ($Torus_Knot01.parent), а потом получаем доступ к детям родителя ($Torus_Knot01.parent.children)
     
  3. Paguo-86PK

    Paguo-86PK Пользователь сайта

    С нами с:
    26.11.2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    1. Свой объект создаю через MaxScript, нашёл пример с чайником.
    2. Пример помог. Однако, я ожидал, что цикл не нужен :)
    3. Теперь ясно, Попробую...

    У меня в сцене имеется некий "прыгунок":

    Вот работаю над тем, чтобы эта группа объектов (шар и два тора) работали слаженно: Шар не падал ниже радиуса, а амплитуда растягивания и циркуляции торов зависила от радиуса шара.
    А то просто устал вручную всё подгонять :)

    Спасибо!
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Paguo-86PK, Будь пожайлуста внимательнее при создании топиков, не плоди дубли.
     
  5. Paguo-86PK

    Paguo-86PK Пользователь сайта

    С нами с:
    26.11.2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    Хорошо!
    Правда дубли я не плодил специально. Просто три раза выходила страница ошибки сервера. Я думал сервер не отвечает.
    Впрочем, с моей связью такое случается. Обычно на других форумах в таких случаях моё сообщение действительно не отправляется...

    В общем, написал я в MaxScript свой Plugin. Но он не доделан и работает не как надо.
    Во-первых, вместо одного, создаётся четыре объекта (один мой + три примитива), а руппирую - два объекта;
    Во-вторых, после создания, в Modify изменение параметров никак не влияет;
    В-третьих, собственно в самом объекте ветка Object пуста и я не понимаю, как добавить туда переменные;
    В-четвёртых, преобразую примитивы в mesh - обобщается цвета и пропадает динамика.

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

    Параметры должны быть такие:
    Radius - радиус сферы. Влияет и на радиус/толщину торов;
    BPM - количество ударов (прыжков) шара в минуту;

    И ещё проблема: Как видно, изначально спиннер bpm должен иметь начальное значение 97.363, но в интерфейсе он сброшен в минимум (30). Глюки только у меня в системе? Или я не так действую?

    Спасибо!
    Код:
    plugin simpleObject Jumper
    	name:"Jumper"
    	classID:#(63445,55332)
    --	extends:Dummy
    	category:"Dynamics Objects" (
    	local Jumper = 0, JumperB, JumperG, JumperR
    	local tempo = point3 30.0f 120.0f 97.363f
    	local startPoint
    	rollout creator "Parameters" (
    		spinner rad "Radius" range:[10,50,20] type:#integer scale:1
    		spinner str "Strange" range:[4,32,12] type:#integer scale:1
    		spinner bpm "BPM" range:tempo type:#float scale:1
    		group "Object Creator" (
    			button tea "Create"
    		)
    		on bpm changed val do tempo.z = val
    	)
    	parameters Object rollout:creator (
    		mapAmounts type:#floatTab tabSize:3
    		ui:(rad, str, bpm)
    	)
    	on buildMesh do (
    	)
    	tool create (
    		local startPoint
    		on mousePoint click do
    		case click of (
    			1: (
    				JumperG = sphere radius:12 color:green
    				JumperB = torus  radius2:15 color:blue
    				JumperR = torus  radius2:15 color:red
    				JumperR.pos = gridPoint
    				JumperG.pos = gridPoint
    				JumperB.pos = gridPoint
    			)
    			2: (
    --				Jumper = assemblyMgr.assemble #(JumperG, JumperB, JumperR) name:"Jumper" classDesc:Dummy
    --				Jumper.pos = gridPoint
    --				JumperR.pos = JumperG.pos = JumperB.pos = [0,0,0]
    				local Brad2 = JumperB.radius2 as string
    				local Rrad2 = JumperR.radius2 as string
    				local Grad = JumperG.radius as string
    				local Brad2d = (JumperB.radius2 * 2) as string
    				local Rrad2d = (JumperR.radius2 * 2) as string
    				local Gradd = (JumperG.radius * 2) as string
    				local Gradh = (JumperG.radius / 2) as string
    				JumperB.pos.z_position.controller = float_script()
    				JumperR.pos.z_position.controller = float_script()
    				JumperR.pos.z_position.controller.script = Gradh + " + " + Rrad2d + " - (" + Gradh + " * sin((180.0 * " + (tempo.z as string) + ") * currentTime.ticks / (4800.0 * 60.0)))"
    				JumperB.pos.z_position.controller.script = Gradh + " + " + Brad2d + " + (" + Gradh + " * sin((180.0 * " + (tempo.z as string) + ") * currentTime.ticks / (4800.0 * 60.0)))"
    				JumperR.radius1.controller = float_script()
    				JumperB.radius1.controller = float_script()
    				JumperR.radius1.controller.script = Grad + " + " + Rrad2d + " + (" + Rrad2 + " * cos((180.0 * " + (tempo.z as string) + ") * currentTime.ticks / (4800.0 * 60.0)))"
    				JumperB.radius1.controller.script = Grad + " + " + Brad2d + " - (" + Brad2 + " * cos((180.0 * " + (tempo.z as string) + ") * currentTime.ticks / (4800.0 * 60.0)))"
    				JumperG.pos.z_position.controller = float_script()
    				JumperG.pos.z_position.controller.script = Grad + " + abs(" + Gradd + " * sin((180.0 * " + (tempo.z as string) + ") * currentTime.ticks / (4800.0 * 60.0)))"
    				#stop
    			)
    		)
    		on mouseMove click do
    		case click of (
    			2: (
    				JumperG.radius = sqrt (gridDist.x * gridDist.x + gridDist.y * gridDist.y)
    				JumperB.radius2 = sqrt JumperG.radius
    				JumperR.radius2 = sqrt JumperG.radius
    				JumperB.radius1 = JumperG.radius + JumperB.radius2
    				JumperR.radius1 = JumperB.radius1 + JumperB.radius2 * 2 + JumperR.radius2
    			)
    		)
    	)
    )
     
  6. Paguo-86PK

    Paguo-86PK Пользователь сайта

    С нами с:
    26.11.2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    Кстати, разработал плагин маски кода Грея, но он как-то не так работает. В чём ошибка?
    Код:
    plugin simpleObject gray_plugin_def
        name:"GrayPlate"
        classID:#(145345,543211)
        category:"Scripted Primitives" (
            parameters main rollout:params (
                height type:#worldUnits ui:height default:1
                width type:#worldUnits ui:width default:64
                depth type:#worldUnits ui:depth default:0
                digits type:#integer ui:digits default:5
            )
            rollout params "Parameters" (
                spinner height "Height" type:#worldunits range:[1,2,1]
                spinner width "Width" type:#worldunits range:[1,128,64]
                spinner depth "Depth" type:#worldunits range:[0,1000,0]
                spinner digits "Digits" type:#integer range:[4,10,5]
            )
            on buildMesh do (
                local w = width, h = height
                local m = bit.shift 1 (digits - 2)        -- Maximum
                local g                                    -- Gray-counter
                local i = 0, n, c = 0                    -- Counters
                local x, y = m * 4 - 1, v = 1            -- Coordinates
                local s = splineShape pos:[0,0,0]        -- Create new spline
                addnewspline s
                while i < digits do (                    -- Create stair
                    addKnot s 1 #corner #line [2 + w * (i + 0), 2 + y * h, 0]
                    addKnot s 1 #corner #line [2 + w * (i + 1), 2 + y * h, 0]
                    y -= v; v *= 2; i += 1
                )
                addKnot s 1 #corner #line [2 + w * (i + 0), 4 + m * 4 * h, 0]
                addKnot s 1 #corner #line [2 + w * (i + 1), 4 + m * 4 * h, 0]
                addKnot s 1 #corner #line [2 + w * (i + 1), 6 + m * 4 * h, 0]
                addKnot s 1 #corner #line [0, 6 + m * 4 * h, 0]
                addKnot s 1 #corner #line [0, 0, 0]        -- Draw out sides
                addKnot s 1 #corner #line [2 + w * (i + 1), 0, 0]
                addKnot s 1 #corner #line [2 + w * (i + 1), 2, 0]
                addKnot s 1 #corner #line [2 + w * (i - 1), 2, 0]
                y += v /= 4; i -= 1
                while i > 0 do (                        -- Another stair
                    addKnot s 1 #corner #line [2 + w * i, 2 + y * h, 0]
                    i -= 1
                    addKnot s 1 #corner #line [2 + w * i, 2 + y * h, 0]
                    y -= v /= 2
                )
                for i = 1 to m - 1 do (                    -- Draw the tooths
                    g = bit.xor (bit.xor i (bit.shift i -1)) (bit.xor (i - 1) (bit.shift (i - 1) -1))
                    x = 2; y = 1; v = 1; n = 0
                    do (                                -- From side to center
                        addKnot s 1 #corner #line [x, 2 + h * i * 4 - y * h, 0]
                        x += w
                        addKnot s 1 #corner #line [x, 2 + h * i * 4 - y * h, 0]
                        y += v; v *= 2; n += 1
                        g = bit.shift g -1
                    ) while g > 0
                    while n > 0 do (                    -- From center to side
                        n -= 1; y -= v /= 2
                        addKnot s 1 #corner #line [x, 2 + h * i * 4 + y * h, 0]
                        x -= w
                        addKnot s 1 #corner #line [x, 2 + h * i * 4 + y * h, 0]
                    )
                )
                close s 1
                addModifier s (extrude amount:10)
                mesh = s.mesh
            )
            tool create (
                on mousePoint click do
                    case click of (
                    1: nodeTM.translation = gridPoint
                    3: #stop
                    )
                on mouseMove click do
                    case click of (
                    2: (width = gridDist.x; depth = gridDist.y)
                    3: (width = gridDist.x; depth = gridDist.y)
                    )
            )
    )
     
Модераторы: Savin Denis

Поделиться этой страницей