Render.ru

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

imha

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

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

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

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

Вложения

cos2k

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

imha

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

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

Dark™

Модератор форума
Команда форума
Рейтинг
431
#4
Проследи в Script Editor'e весь этап, от создания объекта до привязки его к сфере, сохрани все ключевые команды в шелф и юзай. Можно цикл создать, что еще упростит задачу. Так же можно заюзать Paint Scripts Tool и ввести в Setup geometryPaint. Будешь объектами рисовать
 

Артём Ягодин

Активный участник
Рейтинг
11
#5
Подождите, подождите, друзья. В чем, собственно, проблема?
На сколько мне известно, в Option Box окна Duplicate достаточно установить галочку "Duplicate input connections" при дублировании.
И все :)
 

cos2k

Активный участник
Рейтинг
11
#6
не нужно, чтобы этот объект А всё время "ездил" по пов-сти Б
он все время будет на поверхности, даже если модифицировать об'экт Б то фоликл (а с ним и приконстрейнений обект А), останутса в тех же UV координатах и все время направлен нормалью к етой точке. А чтоби ездил я уже писал - "фоликлы можно двигать(Parameter U/V) "(ето в настройках самого фоликла)
 

imha

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


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

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

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

Вложения

imha

Знаток
Рейтинг
20
#9
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(тоесть пивотом к поверхности и по нормали к поверхности).


такая лабуда...
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#10
Все гораздо проще
Код:
duplicate -rr;
normalConstraint -weight 1 -aimVector 0 1 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0 nurbsSphere1 `ls -selection`;
Жмем "Спасибо", если все то =)
 

imha

Знаток
Рейтинг
20
#11
о! направление правильное, только нужно

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`"

?
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#12
Код:
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 ты сможешь регулировать количество копий.
 

imha

Знаток
Рейтинг
20
#13
в том то и прикол, что каждый раз выделять поверхность перд цилиндром не удобно.
но штука универсальная - согласен....

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

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 например?
 

Denzil

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

Делаешь много объектов с именами р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` - имя обекта
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#17
Код:
$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'ом, имя сферы (или другой пов-сти) он сам определяет
 

imha

Знаток
Рейтинг
20
#19
снова приветище!

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

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

Вложения

Сверху