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

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

Тема в разделе "MAXScript", создана пользователем Сережка, 21 июн 2012.

Модераторы: Savin Denis
  1. Сережка

    Сережка Пользователь сайта

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

    Вложения:

    • 2753142.jpg
      2753142.jpg
      Размер файла:
      37,8 КБ
      Просмотров:
      52
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Я тоже новичок в 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
     
  3. Сережка

    Сережка Пользователь сайта

    С нами с:
    10.06.2012
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    2
    igorznag спасибо, хотя я здесь и 10 части не понимаю) только от силы час за изучением MAXScript провел. Не подскажешь хорошие книги по его изучению, ну кроме конечно Основы 3DS Max8 MAXScript///
     
Модераторы: Savin Denis

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