суббота, 22 мая 2010 г.

Creating Grass Field with Mental Ray Proxy

               Здесь я бы хотел рассказать о методе создания травы в Maya.
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/ - Некоторые ответы на вопросы
и другие, но в основном это Мауа 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

1 комментарий:

  1. Да кстати в скрипте было бы неплохо еще и зарандомить размер травки)
    Подробнее про случайные функции в Мауа тут
    http://caad.arch.ethz.ch/info/maya/manual/UserGuide/Express/ExpressFunc.fm9.html

    ОтветитьУдалить