Render.ru

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

Slavenin

Активный участник
Рейтинг
12
#1
В качестве идеи для написания был взят урок по 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;


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

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

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#2
попробовал.. фигня получается..
задает вопросы. и сколько бы я не вводил получается одно и тоже.
мауа 2008
 

Вложения

Slavenin

Активный участник
Рейтинг
12
#3
прошу прощения, опечатался в конце

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

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

должно быть

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

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

Вложения

Slavenin

Активный участник
Рейтинг
12
#4
кстати крайне желательно чтобы карта разбиения имела только черный и белый цвет, в таком случае достигается самый лучший результат
 

Slavenin

Активный участник
Рейтинг
12
#5
2Skif отпишись, пожалуйста, заработало или нет.

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

Dark™

Модератор форума
Команда форума
Рейтинг
431
#6
Интереснее было бы, если код работал с исходной текстурой высот, адаптивно подстраиваясь под степень детализации карты на единице размера.
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#7
да получилось, но честно говоря как то странно.. разбил то норм. но вот выдавил на высоту не очень то.. то есть выдавил ту же четно белую мапу... я так понял там 2 скрипта в одном?
текст вообще не отображается. это видно на втором скрине моего предыдущего поста.
кстати не поучилось разбить повторно.. для большей детализации
 

Slavenin

Активный участник
Рейтинг
12
#8
хм, честно говоря не совсем понял...т.е. подстраивался под разрешение текстуры, сравнивал его с размером объекта и в соответствие с этим устанавливал коффициент высоты?

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

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

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

Slavenin

Активный участник
Рейтинг
12
#9
Версия 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 поддерживается?
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#10
да нет.. вот смотри.. разбиение происходит по карте 1. см аттачи
а выдавливать то надо по карте 2.
 

Вложения

Dark™

Модератор форума
Команда форума
Рейтинг
431
#11
PS здесь можно файлы прилеплять как-нибудь?
Можно только хз, есть ли у тебя эта форма
Да, ет у всех точно есть.

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

Slavenin

Активный участник
Рейтинг
12
#12
именно такое, ну или очень похоже разбиение должно получится, я наверно плохо объяснил, все места на карте высот, которые нечерные на карте для разбиения должны быть белые

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

Вложения

Slavenin

Активный участник
Рейтинг
12
#14
фэйсы бъются командой Add Division, причем все фэйсы вернувшие нечерный цвет разбиваются одновременно и порой действительно возникают такие места, как от них избавится я, честно говоря, не знаю :)
 
Рейтинг
34
#15
Кстати - для собственно дисплейса можно написать плаг, он маленький совсем. возникнут грабли с совместимостью, зато скорость работы повысится.
 

Slavenin

Активный участник
Рейтинг
12
#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;
 

Slavenin

Активный участник
Рейтинг
12
#17
поправил возможный косяк с неправильным смещение точек

//часть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;
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#18
хмм... щас немного занят но постараюсь протестировать ближе к выходным
 

Slavenin

Активный участник
Рейтинг
12
#20
введен режим обучения и возможность отключить планар мэп (может пригодится если текстура назначена на сложный объект с собственной разверткой)

//все упростилось теперь скрипт все делает за вас ;)
//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 "Ну вот и все! Благодарю за ожидание! ;)";
}
 
Сверху