1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем -, 29 сен 2004.

Модераторы: Dark™, Skif
  1. Guest

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

    Знающие, подскажите плиз!!
     
  2. Guest

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

    Ой! был бы жутко признателен!!!!!!!!!

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

    на highend3d ничего похожего не нашел
     
  4. Guest

    В цикле пройтись по всем фейсам объекта и выделить те у которых нормаль+/- значение угла чувствительности направлена на текущую камеру. имхо тривиально
     
  5. Guest

    S.O.D., никто и не говорит, что сильно сложно... только вот я скрипта не вижу в твоем посте
     
  6. Guest

    И не увидишь :) Алгоритма достаточно, а по хелпу глянуть синтаксис команд..., вы уж меня извините...
     
  7. Guest

    А хелп почитать слабО? Selection constraints.....
     
  8. kivius

    kivius Активный участник

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    Не... хелп не читается... сегодня ковырялась на работе с ним (и с хелпом, и со скриптом) часа 2, вместо обеда и ужина. Затык только в том, что я уже не могу сообразить, как получить вектор направления камеры... как только его получу, еще немного и скрипт сделаю... Спасибо за вопрос. Хоть немного отвлеклась от работы :о)))
     
  9. Guest

    Пасиба огромное!
    я тут с этим selection constrainom пытаюсь разобраться, да, он делает что-то похожее, но как-то сложно, недоходчиво, и в хелпе его настройки(по крайней мере по этой части) плохо описаны (или я непонятливый)

    Kivius, еще раз спасибо!
     
  10. Guest

    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. Почитайте хелп ;)
     
  11. kivius

    kivius Активный участник

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    тут все понятно... кроме одного...

    string $curCam = `getCurCam_j`;

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


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

    Vinc, Кивиус сообщила, что скрипт написан!
    Такая шустрая ;)))
    думаю вечерком выложит
     
  13. Guest

    Отличная новость, буду в нете, буду ждать!!
     
  14. kivius

    kivius Активный участник

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    Так! Скрыпт то я написала... но светлым умам лучше не глядеть, чтоб не пугаться :о))) Работает как-то... по хорошему еще б денька два целых посидеть, получилось бы что-нить стоящее... но у меня дома нету нужных инструментов :о)))
    До завтра скрипт отменяется... записала не то файло :о))) вот бы нормаль камеры Решателя к моему скрипту... а то у меня, кажется, по-дурацки решена эта проблема :о))). Ждем завтра :о))) ну если, канешна, доживем до него...
     
  15. Guest

    "я тут с этим selection constrainom пытаюсь разобраться, да, он делает что-то похожее, но как-то сложно, недоходчиво, и в хелпе его настройки(по крайней мере по этой части) плохо описаны (или я непонятливый)"

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

    kivius Активный участник

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    Это надо сохранить под именем 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. Guest

    Кивиус, ты самый рульный мегаскипртописатель!!! ;)
    вот только разобраться тяжело... глюки лезут... Вобщем предлагаю считать сей труд альфа-версией ;)
    жаль времени даже на выходных не было поразбираться...
     
  18. Guest

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

    kivius Активный участник

    С нами с:
    12.10.2005
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    12
    backface culling-a там не было, а идея такая тоже была... но я ж работаю... где взять время? :о)))
     
  20. Guest

    Да уж:) Времени всегда нехватает... А ты посмотри на селекшн констрейнс они сделают что нужно и быстро. Если интересно могу присоединится:)
     
Модераторы: Dark™, Skif

Поделиться этой страницей