Render.ru

скрипт по хитрому выделению фейсов нужен

#1
Доброго времени суток!
Очень нужна такая функция, может кто ни будь встречал что-то похожее, может MEL-ом каким, или плагином: есть полигональный меш. нужно автоматически вбрать фейсы, но только те - нормали которых перпендикулярны камере (ну или какому другому объекту) для мапинга..

Знающие, подскажите плиз!!
 
#2
Ишь ты!
какая задачка интересная... а на хайэнде не шукал что-нить подобное?
вообще написать можно... Кивиус, ты как, займемся? ;)
 
#3
Ой! был бы жутко признателен!!!!!!!!!

Потому как MEL только начал изучать(книга: "MEL skripting for MAYA animators" (русский ее вариант)), а скрипт уже нужен, и очень!!

на highend3d ничего похожего не нашел
 
#4
В цикле пройтись по всем фейсам объекта и выделить те у которых нормаль+/- значение угла чувствительности направлена на текущую камеру. имхо тривиально
 
#5
S.O.D., никто и не говорит, что сильно сложно... только вот я скрипта не вижу в твоем посте
 
#6
И не увидишь :) Алгоритма достаточно, а по хелпу глянуть синтаксис команд..., вы уж меня извините...
 

kivius

Активный участник
Рейтинг
12
#8
Не... хелп не читается... сегодня ковырялась на работе с ним (и с хелпом, и со скриптом) часа 2, вместо обеда и ужина. Затык только в том, что я уже не могу сообразить, как получить вектор направления камеры... как только его получу, еще немного и скрипт сделаю... Спасибо за вопрос. Хоть немного отвлеклась от работы :о)))
 
#9
Пасиба огромное!
я тут с этим selection constrainom пытаюсь разобраться, да, он делает что-то похожее, но как-то сложно, недоходчиво, и в хелпе его настройки(по крайней мере по этой части) плохо описаны (или я непонятливый)

Kivius, еще раз спасибо!
 
#10
global proc vector getCamVector_j()
{
string $curCamShape[];
float $camPos[], $camCOI[];
vector $camVector = << 0, 0, 0 >>;

string $curCam = `getCurCam_j`;
if ( $curCam != "" )
{
$curCamShape = eval ("listRelatives -fullPath -s " + $curCam); // got camera's shape
$camPos = eval ("camera -q -position " + $curCamShape[0]);
$camCOI = eval ("camera -q -worldCenterOfInterest " + $curCamShape[0]);
$camVector = << ( $camCOI[0] - $camPos[0] ), ( $camCOI[1] - $camPos[1] ), ( $camCOI[2] - $camPos[2] ) >>;
}
else print ("getCamVector(): can't get current camera(focus stealed?).\n");

return $camVector;
}

PS: Ребят, я же написал - selection constraints. Почитайте хелп ;)
 

kivius

Активный участник
Рейтинг
12
#11
тут все понятно... кроме одного...

string $curCam = `getCurCam_j`;

getCurCam_j - вот это что такое? откуда оно такое берется?


З.Ы. Простите за настойчивое тупое желание написать скрипт вместо того, чтобы почитать про selection constraints... я, кстати, лениво почитала... надо бы теперь еще с энтузиазмом... :о)))
 
#12
Vinc, Кивиус сообщила, что скрипт написан!
Такая шустрая ;)))
думаю вечерком выложит
 

kivius

Активный участник
Рейтинг
12
#14
Так! Скрыпт то я написала... но светлым умам лучше не глядеть, чтоб не пугаться :о))) Работает как-то... по хорошему еще б денька два целых посидеть, получилось бы что-нить стоящее... но у меня дома нету нужных инструментов :о)))
До завтра скрипт отменяется... записала не то файло :о))) вот бы нормаль камеры Решателя к моему скрипту... а то у меня, кажется, по-дурацки решена эта проблема :о))). Ждем завтра :о))) ну если, канешна, доживем до него...
 
#15
"я тут с этим selection constrainom пытаюсь разобраться, да, он делает что-то похожее, но как-то сложно, недоходчиво, и в хелпе его настройки(по крайней мере по этой части) плохо описаны (или я непонятливый)"

Он делает не "что-то похожее", а именно то что тебе надо.
 

kivius

Активный участник
Рейтинг
12
#16
Это надо сохранить под именем windowkivFaceSelect.mel, запихнуть в папку скриптов, загрузить в память Майки и вызывать кнопкой на полке с командой windowkivFaceSelect.

Могут быть косяки... запросто и много... звиняйте, если что :о)))
пришла домой, кое-что дописала, а проверить не на чем... ну уж повешу... такой... :о)))
=========================
// выделяет близкие к перпендикулярным к камере фейсы полигональных объектов
// выделить объект в нужном вьюпорте, по желанию нажать f, затем установить камеру в нужное место
// $perpend - аргумент от 0 до 1, отвечающий за то, какие фейсы будут выделены - чем ближе к 1, тем перпендикулярнее к камере
// $backF - если 2, то грани с противоположной стороны тоже будут выделены, если 1, то не будут


global proc windowkivFaceSelect ()

