Render.ru

Ограничение при объединении объектов

Сережка

Пользователь сайта
Рейтинг
2
#1
Всем привет! Подскажите, в одном вопросе, хотя я и новичок в MAXScript, но вопрос мне кажется не из легких. Интересует возможность создание такой кнопки, которая позволяла бы перемещать объекты как в жизни. Т.е. в базовом варианте, например имеется два параллелепипеда, при перемещении они могут перемещаться налаживаясь один на одного (состояние 3), а хотелось бы чтобы они как и в жизни могли только ложиться один на одного (т.е. состояния 1-2). При этом как бы ни пытаться их перемещать они не при нажатии этой кнопки никогда не переходили бы в состояние 3. а просто перескакивали бы сразу на другое ребро (см скрин.).
Конечно есть привязки, выравнивания, которые позволяют привязываться к граням, но это не то…
Можно ли такое создать и если можно, какие у кого есть идеи?.
 

Вложения

igorznag

Мастер
Рейтинг
103
#2
Я тоже новичок в MAXScript. Написал простой пример:
1. В новой сцене запускаем скрипт. Выделяем один чайник.
2. В новом окне перетаскиваем счетчик X (Y, Z).
Код:
try(destroyDialog igorznag_ro_cd) catch() 
rollout igorznag_ro_cd "Move" 
( 
global obj_col_origin, obj_col, obj_col_pos; 
spinner spOffsetX "X: " fieldWidth:0 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[5,5] 
spinner spOffsetY "Y: " fieldWidth:0 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[5,30] 
spinner spOffsetZ "Z: " fieldWidth:0 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[5,55] 
spinner spAbsoluteX "" fieldWidth:60 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[30,5] 
spinner spAbsoluteY "" fieldWidth:60 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[30,30]
spinner spAbsoluteZ "" fieldWidth:60 range:[-1e+9, 1e+9, 0] type:#worldunits pos:[30,55]
fn offset_buttondown=
(
if(superclassof $==GeometryClass)then
(
obj_col_origin=$; obj_col=copy obj_col_origin; 
obj_col_pos=obj_col.pos; obj_col.wireColor=obj_col_origin.wireColor
if IsValidNode obj_col then
(
setCommandPanelTaskMode mode:#create;
select obj_col; obj_col.visibility=bezier_float();
obj_col.visibility.controller.value = 0.5;
for obj in objects where (obj!=obj_col_origin and obj!=obj_col) do
if(superclassof obj==GeometryClass)then
(
vs=volumeselect();vs.level=2;vs.type=1;vs.method=1;vs.volume=3;
addmodifier obj_col vs; setCommandPanelTaskMode mode:#modify;
obj_col.modifiers[1].Node=obj; setCommandPanelTaskMode mode:#create;
)--if(superclassof obj==GeometryClass)then
)--if IsValidNode obj_col then
)--if(superclassof $==GeometryClass)then
)--fn offset_buttondown=

fn offset_changed var_obj_col_pos=
(
if(IsValidNode obj_col and IsValidNode obj_col_origin)then
(
obj_col.pos=var_obj_col_pos
theMesh = snapshotasmesh obj_col
fs_ba=getFaceSelection theMesh; delete theMesh;
if fs_ba.numberSet==0 then 
(
obj_col_origin.pos=obj_col.pos;
spAbsoluteX.value=obj_col_origin.pos.x
spAbsoluteY.value=obj_col_origin.pos.y
spAbsoluteZ.value=obj_col_origin.pos.z
)--if fs_ba.numberSet==0 then 
)--if(IsValidNode obj_col and IsValidNode obj_col_origin)then
)--fn offset_changed var_obj_col_pos=

fn offset_buttonup=
(
if(IsValidNode obj_col)then delete obj_col; 
if(IsValidNode obj_col_origin)then select obj_col_origin; 
)

on igorznag_ro_cd open do
(
Teapot radius:15; Teapot radius:15 pos:[70,0,0]
Box length:150 width:30 height:40 pos:[200,0,0]
Box length:150 width:10 height:5 pos:[-40,0,0]
Box length:150 width:10 height:5 pos:[-70,0,0]
)

on spOffsetX buttondown do offset_buttondown();
on spOffsetY buttondown do offset_buttondown();
on spOffsetZ buttondown do offset_buttondown();
on spOffsetX buttonup do (offset_buttonup();spOffsetX.value=0;);
on spOffsetY buttonup do (offset_buttonup();spOffsetY.value=0;);
on spOffsetZ buttonup do (offset_buttonup();spOffsetZ.value=0;);

on spOffsetX changed arg inSpin_arg do
(
temp=copy obj_col_pos; temp.x=temp.x+spOffsetX.value; 
offset_changed temp;if(inSpin_arg==false)then spOffsetX.value=0;
)--on spOffsetX changed arg inSpin_arg do

on spOffsetY changed arg inSpin_arg do
(
temp=copy obj_col_pos; temp.y=temp.y+spOffsetY.value; 
offset_changed temp; if(inSpin_arg==false)then spOffsetY.value=0;
)--on spOffsetX changed arg inSpin_arg do

on spOffsetZ changed arg inSpin_arg do
(
temp=copy obj_col_pos; temp.z=temp.z+spOffsetZ.value; 
offset_changed temp; if(inSpin_arg==false)then spOffsetZ.value=0;
)--on spOffsetX changed arg inSpin_arg do

)--end rollout igorznag_ro_ms 
createDialog igorznag_ro_cd 91 80
 

Сережка

Пользователь сайта
Рейтинг
2
#3
igorznag спасибо, хотя я здесь и 10 части не понимаю) только от силы час за изучением MAXScript провел. Не подскажешь хорошие книги по его изучению, ну кроме конечно Основы 3DS Max8 MAXScript///
 
Сверху