Render.ru

скрипт по хитрому выделению фейсов для Vinc`a

#1
Вот типа альфа-версия скрипта от Кивиуса...
кое-как, но работает ;)

Всё, что ниже черты запишите в файл windowkivFaceSelect.mel
вызов по команде windowkivFaceSelect

------------------------------------------------------------------------

global proc windowkivFaceSelect()
{
global string $nameObj;
global string $nameAt;
global string $attrOb;
global string $myWin;

string $nameObject[];
$nameObject = `ls -sl`;
$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" myCamButton;
button -label "Freeze Transformation" -align "right" -c "makeIdentity -apply true -t 1 -r 1 -s 1";
setParent ..;
button -label "Apply" -align "center" -c "kivFaceSelect" myApButton;
button -label "Close Window" -align "center" -c "closeWin" myClButton;
showWindow myWindow;
}
}


global proc kivFaceSelect()
{
global 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()
{
global string $nameObj;
global string $nameAt;
global string $attrOb;
global string $myWin;

if (`window -exists $myWin`) deleteUI $myWin;
if (`attributeExists $nameAt $nameObj`) deleteAttr $attrOb;
}


// удаление введенных ранее доп. аттрибутов и закрытие программы

global proc frSel()
{
global string $nameObj;

select $nameObj;
FrameSelected;
}
 

kivius

Активный участник
Рейтинг
12
#2
Спасибо за потраченное время (а оно либо деньги, либо здоровье! :о))) ) и нечеловеческий труд по розыску косяков в чужом скрипте... в своем-то ни фига не разберешься... Как бы на полном серьёзе... :о)))
 
#3
Спасибо в стакан не нальешь! ;-))) (шутка)
Ты эта... скрипт до ума доводи, типа зубы не заговаривай ;-)))
 
#4
Ну ты Кивиус и упрямая птица... Я же тебе говорю что кучу всего лишнего написано, а ты не веришь...
 
#5
HawK, не занудствуй!
Как говорится, не нравится не ешь :о)
А если уж совсем противно на чужой скрипт смотреть, покажи свой!
 
#6
Своего нет, могу написать, если интересно:)) Ну просто правда много всего ненуууужного. Мне ведь не жалко, не с зависти это, уж поверь...
 
#7
Дык! верю! =)
Я сам писать начал, только вот времени не хватает :(
Завидую я Кивиусу, как у нее сил хватает и днем и ночью за компом сидеть?
Так вот, если уж есть силы и время, напиши... это будет интересно не мне одному.
 

kivius

Активный участник
Рейтинг
12
#9
Кивиус когда-то был против чего-то?.. :о))) не помню, таблеток так и не принимаю... А я упрямая, это правда, упрямая, вредная, занудная... и проч. перечислять, страницы не хватит :о)))
 
#10
Работает!!!!!!!!!!!
:о))
Точнее в первый раз почему-то несработало, но дальше все как часы, пасибо наиагромнейшее!!
 
#11
Ладно, вот набросок того что имел ввиду я. Процедурка работает на выделенных компонентах. Она отсортировывает из выбранных компонентов те угол между их ориентацией и нормалью камеры которых, находится в конкретном диапазоне. В процедуре две переменных. Первая это максимальный угол, а вторая это back face culling, 1 или 0, соответственно да или нет.


global proc HKSelectPerpendicularFaces(float $Angle, int $Culling)
{
float $Angle; int $Culling;

$Panel = `getPanel -wf`;
string $Cam = `modelPanel -q -camera $Panel`;
$pos = `xform -q -t -ws $Cam`;
$Aim = `camera -q -wci $Cam`;
float $Axis[3];
$Axis[0] = ($Aim[0] - $pos[0]);
$Axis[1] = ($Aim[1] - $pos[1]);
$Axis[2] = ($Aim[2] - $pos[2]);
polySelectConstraint -m 2 -t 0x0008 -o 2 -oa $Axis[0] $Axis[1] $Axis[2] -ob 0 $Angle;
if($Culling)
polySelectConstraint -m 2 -t 0x0008 -vp $pos[0] $pos[1] $pos[2] -va 90 -v 1;
polySelectConstraint -dis;
}

HKSelectPerpendicularFaces( 60, 1);
 
#12
странно, что $Angle и $Culling объявляются сначала в заголовке процедуры

global proc HKSelectPerpendicularFaces(float $Angle, int $Culling)

а потом как локальные переменные в теле процедуры...

float $Angle; int $Culling;

что-то здесь не так....
 
#13
Это не странно, так должно быть. Если нет скажи что именно "не так" :)
 
Сверху