С 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. А если все эти объекты сгруппированны, как получить доступ к соседним объектам в пределах этой группы, не указывая имён?
1. Каким образом можно создать собственный объект, который не отображается в сцене, но имеет кучу опциональных параметров, свободно регулируемых на-ходу из Control Panel:Modify?
Вы хотите сделать это вручную или с помощью MaxScript?
Если вы хотите сделать это с помощью MaxScript, тогда как вы это делаете вручную?
2 ... Но как взять значения других параметров не через явное указание имени ($Torus_Knot01), а типо через this?
igorznagВы хотите сделать это вручную или с помощью MaxScript?
В справке по MaxScript есть пример. 'This' Local Variable in Scripted Controllers
Сначала получяем доступ к родителю ($Torus_Knot01.parent), а потом получаем доступ к детям родителя ($Torus_Knot01.parent.children)
1. Свой объект создаю через MaxScript, нашёл пример с чайником.
2. Пример помог. Однако, я ожидал, что цикл не нужен 🙂
3. Теперь ясно, Попробую...
У меня в сцене имеется некий "прыгунок":
Вот работаю над тем, чтобы эта группа объектов (шар и два тора) работали слаженно: Шар не падал ниже радиуса, а амплитуда растягивания и циркуляции торов зависила от радиуса шара.
А то просто устал вручную всё подгонять 🙂
Хорошо!
Правда дубли я не плодил специально. Просто три раза выходила страница ошибки сервера. Я думал сервер не отвечает.
Впрочем, с моей связью такое случается. Обычно на других форумах в таких случаях моё сообщение действительно не отправляется...
В общем, написал я в 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
)
)
)
)
Кстати, разработал плагин маски кода Грея, но он как-то не так работает. В чём ошибка?
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)
)
)
)
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Paguo-86PK
Гуглил, но что-то не так формулирую.
1. Каким образом можно создать собственный объект, который не отображается в сцене, но имеет кучу опциональных параметров, свободно регулируемых на-ходу из Control Panel:Modify?
2. Сейчас для этой цели тупо создал Torus Knot, так-как у него много параметров, чтобы все объекты сцены синхронно действовали, повесил на его Radius скрипт лишь для ради переменных nPhase, bPhase и fPhase (Track View - Curve Editor: Torus Knot01->Transform->Position->Z_Position - Assign Float Controller):Но как взять значения других параметров не через явное указание имени ($Torus_Knot01), а типо через this?
3. А если все эти объекты сгруппированны, как получить доступ к соседним объектам в пределах этой группы, не указывая имён?
Спасибо!
igorznag
Если вы хотите сделать это с помощью MaxScript, тогда как вы это делаете вручную?
В справке по MaxScript есть пример. 'This' Local Variable in Scripted Controllers
Сначала получяем доступ к родителю ($Torus_Knot01.parent), а потом получаем доступ к детям родителя ($Torus_Knot01.parent.children)
Paguo-86PK
2. Пример помог. Однако, я ожидал, что цикл не нужен 🙂
3. Теперь ясно, Попробую...
У меня в сцене имеется некий "прыгунок":
Вот работаю над тем, чтобы эта группа объектов (шар и два тора) работали слаженно: Шар не падал ниже радиуса, а амплитуда растягивания и циркуляции торов зависила от радиуса шара.
А то просто устал вручную всё подгонять 🙂
Спасибо!
Savin Denis
Paguo-86PK
Правда дубли я не плодил специально. Просто три раза выходила страница ошибки сервера. Я думал сервер не отвечает.
Впрочем, с моей связью такое случается. Обычно на других форумах в таких случаях моё сообщение действительно не отправляется...
В общем, написал я в 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