Render.ru

MEL - ВОПРОС

Рейтинг
126
#1
Вообщем так. Импортировал я из позера человека, заскинил его ,все норм. Дошла очередь до BlandShapes. Так как модель высокопол., а художник из меня никакой, то я нашёл в инете различные морфы, точнее выражения лиц под данного человека, кот. нужны мне. - т.е. готовые BS.

Проблема в том, что на ранее скопированом я отделил глаза, язык и нижнюю челюсть, т.е. первоначальная модель поменяла кол. поликов и BS теперь не работает. Set ы выделеных и удалённых face-ов нет, + при удалении какого либо face-а полностью меняеться нумерация face-ов, т.е невозможно определить номера удалённых и выбрать их на другой ,аналог. модели (это так ,мысли в слух)

Как я хотел решить задачу? Если у кого есть получше решение, с ув. выслушаю. Поместить вторую модель в тоже место, что и первую. Определить на определённом участке (голова) координаты фэйсов, кот есть у одной модели но нет у другой, выделить их и после наж DEL.
Всё.

Если кто ответит хотя бы команду нахождения координаты у фэйсов объекта, буду очнь рад. Пока нашёл тока нах. координаты центра объекта. UV развёртка никакущая, т.к. импорт. из позера, вообщем хто что знает, прошу не таить, фух
 
Рейтинг
26
#2
Т.е. ты надеешься, что если кол-во вертексов, фейсов и еджей будет совпадать, то бленд шейп пройдет нормально? Это врядли. Такое в принципе возможно, если у всех голов изначально совпадали номера вертексов, фэйсов и еджей, плюс совпадало их кол-во, а потом бы ты в одном и том же порядке удалил фейсы на всех блендшейпах, включая исходный. Но как я понимаю - это уже невозможно. Поэтому твой способ скорее всего не подходит.
Вообще сомневаюсь, что теперь исправить что то возможно, ну если только с исходной головы в Збраше или Мудбоксе сделать бленды, там это быстро делается. Хотя я конечно не профи.
 
Рейтинг
126
#3
спасибо, решение я уже знаю, оно необычное. Подсказали мне его на cgtalk.ru

Да, я надеюсь. Если удалить лишние фэйсы, то да. Модель то одинаковая абсолютно, тока разные выражения лиц. Кст., решение без исп. MEL.

Если кто знает команду для нахождения координат фэйсов (она вообще есть??), скажите, просто интересно.
 

alex_alv

Активный участник
Рейтинг
11
#4
Если требуется получение координат именно на MEL, то для получения числа фэйсов нужна команда типа

int $fnum[]=`polyEvaluate -f polySurface1`;
$fnum[0] будет содержать количество фэйсов.

Для получения номеров вершин, из которых состоит нужный фэйс (например, фэйс с номером 1261), нужна команда
string $vns[]=`polyInfo -fv polySurface1.f[1261]`;
Увы, она занесет список номеров вершин в $vns[0] в виде единой строки и потребуется разбор строки, чтобы определить количество вершин и выделить каждую из них в отдельный элемент массива.

Чтобы по номеру вершины получить ее ЛОКАЛЬНЫЕ координаты, нужно опросить атрибут vrts. Например, для получения координат вершины 857, нужна команда
float $coord[]=`getAttr polySurface1.vrts[857]`;

Она занесет X-координату в $coord[0], y-координату - в $coord[1], z-координату - в $coord[2]

Но проще и быстрее обрабатывать поверхность не на MEL, а на сишнике, анализируя файл ma. Для этого API совсем не требуется. Формат хранения полигона в ma достаточно простой (если геометрия не содержит историю) и его можно понять вообще без документации, методом пристального взгляда. Единственная заморочка - с нумерацией ребер (edges). Они могут быть отрицательными в ma-файле. Но это просто означает ребро с положительным номером, на 1 менишим, чем модуль отрицательного числа. Только это ребро берется в обратном направлении, чем оно указано изначально.

А на счет нумерации вершин, Михаил абсолютно прав. Но и эту проблему наверное можно решить. Опять таки, проще всего это сделать через обработку ma-файла.
 

alex_alv

Активный участник
Рейтинг
11
#5
Самому понадобилось пробежаться по вершинам фэйса :)
Вот написал разбор результата polyInfo:


int $i,$j;
string $facestring[];
int $faceVerts[];

....

string $facestring=`polyInfo -fv ("outputCloth1.f["+$i+"]")`;
clear $faceVerts;
$j=0;
$facestring[1]=":";
do{
$facestring[1]=$facestring[1]+" +[0-9]+";
$facestring[2]=`match $facestring[1] $facestring[0]`;
if($facestring[2]!="")
{
$faceVerts[$j]=`match " [0-9]+$" $facestring[2]`;
$j++;
}
}while($facestring[2]!="");

//Здесь $j - количество вершин в фэйсе $i, а массив $faceVerts содержит их (вершин) номера
....
 

Frame_First

Мастер
Рейтинг
126
#6
слушай, спасибо за внимание. Твои скрипты скопировал, потом с удовольст. почитаю, разберусь. Сейчас делаю работу быстро, не наслаждаясь (наверное тогда б не один день ,а 2дня-неделя уходило б ). Кстати, насчёт решения.

Короче.

"
Что то вы замутили, батенька... проблема несоответствия топологии после удаления решается очень просто... берете базовую голову в которой все есть и базовую же в которой вы что-то там удалили. Вешаете на вторую wrap а первую делаете influence surface. Далее на полную модель вешаете blendShape , а таргетами для нее послужат те сетки которые вы накачали. Теперь по очереди включаете каждый таргет и с вашей обрезанной головы деформированной wrap-ом снимаете готовые таргеты методом ctrl+d. Удачи!

"
гениально, неправдали?
 
Сверху