{

string $nameObject[] = `ls -sl`;
string $nameObj = $nameObject[0];

string $nameAt = "perpend";
string $attrOb = ($nameObj + "." + $nameAt);
string $myWin = "myWindow";
if (`attributeExists $nameAt $nameObj`)
deleteAttr $attrOb;


// создание окна
if (`window -exists myWindow`)
deleteUI myWindow;
if (!`window -exists myWindow`)
{
window -title "Select Faces To Camera" -w 310 myWindow;
columnLayout -adjustableColumn true -rs 10;
text -label $nameObj - align "center";
addAttr -ln perpend -at double -min 0 -max 1 -dv 0.6 $nameObj;
attrFieldSliderGrp -label "Perpendicular"
-min 0.0
-max 1.0
-attribute ($attrOb)
mySlider;
checkBox -label "Select Back Faces" mycheckBox;
rowLayout -numberOfColumns 2 -columnWidth2 260 300;
button -label "Set Camera to Object" -align "left" -c "frSel ($nameObj)" myCamButton;
button -label "Freeze Transformation" -align "right" -c "makeIdentity -apply true -t 1 -r 1 -s 1 $nameObj";
setParent ..;
button -label "Apply" -align "center" -c "kivFaceSelect ($nameObj)" myApButton;
button -label "Close Window" -align "center" -c "closeWin ($nameObj, $myWin, $nameAt, $attrOb)" myClButton;


showWindow myWindow;
}
}


global proc kivFaceSelect (string $nameObj)

{
select -clear;
select $nameObj;
float $perpend = `getAttr ($nameObj + ".perpend")`;
int $backF = `checkBox -q -value mycheckBox`;


// проверка правильности введенных аргументов

if ($perpend < 0 || $perpend > 1)
{
error "The first argument is wrong. Check the perpendicular poly faces is from 0 to 1";
}

else

{

if ($backF == 0 || $backF == 1)

{

// собственно скрипт

string $nameCam;
print $nameCam;

// получение имени камеры окна вьюпорта в фокусе

string $panel = `getPanel -wf`;
if ( "modelPanel" == `getPanel -to $panel` )
{
$nameCam = `modelEditor -q -camera $panel`;
}


// проверка на Freeze Transformation объекта

float $xTOb = `getAttr ($nameObj + ".tx")`;
float $yTOb = `getAttr ($nameObj + ".ty")`;
float $zTOb = `getAttr ($nameObj + ".tz")`;
float $xROb = `getAttr ($nameObj + ".rx")`;
float $yROb = `getAttr ($nameObj + ".ry")`;
float $zROb = `getAttr ($nameObj + ".rz")`;
float $xSOb = `getAttr ($nameObj + ".sx")`;
float $ySOb = `getAttr ($nameObj + ".sy")`;
float $zSOb = `getAttr ($nameObj + ".sz")`;


if ( ($xTOb != 0) || ($yTOb != 0) || ($zTOb != 0) || ($xROb != 0) || ($yROb != 0) || ($zROb != 0) || ($xSOb != 1) || ($ySOb != 1) || ($zSOb != 1))
{
warning "For the correct faces selection selected object needs Freeze Transformation";
}

float $perpendBack;
$perpendBack = -1*$perpend;


//нахождение нормали камеры
vector $vecVOb;
vector $vecVCam;
vector $vecCam;
float $positionOb[3] = `camera -q -wci $nameCam`;
float $positionCam[3] = `xform -worldSpace -query -translation $nameCam`;
$vecVOb = <<$positionOb[0], $positionOb[1], $positionOb[2]>>;
$vecVCam = <<$positionCam[0], $positionCam[1], $positionCam[2]>>;
$vecCam = $vecVOb - $vecVCam;
$vecCam = `unit $vecCam`;


//получение вектора нормали полигонов
$fmy = `polyInfo -fn $nameObj`;
int $countP = size ($fmy);
for ($i=0; $i<$countP; $i=$i+1)
{
string $ObFace = $nameObj + ".f[" + $i + "]";
string $fmyn = $fmy[$i];
$ds = size ($fmyn);
$st = `substring ($fmyn) 21 $ds`;
vector $vecP = $st;
$vecP = `unit $vecP`;

// проверка на параллельность-перпендикулярность векторов нормали и камеры
float $checkVec = dot ($vecCam, $vecP);

// выделение фейсов, отвечающих нужным требованиям
if ( ($checkVec <= $perpendBack) || ( ($checkVec >= $perpend) && ($backF == 1)) )
select -add $ObFace;
}

// перевод маски выделения в режим фейсов
doMenuComponentSelection($nameObj, "facet");

// чистка массивов
clear ($positionOb);
clear ($positionCam);
}


else
{
error "The second argument is wrong. Selection of the front faces is 0, of the front and back faces is 1";
}

}
}



// удаление введенных ранее доп. аттрибутов и закрытие программы
global proc closeWin (string $nameObj, string $myWin, string $nameAt, string $attrOb)
{
if (`window -exists $myWin`)
deleteUI $myWin;
if (`attributeExists $nameAt $nameObj`)
deleteAttr $attrOb;

}


// удаление введенных ранее доп. аттрибутов и закрытие программы
global proc frSel (string $nameObj)
{
select $nameObj;
FrameSelected;

}
 
#17
Кивиус, ты самый рульный мегаскипртописатель!!! ;)
вот только разобраться тяжело... глюки лезут... Вобщем предлагаю считать сей труд альфа-версией ;)
жаль времени даже на выходных не было поразбираться...
 
#18
Ой, идейка классная!
Кивиус, реализация помоему выполнена слишком сложно и нелогично... Максимум одну процедуру надо скрипту, и работать будет правильно. Еще идейка - выделять не все компоненты на объекте, а отсортировывать выбранные. Так как если я делаю мапинг левой руки мне совсем не нужно захватить пол туловища и еще и правую руку, и backface culling тут не поможет.
 

kivius

Активный участник
Рейтинг
12
#19
backface culling-a там не было, а идея такая тоже была... но я ж работаю... где взять время? :о)))
 
#20
Да уж:) Времени всегда нехватает... А ты посмотри на селекшн констрейнс они сделают что нужно и быстро. Если интересно могу присоединится:)
 
Сверху