Render.ru

имитация песка!

никита никишин

Активный участник
Рейтинг
11
#1
народ вот хочу попробовать сделать типа пустыни!вообщем просто песок,небольшие пригорки,ямы,вообщем как в пустыне!вот подскажите как сделать такую сцену!тойть как лучше всё это сделать?
 

Slavenin

Активный участник
Рейтинг
12
#2
Могу дать совет :) Береш мой скрипт (тема: "Все разработчикам работающим в Maya, посвящается скрипт", не поленись прочитать целиком ;)) рисуешь карту высот и карту разбиения (в теме подробно описано что это и как сделать) для тех мест где у тебя будут холмы и пригорки. Запускаешь скрипт, он тебе их построит, далее берешь хорушую текстуру песка, в фотошопе быстренько делаешь, карту бампа, на получившийся террэин накладываешь текстуру и бамп. Все.
Если же надо сделать настоящий песок, то осваивай флюиды и частицы :)
 

никита никишин

Активный участник
Рейтинг
11
#6
чувак ваще голова кипит!что мне надо сделать?создать плейн?и включить скрипт?я просто в этом ещё мал!обьясни что к чему!
 

Slavenin

Активный участник
Рейтинг
12
#7
ОК. по пунктам

1 открываешь фотошоп (ну или еще какой графический редактор)
2 делаешь карту разбиения (текстура содержащая только черный и белый цвет), белыми пятнами обозначаешь места где у тебя будут холмы (в теме есть пример, там даж подписано, карта разбиения карта высот и тд), сохраняешь ее где-нить у себя на жестком диске
3 Можно сразу сделать карту высот (текстура содержащая цвета от черного до белого, где белым обозначены самые высокие места, а черным самые низкие, а между ними присутствует плавный переход из отттенков серого цвета)(опять же в теме есть пример), сохраняешь ее на жестком диске
4 загружаешь Майку
5 создаешь плоскость или куб нужной площади
6 переходишь в режим выделения фэйсов и выделяешь нужные\нужные
7 Открываешь скрипт эдитор windows->general editors->script editor
8 из темы копируешь туда сначала первую часть скрипта, как есть (ток без надписи "часть 1") (смотри ближе к концу, сообщение обозвано "глобальный апдейт")
9 выделяешь все (можно нажать CTRL+a) и жмешь Ctrl+Enter
10 появляется окно в котором надо выбрать карту разбиения
11 Появляется еще один диалогв котором надо ввести ось относительно которой будет произведен планар мэп текстуры (скорее всего "у", посмотри какая у тебя ось вверх направлена, увидеть можно в левом нижнем углу), текстура должна появится на поверхности фэйса (не забудь включить режим отображения текстур клавиша 6), если текстура легла криво, значит указал не ту ось, отменяешь все и запускаешь заново, пока не появится нужного результата (подразумевается, фэйс разбитый на 4 части с наложенной на него текстурой)
12 даее удаляешь все из script editor`a
13 копируешь туда вторую часть скрипта и точно также ее запускаешь, в появившемся окошке вводишь количество повторов цикла, первый раз рекомендую от 6 до7, далее, если разбиение не устраивает, не более одного
14 итак получился меш нужного вида разбитый в местах где будут холмы
15 очищаешь скрипт эдитор
16 копируешь туда последнюю, третью, часть скрипта (одно из последних сообщений темы)
17 запускаешь, в появившемся окне выбираешь карту высот
18 ждешь энное количество времени, в зависимости от компьютера и количества разбиений
19 получаешь готовый террэин, но который осталось только наложить текстуру и бамп
20 Снова открываешь фотошоп (ну или что у тебя) и вкорячиваешь туду текстуру песка, жмешь Image->Adjustments->Black&Wite жмешь ОК, фотошоп переведет тебе изображение в битовую карту (хотя что здесь может получится на выходе я ен знаю, очень многое зависит от текстуры, мой тебе совет, поискать в нэте готовую текстуру с картой бампа), сохраняешь как тебе больше нравится, НО НЕ ЗАМЕНЯЕШЬ ИСХОДНУЮ ТЕКСТУРУ
21 Снова открываешь Майку, жмешь Window->Rendering Editors->HyperShade, открывается окно гипершейда, далее двойной щелчок на материале (любом кроме Lambert1), откроется атрибут эдитор для данного материала, напротив атрибута Color жмешь на квадратик со стрелочкой, открывается новое окно назначения текстуры, там жмешь на папочку и выбираешьнужную тебе текстуру
22 в гипершейде снова щелкаешь на материале и в атрибут эдиторе напротив параметра Bump Maping жмешь на квадратик, в открывшемся диалоге выбираешь "file", жмешь ОК
23 откроются опции для бампа параметр Bump Depth ставишь где-то 0,05-0,1
24 у параметра Bump Value жмешь на квадратик со стрелочкой, открывается окно назначения текстуры, снова жмешь на папочку и в появившемся окне выбираешь уже карту бампа, которую в фотошопе делал
25 все запускаешь рендер

На самом деле весь процесс занимает не более 10-15 минут, без учета времени поднятия точек и рендера
 

никита никишин

Активный участник
Рейтинг
11
#8
ой спасибо большое!!блин вот какие неленивы люди есть ещё раз спасибо!!!я тебе оч благодарен!!!но вот у меня к всему этому есть пару вопросов!у тебя в самом начале написано"что надо нарисоватьв фотожопе текстуру чёрным и белым цветом"есле нетрудно можеш кинуть пример этой текстуры?я чесно небуду её тырить!!мне хотябы примерчик как и чего!!втторой вопрос "надо скоприровать скрипт из твоей темы"я новичёк и там полно всяких надписей,а вот что именно за скрипт понять немогу,скинь сюда пожалуйста эти скрипты,конечноже есле нетрудно!!есле конечно ещё раз нетрудно помоги!!я не ленюсь просто невпариваю!а есле поможеш то много чего смогу понять!и вот из того что ты написал я понял много,ещё раз спасибо.Блогадорю!
 

никита никишин

Активный участник
Рейтинг
11
#13
подскажи пожалуйста где находиться инструмент sculpt?и как сделать чтоб было 100 на 100?я тебя просто несовсем понял((((я новичёк и прошу по внятнее!
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#14
никита никишин, мой совет, купить себе книжку и там со всем разобраться. Никто не станет выписывать сюда такие элементарные вещи...
 

никита никишин

Активный участник
Рейтинг
11
#15
почемуже небудет?есле они елементарные их оч просто сюда вписать!есле ты нехочеш вписывать тобы неписал а прмолчалбы!что трудно написать?есле комуто трудно пусть непишит!
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#16
никита никишин, не обижайся. Поверь, что по книге ты поймешь все куда лучше, чем если бы кто-либо стал тут что-то описывать..
 

никита никишин

Активный участник
Рейтинг
11
#18
да я необижаюсь!а те есле нетрудно скажи какую книгу купить?или даже скачать!я просто хочу понять всё это!вот мне нужна книжечка по моделированию,постановки света,и тп и тп!вощем чтоб всё это освоить какую книгу лучше прочитать?
 

Slavenin

Активный участник
Рейтинг
12
#19
Плэйн 100х100 означает плоскостть с количеством разбиений 100 по высоте и 100 по ширине.
Инструмент скульпт можно активировать следующим образом: выбираешь плоскость, жмешь правой кнопкой в появившейся менющке выбираешь Paint->Sculpt, с настройками надеюсь разберешься..., диаметр кисти регулируется параметром радиус, либо интерактивно, зажимаешь клавишу "b"+ левую кнопку мыши и тащишь мышкой вправо или влево.

В качестве начального пособия можешь посмотреть это http://up.li.ru/?id=458476;%EC%E5%F2%EE%E4%E8%F7%EA%E02.rar , просьба сильно не ругать, так как составлял сам, примеров ты там не найдешь, но описания инструментов и основные принципы можно почерпнуть.

Далее примеры всех карт есть в в этой теме http://www.render.ru/forum/viewtopic.php?topic_id=125803 в 12 сообщении, о чем я неоднократно уже писал!!!

Скрипт

со следующей строки копируешь, эт буит первая часть

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;

до сюдова

со след строки вторая часть

//переменная-счетчик для цикла
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;
}

до сюдова

третья часть

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;
 
Сверху