Здесь я бы хотел рассказать о методе создания травы в Maya.
int $density_small = 1.2;
int $xPlot = 24;
int $yPlot = 2;
for($j=0;$j<$yPlot;$j++){
for($i=0;$i<$xPlot;$i++)
{
int $s = rand(99);//randomize Seed for big grass
int $p = rand(99);//randomize Seed for small grass
float $a = rand(0.5, 1.2);//randomize Density for Big Grass
float $b = rand(0.5, 1.2);//randomize Density for Small Grass
setAttr "strokeShapeGrassClump2C.seed" $s;
setAttr "strokeShapeGrassWindNarrow1.seed" $p;
setAttr "strokeShapeGrassClump2C.sampleDensity" $a;
setAttr "strokeShapeGrassWindNarrow1.sampleDensity" $b;
select -r grassClump2Main;
duplicate;
move -r -os -wd (-5+$i*$density_big) 0 (16+14*$j) ;
select -r grassWindNarrow1Main;
duplicate;
move -r -os -wd (-12+$i*$density_small) 0 (16+14*$j) ;
}
}
Proxy Objects - заменяемые объекты. В данном случае имеется ввиду заменяемые объекты во время рэндеринга т.е. программа визуализации загружает внешние объекты (не находящиеся в сцене) и заменяет ими заданные. В большинстве случаев это необходимо когда в сцене много массивных (в смысле многополигональных) объектов, которые сильно грузят память. При этом память загружается только во время рэндеринга и не происходит конвертации, пересчета кода модели-объекта в понятный для визуализатора вид, так как он производиться уже заранее при сохранении Proxy объекта. Возможность создавать Proxy объекты известна уже давно, но только начиная с версии Мауа 2009, создание их перенесено в свойства формы объекта (objectNameShape, к примеру pCubeShape), где находятся только все, так сказать, внутренние характеристики объекта.
Начнем.
С начала создадим пробники травы (samples), которые потом размножим. Для этого на простую поверхность, типа Plane, нанесем несколько штрихов PaintEffect травы, с разными параметрами, ну например сделаем высокую и низкую траву. Затем конвертнем их в полигоны и вынесем за приделы planе-а. Так как созданная группа с полигональными (конвертнутыми) объектами имеет иерархическую связь с PaintEffect Stroke (до тех пор пока не удалена история или объект не скопирован), то изменяя параметры ноды пайнтэффекта мы сможем видеть изменения на полигональном объекте. А после создания его дубликата, зависимость пропадет. Таким образом мы можем создать множество различных копий всего из одного ПайнтЭффекта, что весьма привлекательно. Затем копированием и перемещением мы создадим один кусок "травы" который затем сможем размножить при помощи прокси.
Но такой способ размножения и изменения "сэмпла" травы весьма утомительная задача. Поскольку Мауа является "компилятором" собственного языка MEL (Maya Embedded Language) и любое действие, команда, операция над объектом или изменение параметра может быть записано с помощью этого очень простого скриптового языка со своими особенностями.
Поэтому лучше всего написать небольшой скрипт который поможет это всео сделать автоматически.
Поэтому лучше всего написать небольшой скрипт который поможет это всео сделать автоматически.
Всео, что нам для этого понадобиться это ScriptEditor и включенная опция History - Echo all Command. Дальше находим те параметры которые хотим изменить, изменяем, смотрим их название в панели ScriptEditor и копируем в наш код. В этом примере я выбрал всего два параметра, это плотность отрисовки объектов на PaintEffects Curve (sampleDensity) и их возможные вариации (seed). Можно было выбрать любые другие параметры? даже из свойств построения самих объектов (не нужно забывать что объекты на кривой, это также MEL Script). В общем скрипт такой:
int $density_big = 1.2;int $density_small = 1.2;
int $xPlot = 24;
int $yPlot = 2;
for($j=0;$j<$yPlot;$j++){
for($i=0;$i<$xPlot;$i++)
{
int $s = rand(99);//randomize Seed for big grass
int $p = rand(99);//randomize Seed for small grass
float $a = rand(0.5, 1.2);//randomize Density for Big Grass
float $b = rand(0.5, 1.2);//randomize Density for Small Grass
setAttr "strokeShapeGrassClump2C.seed" $s;
setAttr "strokeShapeGrassWindNarrow1.seed" $p;
setAttr "strokeShapeGrassClump2C.sampleDensity" $a;
setAttr "strokeShapeGrassWindNarrow1.sampleDensity" $b;
select -r grassClump2Main;
duplicate;
move -r -os -wd (-5+$i*$density_big) 0 (16+14*$j) ;
select -r grassWindNarrow1Main;
duplicate;
move -r -os -wd (-12+$i*$density_small) 0 (16+14*$j) ;
}
}
Если у кого то возникают какие то непонятки по синтаксису языка MEL, то я рекомендую, в качестве пособия эти книжки:
The MEL Companion - Maya Scripting for 3D Artists
MEL Scripting for Maya Animators 2Edition
А также эти ресурсы:
http://mayamel.tiddlyspot.com/ (Огромная библиотека, ответы на многие вопросы)
http://ewertb.soundlinker.com/maya.php (Примеры и всео такое)
http://www.scriptswell.net/search/label/MEL (Примеры и ProLevel)
http://www.fundza.com/mel/quickref2/index.html - Доступ к функциям и аттрибутам
http://xyz2.net/mel/ - Некоторые ответы на вопросы
http://www.fundza.com/mel/quickref2/index.html - Доступ к функциям и аттрибутам
http://xyz2.net/mel/ - Некоторые ответы на вопросы
и другие, но в основном это Мауа Help и те две книжки которые я написал выше.
А в 2011 Мауа появилась возможность получать подсказки о командах прямо в ScriptEditor-е, для этого нужно выставить Command - Show tooltip Help.
После использования скрипта, создалось много различных копий, которые теперь необходимо Unparent (так сказать распэрантить), и объединить в один поли-объект (Mesh - Combine). Теперь наш кусок травы готов к созданию прокси объекта. Для этого необходимо его экспортировать (перекодировать) в файл понятный для MentalRay-я. Делается это всео очень просто File - Export Selection - (Filetype) MentalRay - (Export Selection Output) RenderProxy, также можно отдельно указать имя. При этом, экспортируется как сам объект, так и информация о его местоположеня в сцене. НО, по каким то (не понятным для меня) причинам, экспорт этот не будет завершен до тех пор пока мы самостоятельно не применим к экспортируемому объекту нужный материал, в данном случае это материал травы. Тоже самое нужно проделать со вторым объектом.
И так прокси объекты готовы к импорту. Все, что нужно сделать это создать какой либо примитив, который будет символизировать наш прокси объект. Я создаю куб. Дальше в настройках формы объекта, во вкладке mentalray выставляю путь до нашего прокси, после чего объект автоматически примет аппроксимирующую по размерам форму прокси объекта. Затем нажимаем Render Current Frame и вуаля! : )
Но не забывайте что память тоже конечная и количество копий будет зависеть от наличия памяти.
Также могу рекомендовать этот скрипт для создания прокси объектов - http://www.creativecrash.com/maya/downloads/scripts-plugins/utility-external/misc/c/wcreatemrproxy
Да кстати в скрипте было бы неплохо еще и зарандомить размер травки)
ОтветитьУдалитьПодробнее про случайные функции в Мауа тут
http://caad.arch.ethz.ch/info/maya/manual/UserGuide/Express/ExpressFunc.fm9.html