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

Проблема наследования

Тема в разделе "Maya", создана пользователем imha, 4 сен 2008.

Модераторы: Dark™, Skif
  1. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    привет всем!
    суть такая:
    я привязываю один объект (А) к поверхности(Б) таким образом, чтобы он(А) своей осью был расположен перпендикулярно к поверхности(Б) при помощи constrain -> normal в меню Animation, + к этому я привязываю А К б так, чтобы пивот А пренадлежал Б (при помощи constrain -> geometry в меню Animation). таким образом у меня объект А как бы ездит по поверхности Б, если я его пытаюсь перемещать в пространстве...

    теперь проблема: мне нужно этот объект раскопировать в огромном количестве.... делать такие объекты а потом привязывать - как-то не радует, поэтому я пользую Dublicate special с опцией
    dublicate input graf. но при таком способе дублируется не объект А , а вся группа тоесть родиель Б и потомок А. и в результате я имею столько же поверхностей Б, сколько раз дублировал А. В определенных случаях это приводит к снижению производительности(если поверхность сложная..) да и зачем мне столько одинаковых поверхностей?

    можно ли копировать объект так, чтобы он оставался привязанным к первой поверхности вышеупомянутым способом, но не копируя при этом всю группу?
    либо может есть какой-то способ решить эту проблему с другой стороны?

    спасибо заранее
     

    Вложения:

    • 861265.jpg
      861265.jpg
      Размер файла:
      82,1 КБ
      Просмотров:
      51
  2. cos2k

    cos2k Активный участник

    С нами с:
    30.04.2007
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    11
    1. Создаем hair(в опциях Output - Nurbs curves, U/V count - допустим 2 и 2)
    2. В outliner удаляем групу hairSystem1OutputCurves
    3. Выбираем с групы hairSystem1Follicles один из фолыклов потом выделяем обект А и Parent constraint(незабываем снять maintain offset) и т.д. Кстати фоликлы можно двигать(Parameter U/V)
     
  3. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    2cos2K Проделал всё вышесказанное, но
    1. В 3-ем пункте объект не получается выставить нужной перпендикулярно к фоликлу, например нужно У - а получается только Х но это можно решить сменой ориентации осей самого объекта..
    2. Я так понял что привязать объект то можно, но его перемещение приведет к "отрыву" от поверхности А мне нужно, чтобы этот объект А всё время "ездил" по пов-сти Б сорри не уточнил этого. А также все его дубликаты тоже нужны привязанными к поверхности таким же образном

    за ответ спасибо, даже есл иэто не поможет в данном случае, - оч интересный способ для точного позиционирования... в дальнейшем пригодиццо!
     
  4. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Проследи в Script Editor'e весь этап, от создания объекта до привязки его к сфере, сохрани все ключевые команды в шелф и юзай. Можно цикл создать, что еще упростит задачу. Так же можно заюзать Paint Scripts Tool и ввести в Setup geometryPaint. Будешь объектами рисовать
     
  5. Артём Ягодин

    Артём Ягодин Активный участник

    С нами с:
    17.10.2006
    Сообщения:
    191
    Симпатии:
    0
    Баллы:
    11
    Подождите, подождите, друзья. В чем, собственно, проблема?
    На сколько мне известно, в Option Box окна Duplicate достаточно установить галочку "Duplicate input connections" при дублировании.
    И все :)
     
  6. cos2k

    cos2k Активный участник

    С нами с:
    30.04.2007
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    11
    он все время будет на поверхности, даже если модифицировать об'экт Б то фоликл (а с ним и приконстрейнений обект А), останутса в тех же UV координатах и все время направлен нормалью к етой точке. А чтоби ездил я уже писал - "фоликлы можно двигать(Parameter U/V) "(ето в настройках самого фоликла)
     
  7. cos2k

    cos2k Активный участник

    С нами с:
    30.04.2007
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    11
    Сцена http://rapidshare.com/files/142628193/scene.mb.html
     
  8. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    2 cos2k да я это всё проделал. Поглядел сценку - у меня это всё тоже получилось...
    Но мне удобнее перемещать объекты ручками.... Лучше показать картинку, чтоб вы поняли почему мне неудобно юзать (Parameter U/V). а также по этой причине мне было бы удобнее каждый новый объект присоединять к телу через констрэйн. дублирование с наследованием конечно более быстрый способ, но поверхность Б жрёть память)


    2 артём. пробовал "Duplicate input connections" . Но это не то - это аля инстанс но не по форме тела а ориентировки его в пространстве... короче тело остается привязанным к поверхности, но оно зависи от ориентировки в пространстве того тела, с которого был сделан дубль.

    2 RGBam Мне к великому моему стыду пока-что не подвластен механизм скриптов. но теоретически я догадываюсь что это правильное решение;) был бы очень благодарен за наводку на хороший Faq

    всем спасибо за внимание!
     

    Вложения:

    • 867255.jpg
      867255.jpg
      Размер файла:
      93,6 КБ
      Просмотров:
      44
  9. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    2 RGBam Помогите разобраться плз.... влез в скрипт эдитор:

    что происходит при трассировке(или как это назвать я хз)...

    1. я создаю циллиндр и сферу, потом для привязки циллиндра к сфере сначала выбираю к чему привязывать - сферу, потом что привязываь - циллиндр

    select -r nurbsSphere1 ;
    select -tgl nurbsCylinder1 ;

    2. констрэйню цилиндр к поверхности пивотом; ориентирую по нормали....

    geometryConstraint -weight 1;
    // Result: nurbsCylinder1_geometryConstraint1 //
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 0 0 -worldUpType "vector" -worldUpVector 0 1 0;
    // Result: nurbsCylinder1_normalConstraint1 //

    3. этап дублирования с наследованием (который меня больше всего и интересует....)

    select -r nurbsCylinder1 ; //выбираю что копировать//

    duplicate -rr -un; //вызываю dublicate special с текущими настройками: dublicate input graf//
    // Result: nurbsCylinder2 // // говорит мол появился nurbsCylinder2, НО, о чудо! nurbsCylinder2 привязан к nurbsSphere2, появление которой даже не афишируется%)) //


    И так каждый новый цилиндр будет привязан к новому "родителю", а мне нужно чтобы после дублирования nurbsCylinder1, nurbsCylinder2 был привязан к nurbsSphere1, nurbsCylinder3 привязан к nurbsSphere1 и т.д. по тому же принципу что и nurbsCylinder1 привязан к nurbsSphere1(тоесть пивотом к поверхности и по нормали к поверхности).


    такая лабуда...
     
  10. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Все гораздо проще
    Код:
    duplicate -rr;
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 nurbsSphere1 `ls -selection`;
    
    Жмем "Спасибо", если все то =)
     
  11. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    о! направление правильное, только нужно

    duplicate -rr;
    geometryConstraint -weight 1 nurbsSphere1 `ls -selection`; //вот эту строчку добавил!///
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 nurbsSphere1 `ls -selection`;


    я не совсем понимаю как работают тут скрипты, но догадываюсь, что:
    "nurbsSphere1 `ls -selection`" это что-то типа функции возвращающей переменную, в данном случае функции констрэйна должны получать идентификатор выделения чтоли....

    респект и уважуха!)))

    но тут возникает второй вопрос, а как унифицировать этот скриптег?
    например у меня есть поверхности с именем P1 и P2 и цилиндры С1 и C2,

    C1 приконстрейнен к P1
    C2 приконстрейнен к P2

    мне нужно при помощи одного и того же скрипта зафигачить копи C1 по поверхности P1 и C2 по P2 соответственно.

    тоесть мне нужно в уже имеющемся скриптике поменять "nurbsSphere1 `ls -selection`" на "P1 `ls -selection`"

    а как вернуть вместо P1 имя именно той поверхности, к которой привязан дублируемый цилиндр?
    тоесть чтобу не писать для поверхности P2 и циллиндра C2 отдельный скрипт с "P2 `ls -selection`"

    ?
     
  12. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Код:
    string  $all[];
    $all = `ls -selection`;
    for($i=0;$i<2;$i++) {
    $name = `duplicate -rr $all[1]`;
    geometryConstraint -weight 1 $all[0] $name;
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 $all[0] $name;
    };
    Выделяем сферу потом цилиндр. Цилиндр должен быть без constraint'ов в иерархии, иначе они тоже копируются и не удаляются почему то командой delete -cn. Циклом for ты сможешь регулировать количество копий.
     
  13. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    в том то и прикол, что каждый раз выделять поверхность перд цилиндром не удобно.
    но штука универсальная - согласен....

    Пока что обхитряю ситуацию таким образом:
    пользую скрипт

    duplicate -rr;
    geometryConstraint -weight 1 p1 `ls -selection`;
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 p1 `ls -selection`;

    а поверхность перед началом манипуляций и копирований обзываю p1 а потом на любое другое имя меняю....

    и так с каждой новой поверхностью... ибо в моём случае таких "поверхностей" может быть 3 - 5... ну 10 в конце концов а "циллиндров" на каждой "поверхности" может быть и 500. так что 5 раз переименовать поверхность не так трудно....

    походу можно сделать скрипт на переименование поверхности. что-то вроде присвоиить объекту имя P1. а после манипуляций с поверхностью, присвоить любое свободное имя... но это и ручками не долго...

    з.ы. а как прибиндить скрипт на F5 например?
     
  14. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Hotkey Editor
     
  15. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    +1)))
     
  16. Denzil

    Denzil Мастер

    С нами с:
    29.08.2000
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    360

    Делаешь много объектов с именами р0...р10
    Код:
    int $Num = 0;
    string $Name;
    if ($Num < 11)
    {
    $Name = "p"+$Num;
    geometryConstraint -weight 1 $Name `ls -selection`; 
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 $Name `ls -selection`; 
    $Num = $Num +1;
    }
    
    Только вместо `ls -selection` - имя обекта
     
  17. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Код:
    $sel = `ls -selection`;
    string $constr[];
    
    if (`connectionInfo -isSource ($sel[0] + ".translate")`) {
    
        string $destinations[];
        $destinations = `connectionInfo -dfs ($sel[0] + ".translate")`;
    
        for ($destination in $destinations) {
    	$constr = `ls -o $destination`;
        }
    
    }
    
    
    if (`connectionInfo -isDestination ($constr[0] + ".target[0].targetGeometry")`) {
    
        $destination = `connectionInfo -sourceFromDestination ($constr[0] + ".target[0].targetGeometry")`;
        
    	$sel = `ls -o $destination`;
    
    }
    
    $name = `duplicate -rr`;
    delete ($name[0] + "|" + $constr[0]);
    geometryConstraint -weight 1 $sel[0] `ls -selection`; 
    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 $sel[0] `ls -selection`;
    Вот тут стоит выделить только цилиндр с constraint'ом, имя сферы (или другой пов-сти) он сам определяет
     
  18. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    Всем свпасибо!

    RGBam отдельное спасибо!
    вот это я и искал!
    +3;)
     
  19. imha

    imha Знаток

    С нами с:
    04.07.2007
    Сообщения:
    166
    Симпатии:
    0
    Баллы:
    21
    снова приветище!

    RGBam - твой скрипт просто замечательный, однако есть один маленький неприятный моментик:

    если поверхность, по которой я выставляю тела(циллиндры), состоит из достаточно весомого числа полигонов, то сцена ощутимо увеличивается в размере при каждом таком дублировании(хотя не так сильно, как при дублировании с input graph).

    происходит это кажется вот по какой причине:

    при операциях

    normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 nurbsSphere1 `ls -selection`;

    тоесть констрэйнах, в Channel box в атрибутах SHAPES записываются эти две констрэйновые связи они занимают память, каким-то образом пропорциональную памяти, занимаемой поверхностью, по которой идет копирование.... но это еще не беда

    Таким образом, при выполнении твоего скрипта, сначала копируется цилиндр со своими SHAPES-сами
    а потом к нему добавляется еще два новых SHAPES-а... итого уже 4 констрэйновых связи. при следующем копировании - их будет 6 и т.д. это катастрофически жреть память в некоторых случаях.

    так вот вопрос: можно ли как-то модифицировать скрипт, чтобы ненужные связи SHAPES удолялись до (после копирования)?

    и подскажи плиз где можно нарыть информацию на русском, чтобы разобратся с MEL

    за ранее спасибо
     

    Вложения:

    • 917914.jpg
      917914.jpg
      Размер файла:
      171,2 КБ
      Просмотров:
      49
Модераторы: Dark™, Skif

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