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

Всем разработчикам использующим Maya, посящается скрипт

Тема в разделе "Maya", создана пользователем Slavenin, 7 фев 2009.

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

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    В качестве идеи для написания был взят урок по MEL Игоря Леводянского, от исходного кода не осталось ничего, все было переписано заново с нуля.

    //посвящается всем, кто работает в Maya, скрипт предназначен для создания террэйна (b не только) всего за несколько кликов мыши
    //комплект состоит из двух скриптов первый из которых умеет разбивать мэш ориентируяь на текстуру
    //содержащую карту разбиения, а вторая строить поверхность по карте высот
    //вместо бампа или дисплэйса
    //Скрипт умеет работать как целиком с объектом, так и с го частью

    //часть один, разбивающая

    //небольшая инстркция:
    //1) необходимо назначить на нужный фэйс/фэйсы карту разбиения (это текстура содержащая только черный и белый цвет
    //белый соответствует местам, где необходимо получить разбиение)
    //2)проверте имя файла текстуры если это не "file1", то неообходимо в строке 112
    //заменить "file1" на имя вашего файла текстуры(имеется в виду имя нода "file"), либо изменить имя вашего файла текстуры на "file1"
    //3) Крайне желательно сделать PlanarMap относительно нужной оси чтобы UV-кординаты
    //равномерно распределились по всей поверхности фэйса/фэйсов, иначем ожно получить неожиданные результаты
    //4)выделить нужные фэйсы
    //4)все вроде...
    //...а если после первого запуска ничего не произошло, то значт что все UV-кординаты вернули черный цвет
    //в таком случае необхлдимо руками с помощью команды polySubdivideFacet -dv 1 -m 0 -ch 1; разбить фэйсы
    //ну или если не омандой, то через меню EditMesh->AddDivision, настройках необходимо поставить
    //division levels - 1, а Mode - quads, на мой взгляд командой быстрее...

    //переменная-счетчик для цикла
    int $mas_global_i = 0;
    //для начала создаем основную переменную отвечающую за количество повторов цикла
    int $mas_global_counter = 1;

    //теперь спросим пользователя о желаемом количестве повторов цикла
    string $text;
    string $result = `promptDialog
    -title "Количетво проходов"
    -message "Введте количество повторов цикла \n(первый раз можно поставить около 4-6, \nдалее не ркомендуется ставить более одного так \nкак может возникнуть нехватка памяти) не забываем сохраняться ;)) \nзначение по дефолту равно 1 (веденное значение должно быть целым числом 1 2 3...):"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_global_counter = `promptDialog -query -text`;
    }

    //далее пошел основной код это корневой цикл количество проходов которого мы и задавали в самом начале
    for ($mas_global_i = 0; $mas_global_i<$mas_global_counter;$mas_global_i++)
    {
    //конвертируем выделенный фэйсы в связанные с ними UV-координаты
    ConvertSelectionToUVs;
    //в этом массиве у нас будут храниться все UV-кординаты вернувшие "нечерный цвет"
    string $mas_face_uv[];
    //здесь будут находится все выделенные UV-координаты
    string $all[];
    //здесь будут храниться номера UV-координат вернувших "нечерный цвет"
    int $mas_uv_num[];
    //здесь - имя выделенного объекта
    string $mas_nameOBj[];
    //это временная переменная содержащая имя UV-кординаты целиком
    string $mas_temp[];
    //счетчики для циклов
    int $mas_i;
    int $mas_k;

    //помещаем все выделенные UV-коорднаты в один массив
    $all = `ls -sl`;
    //это первый основной подцикл, итогом его работы будет массив номеров выделенных UV-кординат
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    //создаем новый масив в который помещаем имя выделенной UV-кординаты/координат
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    //разбиваем это имя несколько раз в случае если этот элемент содержит информацию
    //о вылелении нескольких UV-кординат, то находим промежуточные значения
    //например pCube.map[5:8] нужно получить промежуточные значени 6 и 7
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    //здесь получили имя объкта, записали его в переменную
    $mas_nameOBj[0] = $mas_name_uv[0];
    //разбиваем дальше
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    //получаем номера первой и последней UV-кординаты записываем в переменные
    //используя автопреобразоваие типов получим из значений типа string значения типа int
    //Maya в этом месте ругнется парой варнингов
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];
    //далее проверяем если максимальное значение равно нулю то текущий элемент массива
    //содержит информации тольо об одной UV-кординате, значит нужное нам значение
    //находитсся в переменной содержащей минимальное значение добавляем ее к массиву
    if ($mas_max_uv == 0)
    {
    //в таком исполнении команда добавляет элемент к существующему массиву
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }
    //если же нам все-таки надо найти промежуточные значения, то запускается эта часть
    //словного оператора if
    else
    {
    //добавляем к массиву максимальное значение, а то потом оно потеряется
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    //а здесь находим промежуточные значения цикл будет работать до тех пор пока
    //минимальное значение не будет равно максимальному
    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    //отнимем у текущего максимального значения единицу
    $mas_max_uv--;
    //добавим получившееся число к массиву и проверим на соответствие условию
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }
    //это второй основной подцикл который находит UV-кординаты вернувшие нечерный цвет
    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    //выделяем первую UV-кординату
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    //получаем координаты данной UV
    float $uvNum[] = `polyEditUV -q `;
    //создаем две переменные в которые и помещаем полученные координаты
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    //проверяем на "нечерность" данный участок текстуры перед запуском проверте
    //чтобы имя файла текстуры назначенного на поверхность было "file1" лиюо замените
    //в этой строке "file1" на имя вашего файла
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file1`;
    //в случае если цвет черный команда "colorAtPoint" вернет 0
    if ( $cFl_1[0]!= 0)
    {
    //запишем получившееся имя UV-кординаты в переменную
    $mas_temp = `ls -sl`;
    //добавим к массиву
    $mas_face_uv[size($mas_face)] = $mas_temp[0];
    }
    }
    //выделим массив UV-кординат вернувших нечерный цвет
    select -r $mas_face_uv;
    //конвертируем выделение в фэйсы
    ConvertSelectionToFaces;
    //разобъем выделенные фэйсы
    polySubdivideFacet -dv 1 -m 0 -ch 1;
    //уберем за собой мусор очистив массивы ;)
    clear $mas_face_uv;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    }

    //часть два поднимающая

    //здесь подробного описания не будет так как все ужеесть в опиании первой части,
    //остановлюсь только на местах, где что-то изменилось

    ConvertSelectionToUVs;
    string $mas_face[];
    string $all[];
    int $mas_uv_num[];
    string $mas_nameOBj[];
    string $mas_temp[];
    //массив содержищий значения высот точек
    float $mas_hight[];
    int $mas_i;
    int $mas_k;
    int $mas_j;
    //переменная отвечабщая за коэффицент высоты
    float $mas_index = 1;

    string $text;
    string $result = `promptDialog
    -title "Множитель высоты"
    -message "Введте коэффициент высоты (по дефолту белый = 1, черный = 0, коэффициент = 1):"
    -button "OK" -button "Cancel"
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_index = `promptDialog -query -text`;
    }

    $all = `ls -sl`;
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    $mas_nameOBj[0] = $mas_name_uv[0];
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];

    if ($mas_max_uv == 0)
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }

    else
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }

    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    $mas_max_uv--;
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }

    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    float $uvNum[] = `polyEditUV -q `;
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file1`;
    if ( $cFl_1[0]!= 0)
    {
    $mas_temp = `ls -sl`;
    //здесь в первый массив записывается имя UV-кординаты, а во второй соответствующая ей высота умноженная на коэффициент
    $mas_face[size($mas_face)] = $mas_temp[0];
    $mas_hight[size($mas_hight)] = $cFl_1[0]*$mas_index;
    }
    }
    //этот цикл по очереди выделяет точки вернувшие нечерный цвет после чего смещает их вверх с учетом коэффициента
    for ($mas_j= 0; $mas_j<size($mas_face); $mas_j++)
    {
    //выделил UV-кординату
    select -r $mas_face[$mas_j];
    //конвертировал выделение в Vertex
    ConvertSelectionToVertices;
    //сместил вверх на соответствующее значение
    move -r 0 $mas_hight[$mas_j] 0 ;
    }

    //уберем мусор ;)
    clear $mas_face;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    clear $mas_hight;


    Благодарю за внимание :)

    Если скрипт кому-то пригодится есть несколько мыслей по его модернизации, но пока мне самому это не надо, но если попросите сделаю, в частности уберется необходимость в замене имени файла.
    Если возникли проблемы с использованием, опять же пишите :)
     
  2. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.826
    Симпатии:
    417
    Баллы:
    2.787
    попробовал.. фигня получается..
    задает вопросы. и сколько бы я не вводил получается одно и тоже.
    мауа 2008
     

    Вложения:

    • 1095912.jpg
      1095912.jpg
      Размер файла:
      24,7 КБ
      Просмотров:
      64
    • 1095913.jpg
      1095913.jpg
      Размер файла:
      188,4 КБ
      Просмотров:
      76
    • 1095914.jpg
      1095914.jpg
      Размер файла:
      34,4 КБ
      Просмотров:
      80
    • 1095915.jpg
      1095915.jpg
      Размер файла:
      43,7 КБ
      Просмотров:
      73
    • 1095916.jpg
      1095916.jpg
      Размер файла:
      36 КБ
      Просмотров:
      67
  3. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    прошу прощения, опечатался в конце

    вместо строки (строка номер 132, находится в конце первой части, перед уборкой мусора :) ) в первой части:

    //добавим к массиву
    $mas_face_uv[size($mas_face)] = $mas_temp[0];

    должно быть

    //добавим к массиву
    $mas_face_uv[size($mas_face_uv)] = $mas_temp[0];

    исходный мэш и после 6 проходов цикла
     

    Вложения:

    • 1097107.jpg
      1097107.jpg
      Размер файла:
      50,9 КБ
      Просмотров:
      80
    • 1097108.jpg
      1097108.jpg
      Размер файла:
      81,5 КБ
      Просмотров:
      74
  4. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    кстати крайне желательно чтобы карта разбиения имела только черный и белый цвет, в таком случае достигается самый лучший результат
     
  5. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    2Skif отпишись, пожалуйста, заработало или нет.

    Да, и еще, у тебя корректно отображается русский текст в диалоге или нет? Возможно, стоит переписать его на английском, просто у меня все нормально.
     
  6. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Интереснее было бы, если код работал с исходной текстурой высот, адаптивно подстраиваясь под степень детализации карты на единице размера.
     
  7. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.826
    Симпатии:
    417
    Баллы:
    2.787
    да получилось, но честно говоря как то странно.. разбил то норм. но вот выдавил на высоту не очень то.. то есть выдавил ту же четно белую мапу... я так понял там 2 скрипта в одном?
    текст вообще не отображается. это видно на втором скрине моего предыдущего поста.
    кстати не поучилось разбить повторно.. для большей детализации
     
  8. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    хм, честно говоря не совсем понял...т.е. подстраивался под разрешение текстуры, сравнивал его с размером объекта и в соответствие с этим устанавливал коффициент высоты?

    карт должно быть две, первая для разбиения, где соджержится только черный и белый, вторая подробная уже непосредственно карта высот

    странно, у меня все получалось, каждый раз нужно заново выделять нужные фэйсы

    PS переведу текст на англицкий
     
  9. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    Версия 0.1, пока только перевел на транслит

    //посвящается всем, кто работает в Maya, скрипт предназначен для создания террэйна (b не только) всего за несколько кликов мыши
    //комплект состоит из двух скриптов первый из которых умеет разбивать мэш ориентируяь на текстуру
    //содержащую карту разбиения, а вторая строить поверхность по карте высот
    //вместо бампа или дисплэйса
    //Скрипт умеет работать как целиком с объектом, так и с го частью

    //часть один, разбивающая

    //небольшая инстркция:
    //1) необходимо назначить на нужный фэйс/фэйсы карту разбиения (это текстура содержащая только черный и белый цвет
    //белый соответствует местам, где необходимо получить разбиение)
    //2)проверте имя файла текстуры если это не "file1", то неообходимо в строке 112
    //заменить "file1" на имя вашего файла текстуры, либо изменить имя вашего файла текстуры на "file1"
    //3) Крайне желательно сделать PlanarMap относительно нужной оси чтобы UV-кординаты
    //равномерно распределились по всей поверхности фэйса/фэйсов, иначем ожно получить неожиданные результаты
    //4)выделить нужные фэйсы
    //4)все вроде...
    //...а если после первого запуска ничего не произошло, то значт что все UV-кординаты вернули черный цвет
    //в таком случае необхлдимо руками с помощью команды polySubdivideFacet -dv 1 -m 0 -ch 1; разбить фэйсы
    //ну или если не омандой, то через меню EditMesh->AddDivision, настройках необходимо поставить
    //division levels - 1, а Mode - quads, на мой взгляд командой быстрее...

    //переменная-счетчик для цикла
    int $mas_global_i = 0;
    //для начала создаем основную переменную отвечающую за количество повторов цикла
    int $mas_global_counter = 1;

    //теперь спросим пользователя о желаемом количестве повторов цикла
    string $text;
    string $result = `promptDialog
    -title "Количетво проходов"
    -message "Vvedte kolichestvo povtorov tsikla \n(pervyi raz mozhno postavit' okolo 4-6, \ndalee ne rekomenduetsya stavit' bolee odnogo tak \nkak mozhet vozniknut' nehvatka pamyati) ne zabyvaem sohranyat'sya ;)) \nznachenie po defoltu ravno 1 (vedennoe znachenie dolzhno byt' tselym chislom 1 2 3...):"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_global_counter = `promptDialog -query -text`;
    }

    //далее пошел основной код это корневой цикл количество проходов которого мы и задавали в самом начале
    for ($mas_global_i = 0; $mas_global_i<$mas_global_counter;$mas_global_i++)
    {
    //конвертируем выделенный фэйсы в связанные с ними UV-координаты
    ConvertSelectionToUVs;
    //в этом массиве у нас будут храниться все UV-кординаты вернувшие "нечерный цвет"
    string $mas_face_uv[];
    //здесь будут находится все выделенные UV-координаты
    string $all[];
    //здесь будут храниться номера UV-координат вернувших "нечерный цвет"
    int $mas_uv_num[];
    //здесь - имя выделенного объекта
    string $mas_nameOBj[];
    //это временная переменная содержащая имя UV-кординаты целиком
    string $mas_temp[];
    //счетчики для циклов
    int $mas_i;
    int $mas_k;

    //помещаем все выделенные UV-коорднаты в один массив
    $all = `ls -sl`;
    //это первый основной подцикл, итогом его работы будет массив номеров выделенных UV-кординат
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    //создаем новый масив в который помещаем имя выделенной UV-кординаты/координат
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    //разбиваем это имя несколько раз в случае если этот элемент содержит информацию
    //о вылелении нескольких UV-кординат, то находим промежуточные значения
    //например pCube.map[5:8] нужно получить промежуточные значени 6 и 7
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    //здесь получили имя объкта, записали его в переменную
    $mas_nameOBj[0] = $mas_name_uv[0];
    //разбиваем дальше
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    //получаем номера первой и последней UV-кординаты записываем в переменные
    //используя автопреобразоваие типов получим из значений типа string значения типа int
    //Maya в этом месте ругнется парой варнингов
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];
    //далее проверяем если максимальное значение равно нулю то текущий элемент массива
    //содержит информации тольо об одной UV-кординате, значит нужное нам значение
    //находитсся в переменной содержащей минимальное значение добавляем ее к массиву
    if ($mas_max_uv == 0)
    {
    //в таком исполнении команда добавляет элемент к существующему массиву
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }
    //если же нам все-таки надо найти промежуточные значения, то запускается эта часть
    //словного оператора if
    else
    {
    //добавляем к массиву максимальное значение, а то потом оно потеряется
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    //а здесь находим промежуточные значения цикл будет работать до тех пор пока
    //минимальное значение не будет равно максимальному
    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    //отнимем у текущего максимального значения единицу
    $mas_max_uv--;
    //добавим получившееся число к массиву и проверим на соответствие условию
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }
    //это второй основной подцикл который находит UV-кординаты вернувшие нечерный цвет
    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    //выделяем первую UV-кординату
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    //получаем координаты данной UV
    float $uvNum[] = `polyEditUV -q `;
    //создаем две переменные в которые и помещаем полученные координаты
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    //проверяем на "нечерность" данный участок текстуры перед запуском проверте
    //чтобы имя файла текстуры назначенного на поверхность было "file1" лиюо замените
    //в этой строке "file1" на имя вашего файла
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file1`;
    //в случае если цвет черный команда "colorAtPoint" вернет 0
    if ( $cFl_1[0]!= 0)
    {
    //запишем получившееся имя UV-кординаты в переменную
    $mas_temp = `ls -sl`;
    //добавим к массиву
    $mas_face_uv[size($mas_face_uv)] = $mas_temp[0];
    }
    }
    //выделим массив UV-кординат вернувших нечерный цвет
    select -r $mas_face_uv;
    //конвертируем выделение в фэйсы
    ConvertSelectionToFaces;
    //разобъем выделенные фэйсы
    polySubdivideFacet -dv 1 -m 0 -ch 1;
    //уберем за собой мусор очистив массивы ;)
    clear $mas_face_uv;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    }


    часть 2

    //посвящается всем, кто работает в Maya, скрипт предназначен для создания террэйна всего за несколько кликов мыши
    //комплект состоит из двух скриптов первый из которых умеет разбивать мэш ориентируяь на текстуру
    //содержащую карту разбиения, а вторая строить поверхность по карте высот
    //вместо бампа или дисплэйса

    //часть два поднимающая

    //здесь подробного описания не будет так как все ужеесть в опиании первой части,
    //остановлюсь только на местах, где что-то изменилось

    ConvertSelectionToUVs;
    string $mas_face[];
    string $all[];
    int $mas_uv_num[];
    string $mas_nameOBj[];
    string $mas_temp[];
    //массив содержищий значения высот точек
    float $mas_hight[];
    int $mas_i;
    int $mas_k;
    int $mas_j;
    //переменная отвечабщая за коэффицент высоты
    float $mas_index = 1;

    string $text;
    string $result = `promptDialog
    -title "Множитель высоты"
    -message "Vvedte koeffitsient vysoty (iznachal'no koeffitsient = 1, chto sootvetstvuet belomu = 1-oi edinitse vysoty, chernomu = 0, ):"
    -button "OK" -button "Cancel"
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_index = `promptDialog -query -text`;
    }

    $all = `ls -sl`;
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    $mas_nameOBj[0] = $mas_name_uv[0];
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];

    if ($mas_max_uv == 0)
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }

    else
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }

    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    $mas_max_uv--;
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }

    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    float $uvNum[] = `polyEditUV -q `;
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file1`;
    if ( $cFl_1[0]!= 0)
    {
    $mas_temp = `ls -sl`;
    //здесь в первый массив записывается имя UV-кординаты, а во второй соответствующая ей высота умноженная на коэффициент
    $mas_face[size($mas_face)] = $mas_temp[0];
    $mas_hight[size($mas_hight)] = $cFl_1[0]*$mas_index;
    }
    }
    //этот цикл по очереди выделяет точки вернувшие нечерный цвет после чего смещает их вверх с учетом коэффициента
    for ($mas_j= 0; $mas_j<size($mas_face); $mas_j++)
    {
    //выделил UV-кординату
    select -r $mas_face[$mas_j];
    //конвертировал выделение в Vertex
    ConvertSelectionToVertices;
    //сместил вверх на соответствующее значение
    move -r 0 $mas_hight[$mas_j] 0 ;
    }

    //уберем мусор ;)
    clear $mas_face;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    clear $mas_hight;

    PS здесь можно файлы прилеплять как-нибудь?
    PPS а Bbcode поддерживается?
     
  10. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.826
    Симпатии:
    417
    Баллы:
    2.787
    да нет.. вот смотри.. разбиение происходит по карте 1. см аттачи
    а выдавливать то надо по карте 2.
     

    Вложения:

    • 1098282.jpg
      1098282.jpg
      Размер файла:
      20 КБ
      Просмотров:
      67
    • 1098283.jpg
      1098283.jpg
      Размер файла:
      20,5 КБ
      Просмотров:
      62
  11. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Можно только хз, есть ли у тебя эта форма
    Да, ет у всех точно есть.

    Вот приблизительно какое разбиение можно увидеть на исходной карте, вот такой код интереснее был бы - потому как во вьюпорте его можно было по пощупать, а не только после рендера
    [​IMG]
     
  12. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    именно такое, ну или очень похоже разбиение должно получится, я наверно плохо объяснил, все места на карте высот, которые нечерные на карте для разбиения должны быть белые

    подъем осуществляется давольно долго(я наверн около 30-40 мин ждал при разбиении на 115632 треугольников)
     

    Вложения:

    • 1098527.jpg
      1098527.jpg
      Размер файла:
      75,5 КБ
      Просмотров:
      79
    • 1098528.jpg
      1098528.jpg
      Размер файла:
      57,4 КБ
      Просмотров:
      73
    • 1098529.jpg
      1098529.jpg
      Размер файла:
      182,4 КБ
      Просмотров:
      72
    • 1098530.jpg
      1098530.jpg
      Размер файла:
      182,7 КБ
      Просмотров:
      69
    • 1098531.jpg
      1098531.jpg
      Размер файла:
      144,6 КБ
      Просмотров:
      70
  13. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    [​IMG] А зачем так разбивать?
     
  14. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    фэйсы бъются командой Add Division, причем все фэйсы вернувшие нечерный цвет разбиваются одновременно и порой действительно возникают такие места, как от них избавится я, честно говоря, не знаю :)
     
  15. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Кстати - для собственно дисплейса можно написать плаг, он маленький совсем. возникнут грабли с совместимостью, зато скорость работы повысится.
     
  16. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    2Решатель дисплэйса нет, скрипт вычисляет высоту точки ориентируясь на цвет текстуры под ней, и затем командой Move поднимает
    извиняюсь за такие длинные мессаги, но тег [checbox] нифига не работает...

    доделал до конца... кажется. Если есить какие-то предложения по совершенствованию говорите :)

    //все упростилось теперь скрипт все делает за вас ;)
    //1) выделяем нужный фэйс загружаем первую часть скрипта,
    //выбираем текстуру для разбиения
    //2)снова выделяем получившиеся фэйсы загружаем вторую часть скрипта
    //3) и опять выделяем получившиеся фэйсы загружаем третью часть скрипта, определяем
    //карту высот


    часть1

    string $mas_sel_f[];
    string $mas_axis;
    $mas_sel_f = `ls -sl`;
    string $mas_path = `fileDialog -m 0 -t "viberite kartu razbieniya"`;

    shadingNode -asShader lambert -n "karta";
    shadingNode -asTexture file -n "file_karta";
    shadingNode -asUtility place2dTexture -n "d_karta";
    defaultNavigation -connectToExisting -source d_karta -destination file_karta;
    defaultNavigation -connectToExisting -source file_karta -destination karta.color;
    AEpropagateMenuCB -backward "" "d_karta";
    AEassignTextureCB file_karta.fileTextureName $mas_path "image";

    select $mas_sel_f;
    hyperShade -assign karta;

    string $result = `promptDialog
    -title "Planar"
    -message "ukazite os` otnositel`no kotoroy planarit`: x, y ili z"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_axis = `promptDialog -query -text`;
    }

    ConvertSelectionToFaces; polyProjection -ch 1 -type Planar -ibd on -icx 0.5 -icy 0.5 -ra 0 -isu 1 -isv 1 -md $mas_axis ;setToolTo ShowManips;

    string $mas_temp_name[];
    $mas_temp_name = `ls -sl`;
    polySubdivideFacet -dv 1 -m 0 -ch 1 $mas_temp_name;
    select -cl;


    //часть2

    //переменная-счетчик для цикла
    int $mas_global_i = 0;
    //для начала создаем основную переменную отвечающую за количество повторов цикла
    int $mas_global_counter = 1;

    //теперь спросим пользователя о желаемом количестве повторов цикла
    string $text;
    string $result = `promptDialog
    -title "Количетво проходов"
    -message "Введте количество повторов цикла \n(первый раз можно поставить около 4-6, \nдалее не ркомендуется ставить более одного так \nкак может возникнуть нехватка памяти) не забываем сохраняться ;)) \nзначение по дефолту равно 1 (веденное значение должно быть целым числом 1 2 3...):"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_global_counter = `promptDialog -query -text`;
    }

    //далее пошел основной код это корневой цикл количество проходов которого мы и задавали в самом начале
    for ($mas_global_i = 0; $mas_global_i<$mas_global_counter;$mas_global_i++)
    {
    //конвертируем выделенный фэйсы в связанные с ними UV-координаты
    ConvertSelectionToUVs;
    //в этом массиве у нас будут храниться все UV-кординаты вернувшие "нечерный цвет"
    string $mas_face_uv[];
    //здесь будут находится все выделенные UV-координаты
    string $all[];
    //здесь будут храниться номера UV-координат вернувших "нечерный цвет"
    int $mas_uv_num[];
    //здесь - имя выделенного объекта
    string $mas_nameOBj[];
    //это временная переменная содержащая имя UV-кординаты целиком
    string $mas_temp[];
    //счетчики для циклов
    int $mas_i;
    int $mas_k;

    //помещаем все выделенные UV-коорднаты в один массив
    $all = `ls -sl`;
    //это первый основной подцикл, итогом его работы будет массив номеров выделенных UV-кординат
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    //создаем новый масив в который помещаем имя выделенной UV-кординаты/координат
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    //разбиваем это имя несколько раз в случае если этот элемент содержит информацию
    //о вылелении нескольких UV-кординат, то находим промежуточные значения
    //например pCube.map[5:8] нужно получить промежуточные значени 6 и 7
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    //здесь получили имя объкта, записали его в переменную
    $mas_nameOBj[0] = $mas_name_uv[0];
    //разбиваем дальше
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    //получаем номера первой и последней UV-кординаты записываем в переменные
    //используя автопреобразоваие типов получим из значений типа string значения типа int
    //Maya в этом месте ругнется парой варнингов
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];
    //далее проверяем если максимальное значение равно нулю то текущий элемент массива
    //содержит информации тольо об одной UV-кординате, значит нужное нам значение
    //находитсся в переменной содержащей минимальное значение добавляем ее к массиву
    if ($mas_max_uv == 0)
    {
    //в таком исполнении команда добавляет элемент к существующему массиву
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }
    //если же нам все-таки надо найти промежуточные значения, то запускается эта часть
    //словного оператора if
    else
    {
    //добавляем к массиву максимальное значение, а то потом оно потеряется
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    //а здесь находим промежуточные значения цикл будет работать до тех пор пока
    //минимальное значение не будет равно максимальному
    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    //отнимем у текущего максимального значения единицу
    $mas_max_uv--;
    //добавим получившееся число к массиву и проверим на соответствие условию
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }
    //это второй основной подцикл который находит UV-кординаты вернувшие нечерный цвет
    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    //выделяем первую UV-кординату
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    //получаем координаты данной UV
    float $uvNum[] = `polyEditUV -q `;
    //создаем две переменные в которые и помещаем полученные координаты
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    //проверяем на "нечерность" данный участок текстуры перед запуском проверте
    //чтобы имя файла текстуры назначенного на поверхность было "file1" лиюо замените
    //в этой строке "file1" на имя вашего файла
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file_karta`;
    //в случае если цвет черный команда "colorAtPoint" вернет 0
    if ( $cFl_1[0]!= 0)
    {
    //запишем получившееся имя UV-кординаты в переменную
    $mas_temp = `ls -sl`;
    //добавим к массиву
    $mas_face_uv[size($mas_face_uv)] = $mas_temp[0];
    }
    }
    //выделим массив UV-кординат вернувших нечерный цвет
    select -r $mas_face_uv;
    //конвертируем выделение в фэйсы
    ConvertSelectionToFaces;
    //разобъем выделенные фэйсы
    polySubdivideFacet -dv 1 -m 0 -ch 1;
    //уберем за собой мусор очистив массивы ;)
    clear $mas_face_uv;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    }


    //посвящается всем, кто работает в Maya, скрипт предназначен для создания террэйна всего за несколько кликов мыши
    //комплект состоит из двух скриптов первый из которых умеет разбивать мэш ориентируяь на текстуру
    //содержащую карту разбиения, а вторая строить поверхность по карте высот
    //вместо бампа или дисплэйса

    //часть3

    //здесь подробного описания не будет так как все ужеесть в опиании первой части,
    //остановлюсь только на местах, где что-то изменилось

    string $mas_sel_f2[];
    $mas_sel_f2 = `ls -sl`;

    string $mas_path2 = `fileDialog -m 0 -t "viberite kartu visot"`;

    shadingNode -asShader lambert -n "karta2";
    shadingNode -asTexture file -n "file_karta2";
    shadingNode -asUtility place2dTexture -n "d_karta2";
    defaultNavigation -connectToExisting -source d_karta2 -destination file_karta2;
    defaultNavigation -connectToExisting -source file_karta2 -destination karta2.color;
    AEpropagateMenuCB -backward "" "d_karta2";
    AEassignTextureCB file_karta2.fileTextureName $mas_path2 "image";
    select $mas_sel_f2;
    hyperShade -assign karta2;



    ConvertSelectionToUVs;
    string $mas_face[];
    string $all[];
    int $mas_uv_num[];
    string $mas_nameOBj[];
    string $mas_temp[];
    //массив содержищий значения высот точек
    float $mas_hight[];
    int $mas_i;
    int $mas_k;
    int $mas_j;
    //переменная отвечабщая за оэффицент высоты
    float $mas_index = 1;

    string $text;
    string $result = `promptDialog
    -title "Множитель высоты"
    -message "Введте множитель высоты, по дефолту белый = 1, черный = 0, множитель = 1:"
    -button "OK" -button "Cancel"
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_index = `promptDialog -query -text`;
    }

    $all = `ls -sl`;
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    $mas_nameOBj[0] = $mas_name_uv[0];
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];

    if ($mas_max_uv == 0)
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }

    else
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }

    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    $mas_max_uv--;
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }

    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    float $uvNum[] = `polyEditUV -q `;
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file_karta2`;
    if ( $cFl_1[0]!= 0)
    {
    $mas_temp = `ls -sl`;
    //здесь в первый массив записывается имя UV-кординаты, а во второй соответствующая ей высота умноженная на коэффициент
    $mas_face[size($mas_face)] = $mas_temp[0];
    $mas_hight[size($mas_hight)] = $cFl_1[0]*$mas_index;
    }
    }
    //этот цикл по очереди выделяет точки вернувшие нечерный цвет после чего смещает их вверх с учетом коэффициента
    for ($mas_j= 0; $mas_j<size($mas_face); $mas_j++)
    {
    //выделил UV-кординату
    select -r $mas_face[$mas_j];
    //конвертировал выделение в Vertex
    ConvertSelectionToVertices;
    //сместил вверх на соответствующее значение
    move -r 0 $mas_hight[$mas_j] 0 ;
    }

    //уберем мусор ;)
    clear $mas_face;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    clear $mas_hight;
     
  17. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    поправил возможный косяк с неправильным смещение точек

    //часть3

    //здесь подробного описания не будет так как все ужеесть в опиании первой части,
    //остановлюсь только на местах, где что-то изменилось

    string $mas_sel_f2[];
    $mas_sel_f2 = `ls -sl`;

    string $mas_path2 = `fileDialog -m 0 -t "viberite kartu visot"`;

    shadingNode -asShader lambert -n "karta2";
    shadingNode -asTexture file -n "file_karta2";
    shadingNode -asUtility place2dTexture -n "d_karta2";
    defaultNavigation -connectToExisting -source d_karta2 -destination file_karta2;
    defaultNavigation -connectToExisting -source file_karta2 -destination karta2.color;
    AEpropagateMenuCB -backward "" "d_karta2";
    AEassignTextureCB file_karta2.fileTextureName $mas_path2 "image";
    select $mas_sel_f2;
    hyperShade -assign karta2;



    ConvertSelectionToUVs;
    string $mas_face[];
    string $all[];
    int $mas_uv_num[];
    string $mas_nameOBj[];
    string $mas_temp[];
    //массив содержищий значения высот точек
    float $mas_hight[];
    int $mas_i;
    int $mas_k;
    int $mas_j;
    //переменная отвечабщая за оэффицент высоты
    float $mas_index = 1;

    string $text;
    string $result = `promptDialog
    -title "Множитель высоты"
    -message "Введте множитель высоты, по дефолту белый = 1, черный = 0, множитель = 1:"
    -button "OK" -button "Cancel"
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_index = `promptDialog -query -text`;
    }

    $all = `ls -sl`;
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    $mas_nameOBj[0] = $mas_name_uv[0];
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];

    if ($mas_max_uv == 0)
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }

    else
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }

    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    $mas_max_uv--;
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }

    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    float $uvNum[] = `polyEditUV -q `;
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file_karta2`;
    if ( $cFl_1[0]!= 0)
    {
    $mas_temp = `ls -sl`;
    //здесь в первый массив записывается имя UV-кординаты, а во второй соответствующая ей высота умноженная на коэффициент
    $mas_face[size($mas_face)] = $mas_temp[0];
    $mas_hight[size($mas_hight)] = $cFl_1[0]*$mas_index;
    }
    }
    //этот цикл по очереди выделяет точки вернувшие нечерный цвет после чего смещает их вверх с учетом коэффициента
    for ($mas_j= 0; $mas_j<size($mas_face); $mas_j++)
    {
    //выделил UV-кординату
    select -r $mas_face[$mas_j];
    //конвертировал выделение в Vertex
    ConvertSelectionToVertices;
    //сместил вверх на соответствующее значение
    move -r -os 0 $mas_hight[$mas_j] 0 ;
    }

    //уберем мусор ;)
    clear $mas_face;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    clear $mas_hight;
     
  18. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.826
    Симпатии:
    417
    Баллы:
    2.787
    хмм... щас немного занят но постараюсь протестировать ближе к выходным
     
  19. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    Ну как попробовал? :)
     
  20. Slavenin

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

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    введен режим обучения и возможность отключить планар мэп (может пригодится если текстура назначена на сложный объект с собственной разверткой)

    //все упростилось теперь скрипт все делает за вас ;)
    //1) выделяем нужный фэйс загружаем первую часть скрипта,
    //выбираем текстуру для разбиения
    //2)снова выделяем получившиеся фэйсы загружаем вторую часть скрипта
    //3) и опять выделяем получившиеся фэйсы загружаем третью часть скрипта, определяем
    //карту высот


    //часть1

    int $mas_yes;
    string $mas_learn = `promptDialog
    -title "Obuchenie"
    -message "Vam nuzhno obuchenie rabote so scriptom? 1 - da, 0 - net"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($mas_learn == "OK")
    {
    $mas_yes = `promptDialog -query -text`;
    }

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Итак щас я вам расскажу чтоже вы такое загрузили!\n Это обучение работе со скриптом, предначзначенным для построения террэина за несколько кликов мыши.\n Данная часть создаст материал, назначит ему карту разбиения и наложит материал на выделенные фэйсы.\n Первое что необходимо для его функционирования это, так называемая, карта разбиения.\n Она представляет из себя текстуру содержащую только черный и белый цвет.\n Там где белый в последствии появится разбиение, соответсвенно белым на карте нужно пометить места,\n где должны быть холмы, горы, озера ну или еще что-то подобное.\n Текстура должна быть готова еще до запуска скрипта";
    }

    string $mas_sel_f[];
    string $mas_axis;
    $mas_sel_f = `ls -sl`;

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Сейчас надо будет выбрать карту для разбиения";
    }

    string $mas_path = `fileDialog -m 0 -t "viberite kartu razbieniya"`;

    shadingNode -asShader lambert -n "karta";
    shadingNode -asTexture file -n "file_karta";
    shadingNode -asUtility place2dTexture -n "d_karta";
    defaultNavigation -connectToExisting -source d_karta -destination file_karta;
    defaultNavigation -connectToExisting -source file_karta -destination karta.color;
    AEpropagateMenuCB -backward "" "d_karta";
    AEassignTextureCB file_karta.fileTextureName $mas_path "image";

    select $mas_sel_f;
    hyperShade -assign karta;


    int $mas_plan;
    string $mas_planar = `promptDialog
    -title "Planar"
    -message "Planar nuzhenm? 1 - da, 0 - net"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($mas_planar == "OK")
    {
    $mas_plan = `promptDialog -query -text`;
    }
    if ($mas_plan == 1)
    {
    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "В следующем окошке нужно будет выбрать ось относительно которой будет произведен планар мэпинг.\n Обычно это 'y' или 'z', хотя может быть и 'х', если надо получить разбиение где-нить сбоку ";
    }

    string $result = `promptDialog
    -title "Planar"
    -message "ukazite os` otnositel`no kotoroy planarit`: x, y ili z"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_axis = `promptDialog -query -text`;
    }

    ConvertSelectionToFaces; polyProjection -ch 1 -type Planar -ibd on -icx 0.5 -icy 0.5 -ra 0 -isu 1 -isv 1 -md $mas_axis ;setToolTo ShowManips;
    }
    string $mas_temp_name[];
    $mas_temp_name = `ls -sl`;
    polySubdivideFacet -dv 1 -m 0 -ch 1 $mas_temp_name;
    select -cl;

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Первая часть закончена, грузите вторую.";
    }

    //часть2
    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "В этой части произойдет непосредственно разбиение поверхности в белых местах\n Нужно только ввести количество повторов для цикла";
    }
    //переменная-счетчик для цикла
    int $mas_global_i = 0;
    //для начала создаем основную переменную отвечающую за количество повторов цикла
    int $mas_global_counter = 1;

    //теперь спросим пользователя о желаемом количестве повторов цикла
    string $text;
    string $result = `promptDialog
    -title "Количетво проходов"
    -message "Введте количество повторов цикла \n(первый раз можно поставить около 4-6, \nдалее не ркомендуется ставить более одного так \nкак может возникнуть нехватка памяти) не забываем сохраняться ;)) \nзначение по дефолту равно 1 (веденное значение должно быть целым числом 1 2 3...):"
    -button "OK" -button "Cancel"
    -sf true
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_global_counter = `promptDialog -query -text`;
    }

    //далее пошел основной код это корневой цикл количество проходов которого мы и задавали в самом начале
    for ($mas_global_i = 0; $mas_global_i<$mas_global_counter;$mas_global_i++)
    {
    //конвертируем выделенный фэйсы в связанные с ними UV-координаты
    ConvertSelectionToUVs;
    //в этом массиве у нас будут храниться все UV-кординаты вернувшие "нечерный цвет"
    string $mas_face_uv[];
    //здесь будут находится все выделенные UV-координаты
    string $all[];
    //здесь будут храниться номера UV-координат вернувших "нечерный цвет"
    int $mas_uv_num[];
    //здесь - имя выделенного объекта
    string $mas_nameOBj[];
    //это временная переменная содержащая имя UV-кординаты целиком
    string $mas_temp[];
    //счетчики для циклов
    int $mas_i;
    int $mas_k;

    //помещаем все выделенные UV-коорднаты в один массив
    $all = `ls -sl`;
    //это первый основной подцикл, итогом его работы будет массив номеров выделенных UV-кординат
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    //создаем новый масив в который помещаем имя выделенной UV-кординаты/координат
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    //разбиваем это имя несколько раз в случае если этот элемент содержит информацию
    //о вылелении нескольких UV-кординат, то находим промежуточные значения
    //например pCube.map[5:8] нужно получить промежуточные значени 6 и 7
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    //здесь получили имя объкта, записали его в переменную
    $mas_nameOBj[0] = $mas_name_uv[0];
    //разбиваем дальше
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    //получаем номера первой и последней UV-кординаты записываем в переменные
    //используя автопреобразоваие типов получим из значений типа string значения типа int
    //Maya в этом месте ругнется парой варнингов
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];
    //далее проверяем если максимальное значение равно нулю то текущий элемент массива
    //содержит информации тольо об одной UV-кординате, значит нужное нам значение
    //находитсся в переменной содержащей минимальное значение добавляем ее к массиву
    if ($mas_max_uv == 0)
    {
    //в таком исполнении команда добавляет элемент к существующему массиву
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }
    //если же нам все-таки надо найти промежуточные значения, то запускается эта часть
    //словного оператора if
    else
    {
    //добавляем к массиву максимальное значение, а то потом оно потеряется
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    //а здесь находим промежуточные значения цикл будет работать до тех пор пока
    //минимальное значение не будет равно максимальному
    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    //отнимем у текущего максимального значения единицу
    $mas_max_uv--;
    //добавим получившееся число к массиву и проверим на соответствие условию
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }
    //это второй основной подцикл который находит UV-кординаты вернувшие нечерный цвет
    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    //выделяем первую UV-кординату
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    //получаем координаты данной UV
    float $uvNum[] = `polyEditUV -q `;
    //создаем две переменные в которые и помещаем полученные координаты
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    //проверяем на "нечерность" данный участок текстуры перед запуском проверте
    //чтобы имя файла текстуры назначенного на поверхность было "file1" лиюо замените
    //в этой строке "file1" на имя вашего файла
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file_karta`;
    //в случае если цвет черный команда "colorAtPoint" вернет 0
    if ( $cFl_1[0]!= 0)
    {
    //запишем получившееся имя UV-кординаты в переменную
    $mas_temp = `ls -sl`;
    //добавим к массиву
    $mas_face_uv[size($mas_face_uv)] = $mas_temp[0];
    }
    }
    //выделим массив UV-кординат вернувших нечерный цвет
    select -r $mas_face_uv;
    //конвертируем выделение в фэйсы
    ConvertSelectionToFaces;
    //разобъем выделенные фэйсы
    polySubdivideFacet -dv 1 -m 0 -ch 1;
    //уберем за собой мусор очистив массивы ;)
    clear $mas_face_uv;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    }

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Вторая часть закончена, грузите третью.";
    }

    //часть3

    //здесь подробного описания не будет так как все ужеесть в опиании первой части,
    //остановлюсь только на местах, где что-то изменилось

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Третья часть построит поверхность по карте высот\n Что же это такое? Все очень просто, карта высот - чёрно белая ( точнее grayscale ) картинка,\n где белые цвет означает самую высокую точку, а чёрный - нулевую,\n а все оттенки ( промежуточные цвета ) - это промежуточные высоты. В Maya белый цвет соответствует одной единице высоты, т.е. если метричская система сцены это сантиметры - это 1см, если метры - 1м и т.д.\n Чем больше количество разбиений тем дольше работает скрипт.\n Карта высот тоже должна быть готова до запуска скрипта";
    }

    string $mas_sel_f2[];
    $mas_sel_f2 = `ls -sl`;

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Сейчас надо будет выбрать карту высот";
    }


    string $mas_path2 = `fileDialog -m 0 -t "viberite kartu visot"`;

    shadingNode -asShader lambert -n "karta2";
    shadingNode -asTexture file -n "file_karta2";
    shadingNode -asUtility place2dTexture -n "d_karta2";
    defaultNavigation -connectToExisting -source d_karta2 -destination file_karta2;
    defaultNavigation -connectToExisting -source file_karta2 -destination karta2.color;
    AEpropagateMenuCB -backward "" "d_karta2";
    AEassignTextureCB file_karta2.fileTextureName $mas_path2 "image";
    select $mas_sel_f2;
    hyperShade -assign karta2;



    ConvertSelectionToUVs;
    string $mas_face[];
    string $all[];
    int $mas_uv_num[];
    string $mas_nameOBj[];
    string $mas_temp[];
    //массив содержищий значения высот точек
    float $mas_hight[];
    int $mas_i;
    int $mas_k;
    int $mas_j;
    //переменная отвечабщая за оэффицент высоты
    float $mas_index = 1;

    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "А сейчас надо ввести множитель высоты.\n Что же это такое? Всего лищь значение на которое будет умножена полученная высота точки.\n Как я раньше говорил белый цвет соответствует высоте 1, а если надо получить максимальную высоту 2?\n Просто вводим множитель высоты равный 2-м и максимальная высота теперь 2";
    }

    string $text;
    string $result = `promptDialog
    -title "Множитель высоты"
    -message "Введте множитель высоты, по дефолту белый = 1, черный = 0, множитель = 1:"
    -button "OK" -button "Cancel"
    -defaultButton "OK" -cancelButton "Cancel"
    -dismissString "Cancel"`;

    if ($result == "OK")
    {
    $mas_index = `promptDialog -query -text`;
    }

    $all = `ls -sl`;
    for ($mas_i = 0; $mas_i < size($all); $mas_i++)
    {
    string $mas_name_uv[];
    select -r $all[$mas_i];
    $mas_name_uv = `ls -sl`;
    tokenize $mas_name_uv[0] "[" $mas_name_uv;
    $mas_nameOBj[0] = $mas_name_uv[0];
    tokenize $mas_nameOBj[0] "." $mas_nameOBj;
    tokenize $mas_name_uv[1] ":" $mas_name_uv;
    int $mas_max_uv = $mas_name_uv[1];
    int $mas_min_uv = $mas_name_uv[0];

    if ($mas_max_uv == 0)
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_min_uv;
    }

    else
    {
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }

    while ($mas_min_uv != $mas_max_uv && $mas_max_uv > 0)
    {
    $mas_max_uv--;
    $mas_uv_num[size($mas_uv_num)] = $mas_max_uv;
    }
    }

    for ($mas_k=0; $mas_k<size($mas_uv_num); $mas_k++)
    {
    select ($mas_nameOBj[0]+".map[" + $mas_uv_num[$mas_k]+ "]");
    float $uvNum[] = `polyEditUV -q `;
    float $Ucoord;
    float $Vcoord;
    $Ucoord = $uvNum[0];
    $Vcoord = $uvNum[1];
    float $cFl_1[0] = `colorAtPoint -u $Ucoord -v $Vcoord file_karta2`;
    if ( $cFl_1[0]!= 0)
    {
    $mas_temp = `ls -sl`;
    //здесь в первый массив записывается имя UV-кординаты, а во второй соответствующая ей высота умноженная на коэффициент
    $mas_face[size($mas_face)] = $mas_temp[0];
    $mas_hight[size($mas_hight)] = $cFl_1[0]*$mas_index;
    }
    }
    //этот цикл по очереди выделяет точки вернувшие нечерный цвет после чего смещает их вверх с учетом коэффициента
    for ($mas_j= 0; $mas_j<size($mas_face); $mas_j++)
    {
    //выделил UV-кординату
    select -r $mas_face[$mas_j];
    //конвертировал выделение в Vertex
    ConvertSelectionToVertices;
    //сместил вверх на соответствующее значение
    move -r -os 0 $mas_hight[$mas_j] 0 ;
    }

    //уберем мусор ;)
    clear $mas_face;
    clear $mas_uv_num;
    clear $mas_uv_num;
    clear $all;
    clear $mas_nameOBj;
    clear $mas_hight;
    if ($mas_yes == 1)
    {
    confirmDialog
    -title "Obuchenie"
    -message "Ну вот и все! Благодарю за ожидание! ;)";
    }
     
Модераторы: Dark™, Skif

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