Вопросы по Max Script (всего понемногу)
- Автор темы Александр Чернега
- Дата создания
Всем привет! не работает 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
Всем привет! не работает 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
Пользовался на днях сервисами работы с планировками и дизайном квартир. (не поймите как рекламу: Сервисы перечислил для того, может что упустил)
Ни один из сервисов не понравился, т.к. нет там режима сборки помещений из типовых панелей (где все окна/двери уже расчитаны и под розетки дырки). До этого создал максимально приближённую модель своей квартиры в Sim 3 (ссылку на youtube не даю здесь) (обои, пол, стены - максимально по дизайну близки к реалиям) (сами 2 сима жить не могут там: тесно! но мы же живём семером!).
Решил я воспользоваться 3D-Max очередной раз (до этого я тупо рисовал сплайн нашей квартиры и выдавливал стены по нему) уже серъёзно: из типовым Ж/Б-плит. (встроенная стена не подходит - типовушности СССР квартир не даёт).
Всё бы хорошо, но никак не выгугливается решение задачи: Как совместить, скажем, два бокса, один - с лицевыми сторонами, второй - вывернутый наизнанку.
В скрипте пока написал два режима: Из готовых стандартных боксов и из собственной мэши.
1. Собственная мэш очень сильно грешит треугольниками при некоторых ракурсах (бликует или затеняется) и портит текстуру стены;
2. Боксы очень неверно сливаются и не дают нужного результата.
Что должно получиться: Двусторонняя стена для дальнейщей возможности применить к ней 2-side material (одни обои на стороне в одну комнату, другие обои - для другой комнаты).
Та же беда: Проявление треугольников на поверхности розетки в местах отверстий.
(если нажимать кнопки и указывать на лампы - розетка станет выключателем (до трёх позиций), реагирующим на параметр On лампы)
Вопросы:
1. Как побороть проблему с треугольностью текстур на стене?
2. Как совместить два бокса: Нормальный и вывернутый?
P.S.: Как видите из интерфейса, ограничений уйма: Длина стены - до 8м, высота - до 5м, толшина - до 50см (прикинул из стандартов ЖБИ).
Спасибо.
Ни один из сервисов не понравился, т.к. нет там режима сборки помещений из типовых панелей (где все окна/двери уже расчитаны и под розетки дырки). До этого создал максимально приближённую модель своей квартиры в 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см (прикинул из стандартов ЖБИ).
Спасибо.
Вложения
-
2,5 МБ Просмотров: 469
Последнее редактирование:
Помогите, не работает макс скрипт, запускаю через ран скрипт и ничего не происходит, ноль внимания, ни один скрипт не работает. мак 2013-й, переустонавливал не помогает, устонавливал 2014-й та же история, что происходит ?
Или открой нужный скрипт MAXScript > Open Script... Выдели текст скрипта и перенеси его на тулбар, появится кнопка, при нажатии всё должно работать.
Что за скрипт хоть?
Народ, нужна помощь.
В Custom User Interface назначил горячую клавишу на команду Bridge в группе Editable Poly, но она почему-то не срабатывает.
Занёс эту команду отдельно в скрипт и всё заработало, но находится он теперь в группе MainUI. Как сделать так, чтобы этот скрипт лежал в группе Editable Poly?
Сам скрипт:
macroScript Bridge
category: "Editable Polygon Object"
tooltip: "Bridge"
(
$.EditablePoly.Bridge ()
)
В Custom User Interface назначил горячую клавишу на команду Bridge в группе Editable Poly, но она почему-то не срабатывает.
Занёс эту команду отдельно в скрипт и всё заработало, но находится он теперь в группе MainUI. Как сделать так, чтобы этот скрипт лежал в группе Editable Poly?
Сам скрипт:
macroScript Bridge
category: "Editable Polygon Object"
tooltip: "Bridge"
(
$.EditablePoly.Bridge ()
)
- Рейтинг
- 229
Народ, нужна помощь.
В Custom User Interface назначил горячую клавишу на команду Bridge в группе Editable Poly, но она почему-то не срабатывает.
В Custom User Interface назначил горячую клавишу на команду Bridge в группе Editable Poly, но она почему-то не срабатывает.
Не срабатывает скорее всего из за того что не нажата кнопка Keyboard Shortcut Override Toggle
Последнее редактирование:
И как раз для кнопки Keyboard Shortcut Override Toggle мне необходимо перенести скрипт из общей группы в Editable Poly.
Добрый вечер, форумчане
подскажите как макс скриптом изменять координаты костного рига для анимации?
Имеется изменение координат узловых точек мокапа человека, соответствующих
точкам сгиба конечностей рига.
Каким образом можно передавать этот массив данных в макс ?
изменение данных 30 раз в секунду
Какой тип передачи данных в 3ds max может использоваться в этом случае?
подскажите как макс скриптом изменять координаты костного рига для анимации?
Имеется изменение координат узловых точек мокапа человека, соответствующих
точкам сгиба конечностей рига.
Каким образом можно передавать этот массив данных в макс ?
изменение данных 30 раз в секунду
Какой тип передачи данных в 3ds max может использоваться в этом случае?
Имеется изменение координат узловых точек мокапа человека, соответствующих
точкам сгиба конечностей рига.
точкам сгиба конечностей рига.
Каким образом вы получили этот массив данных?
Изменения координат являются абсолютными или относительными?
Сколько узловых точек изменяют свои координаты?
Каким образом можно передавать этот массив данных в макс ?
Пример: Read Geometry Data From Text File - Part One
изменение данных 30 раз в секунду
это должно быть в реальном времени
это должно быть в реальном времени
Сколько секунд длится анимация?