Render.ru

Клонировать один объект по вершинам другого

Hasan Akniyev

Активный участник
Рейтинг
11
#1
Есть задача - размножить один объект так, чтобы все его копии находились в вершинах другого.

Я не знаю, есть ли в майке стандартная функция на этот счет, поэтому решил сделать так: проходимся циклом "for" по всем вершинам объекта и при каждой итерации клонируем объект и назначаем ему координаты текущей вершины.

А теперь вопросы:
1. Как получить кол-во вершин?
2. Как получить доступ к координатам текущей вершины?

P.S. Даже если есть стандартная процедура для такого дела, прошу тем не менее ответить на мои вопросы, так как хочу углубить свои знания в MEL.
 

Hasan Akniyev

Активный участник
Рейтинг
11
#2
И еще один вопрос. Как получить кол-во и координаты каждой частицы в системе частиц?
Это на случай, если нужно сделать что-то вроде инстансера, но без привязки к частицам.

Поясню:
Делаю гору, далее Emit from Object, Emitter type=Surface. И в первом-втором кадре запускаю скрипт, распологающий деревья или камни по поверхности горы.

Если есть другой способ, так же укажите.
 

Hasan Akniyev

Активный участник
Рейтинг
11
#4
2Решатель
Ну открыл я хелп. Там какой-то список отсортированный по алфавиту. На какой элемент щелкать.

А если не трудно опиши одной-двумя строчкой синтаксис чем посылать на четыре буквы :)

int $i;
for ($i=0, $i<=<количество вершин>, i++)
{
Вершина[$i].X
Вершина[$i].Y
Вершина[$i].Z
}
Как узнать кол-во вершин и их координаты?

Благодарю за внимание.
 
Рейтинг
34
#5
Во-первых: эта тема тут уже обсуждалась не далее как месяц назад. Так как вы не хотите пользоваться поиском, я внёс её в FAQ.
Во-вторых: "отсортированный список" - это ноды Maya, о которых там всё написано - какие атрибуты в них есть, и как их использовать.
В-третьих: есть такой же "отсортированный список" для MEL-команд, где очень быстро и продуктивно можно искать нужные команды. Например ввести "poly" в строчке поиска этого списка.
В-четвёртых: всё что ты делаешь в Maya, отражается в script editor'е, поэтому выдели точки и посмотри - как к ним обращаться.
И в пятых: так как ты упорно не хочешь утруждать себя чтением документации, то я даже скажу тебе команду. Даже три команды: polyEvaluate, getAttr и xform. Нет, даже четыре: pointPosition. А дальше - смотри документацию.
 

Ghostfly

Активный участник
Рейтинг
19
#6
Хочу научиться читать. Но все буквы учить лень и решил выучить первые 5. На первое время прокатит.
 

Alexz 8447

Активный участник
Рейтинг
5
#7
Вот как просто в синеме такое делать, просто для сравнения, майщики ногами не бейте (могу ответить :)
 

Вложения

  • 109 КБ Просмотров: 334

DiMay

Активный участник
Рейтинг
5
#13
Soft Body, Instancer...
Единственное, чтобы "инстансируемый" объект располагался вдоль нормалей - необходимо, скорее всего, ввести новый атрибут (РР), котрый будет отвечать за ориентацию частиц вдоль нормалей..
 

Вложения

  • 185,1 КБ Просмотров: 356

Lakoske

Активный участник
Рейтинг
11
#16
int $stp=1;
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 -jointOrient;
$nm=`ls -sl`;
$pr="";
$tr=`getAttr $nm.translate`;
int $vmax[]=`polyEvaluate -v`;
for ($i=0; $i<=$vmax[0]-1;$i+=$stp){
$n0=`duplicate sp -name ("sp"+$i)`;
$nm_s="sp"+($i);
rename $n0 $nm_s;
float $tr_v[]=`getAttr ($nm[0]+".vt["+$i+"]")`;
float $tr_p[]=`getAttr ($nm[0]+".pt["+$i+"]")`;
$tr_v[0]+=$tr_p[0]; $tr_v[1]+=$tr_p[1]; $tr_v[2]+=$tr_p[2];
setAttr ($nm_s+".translate") -type "double3" ($tr[0]+$tr_v[0]) ($tr[1]+$tr_v[1]) ($tr[2]+$tr_v[2]);
$pr+=($nm_s+" ");
}
eval ("select "+$pr);
group -name "nodes1";

//только убогий скрипт довольно получился. дублируемый объект должен называться sp, объект, по вертексам которого размещаются дубликаты должен быть выделен
 
Рейтинг
34
#18
А сделать так, чтобы размножаемый обьект был просто последним в селекшне?

И потом - getAttr не всегда корректно работает. Проще брать координаты и двигать в worldSpace.
Вместо eval("select.. можно просто select $pr;
 
Сверху