Render.ru

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

Paguo-86PK

Пользователь сайта
Рейтинг
2
#1
С 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. А если все эти объекты сгруппированны, как получить доступ к соседним объектам в пределах этой группы, не указывая имён?

Спасибо!
 

igorznag

Мастер
Рейтинг
103
#2
1. Каким образом можно создать собственный объект, который не отображается в сцене, но имеет кучу опциональных параметров, свободно регулируемых на-ходу из Control Panel:Modify?
Вы хотите сделать это вручную или с помощью MaxScript?
Если вы хотите сделать это с помощью MaxScript, тогда как вы это делаете вручную?
2 ... Но как взять значения других параметров не через явное указание имени ($Torus_Knot01), а типо через this?
В справке по MaxScript есть пример. 'This' Local Variable in Scripted Controllers
3. А если все эти объекты сгруппированны, как получить доступ к соседним объектам в пределах этой группы, не указывая имён?
Сначала получяем доступ к родителю ($Torus_Knot01.parent), а потом получаем доступ к детям родителя ($Torus_Knot01.parent.children)
 

Paguo-86PK

Пользователь сайта
Рейтинг
2
#3
Вы хотите сделать это вручную или с помощью MaxScript?
В справке по MaxScript есть пример. 'This' Local Variable in Scripted Controllers
Сначала получяем доступ к родителю ($Torus_Knot01.parent), а потом получаем доступ к детям родителя ($Torus_Knot01.parent.children)
1. Свой объект создаю через MaxScript, нашёл пример с чайником.
2. Пример помог. Однако, я ожидал, что цикл не нужен :)
3. Теперь ясно, Попробую...

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

Спасибо!
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Paguo-86PK, Будь пожайлуста внимательнее при создании топиков, не плоди дубли.
 

Paguo-86PK

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

В общем, написал я в 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
			)
		)
	)
)
 

Paguo-86PK

Пользователь сайта
Рейтинг
2
#6
Кстати, разработал плагин маски кода Грея, но он как-то не так работает. В чём ошибка?
Код:
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)
                )
        )
)
 
Сверху