Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
vitacite

Делаем дерево для нашей карты.

Recommended Posts

Делюсь опытом, как  я сделал дерево для своей карты.

 

Как подотопного я выбрал тополь из Stalker.  Для начала создаем папку проекта.. путь это будет в моем случае. 

P:\vwe\zone\misc\Tree - для моделей и 
P:\vwe\zone\misc\Tree\Data - для материалов и текстур.

Портируем его в 3D max.. из Stalker (как это делать есть много гайдов на ютубе) в данной теме обсуждать это не будем.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

Выделяем нужный лод и сохраняем его в FBX формата 2010...

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

и делаем его импорт в ObjectBuilder....

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Сетка дерева у нас есть. Теперь слева в списке мы видим текстуры которые нам необходимо переписать к себе.

В нашем случае их две 

trees_bark_sux_mox.dds - ствол тополя покрытый мхом и 
trees_vetkagreen1.dds - зеленая ветка тополя (из которой потом сформируется крона).
// Чтобы изменить название и пути к текстурами, ОДИН раз кликаем на текстуре в списке слева зажимая CTRL (срабатывает с задержкой)

Как вы обратили внимание, обе в формате *.dds, переписываем текстуры в папку Data нашего проекта.. и с помощью textview приводим их в формат *.tga либо *.paa, кто как привык.

Далее будет важный момент....

 

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

(что такое шейдеры - тут https://ru.wikipedia.org/wiki/Шейдер

 

Текстуру trees_vetkagreen1.dds конвертируем в *.paa и сохраняем под именем trees_vetkagreen1_leaves_ca.paa - суффикс (перфикс)  _leaves - должен быть обязательно так же, как и суффикс _ca именно в такой последовательности. Первый дает понять движку, что это крона дерева, второй _ca что используется прозрачность.  Все что находится до них (trees_vetkagreen1_ в моем случае)  можете называть, как вам больше нравится 🙂

Далее с помощью фотошопа генерируем из текстуры листьев делаем нормаль и сохраняем ее под именем trees_vetkagreen1_leaves_no.paa (как делать нормаль в фотошопе из картинки я думаю объяснять не нужно.)

 

И создаем материал для кроны нашего тополя. Я пострался объяснить, как понял и в чем разобрался, если вас не устраивает копайте дальше по форуму богемии и в папке с растительностью.

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

ambient[] = {0.07,0.57,0.3,0.57};// умножает значения цвета (цветовая текстура R, G, B, A) поверхности, которая не освещена основным направленным светом.
diffuse[] = {0.8,1.0,1.0,0.75};// умножает значения цвета поверхности, освещенной основным направленным светом.
forcedDiffuse[] = {0.54699993,0.556,0.41599995,0.47}; // используется для иммитации прозрачности часть поверхностного освещения отражаемая в тени..

emmisive[] = {1.5,1.0,0.5,0.25}; // флюрисценция (свечение) в темное время суток
specular[] = {0.034,0.034,0.034,0.2}; // Это часть света, отраженного от поверхности. Зеркальное отражение рассчитывается на вершину или пиксель в зависимости от конкретного шейдера. 
specularPower = 300;

PixelShaderID = "TreeAdv"; //пиксильный шейдер который делает крону вашего дерева собственно кроной 
VertexShaderID = "TreeAdv"; //вертиксный шейдер который делает крону вашего дерева собственно кроной 

plantWind[] = {0.05,0.15,40.95,20.5}; // {скорость ветра, жесткость, плавность, это насколько ветер влияет на растение / направление ветра (1) - только глобальное, 0 все возможные};.

class Stage1
{
	texture = "vwe\zone\misc\tree\data\trees_vetkagreen1_leaves_no.paa"; //текстура нормали
	uvSource = "tex";
	class uvTransform
	{
		aside[] = {1,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,0};
		pos[] = {0,0,0};
	};
};
class Stage2
{
	texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,MCA)";
	uvSource = "tex1";
	class uvTransform
	{
		aside[] = {1,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,0};
		pos[] = {0,0,0};
	};
};
treeColorization[] = {-0.08,-15,2,0}; // влияет на окраску растения точного описания пока не нашел.

class Stage3
{
	texture = "dz\plants\tree\data\t_betulapendula_lod4_dxt5.paa";  /* пока не разобрался что делает, описания нет, визуально влияет на отображение листвы (свет/тень), но и без нее все работает... */
	uvSource = "WorldPos";
	class uvTransform
	{
		aside[] = {256,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,0};
		pos[] = {0,0,0};
	};
};
class Stage4
{
	texture = "vwe\zone\misc\tree\data\trees_vetkagreen1_leaves_windmask_co.paa"; /* текстура определяющая гибкость делается следующим образом поверх текстуры ветки, создается слой и заливается градиентом чем более красный цвет тем больше сгибаемость ветки от ветра, чем более черный тем меньшая сгибаемость. Примеры как она выглядит можно найти в папке DZ на вашем диске P: Суффикс _windmask_co должен быть в названии текстуры обязательно иначе работать не будет.*/
  
	uvSource = "tex";
	class uvTransform
	{
		aside[] = {1,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,0};
		pos[] = {0,0,0};
	};
};

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Для иллюстрации работы windmask, я на примере березы специально поверх текстуры windmask наложил контуры ветки березы (белым цветом), с которой она связана.

 

Второй материал создаем для ствола нашего дерева.  Тут все просто, но обязателен в пристуствии шейдер TreeAdvTrunk

 

#define _ARMA_

ambient[] = {0.02,0.56,0.15,0.15};
diffuse[] = {0.2,0.2,0.2,1};
forcedDiffuse[] = {1,1,1,0};
emmisive[] = {1,1,1,1};
specular[] = {0,0,0,1.0885298e-07};
specularPower = 1;
PixelShaderID = "TreeAdvTrunk";
VertexShaderID = "TreeAdvTrunk";
plantWind[] = {0.05,0.01,0.99,0.5};

class Stage1
{
	texture = "vwe\zone\misc\tree\data\trees_bark_sux_mox_no.paa";
	uvSource = "tex";
	class uvTransform
	{
		aside[] = {1,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,1};
		pos[] = {0,0,0};
	};
};

class Stage2
{
	texture = "#(argb,8,8,3)color(0.5,0.5,0.5,0,MC)"; // чем ближе к единце параметры тем ствол светлее, чем ближе к 0 тем темнее 0.5 средние
	uvSource = "tex";
	class uvTransform
	{
		aside[] = {1,0,0};
		up[] = {0,1,0};
		dir[] = {0,0,0};
		pos[] = {0,0,0};
	};
};

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

C материалами закончили.. теперь займемся геометрией. Для начала сохраняем нашу модель в 

P:\vwe\zone\misc\Tree\t_populus_nigra_01.p3d 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Параметры можно увидеть в NameProperty, геометрию создаем руками обводя контуры дерева. Сильно много полигонов быть не должно, но чем вы сделаете точнее тем лучше.

С нее же делаем viewgeometry и firegeometry. Не забываем выставить массу в геометрии чтобы сквозь деревья не ходили, в firegeometry указываем penetration - для листвы и ствола отдельно.

( dz/data/data/penetration/wood.rvmat  - ствол (при попадании пули летят щепки)...  dz/data/data/penetration/foliage.rvmat - листва - при попадании пули летят листочки)

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

В лод memory так же ставим две точки верхнюю обзываем sound_treelargeleaves - и как понятно она отвечает за шум ветра в кроне дерева... нижнюю

action - я так понимаю, она ответственна за взаимодейтсвия дерева и игрока, поэтому поставил ее на высоте 1 метра от земли..

 

Собтвенно все..

Edited by vitacite (see edit history)

Share this post


Link to post
Share on other sites





В продолжение темы выше.. Создание кустарника...

В той же папке проекта создаем папку Bush. Аналогично с гайдом выше делаем порт понравившегося куста. 

P:\vwe\zone\misc\Bush  - объекты
P:\vwe\zone\misc\Bush\Data - текстуры

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

Аналогично с указанным выше, делаем текстуры и материалы. Разница будет по большей части в свойствах геометрии

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

Профит.

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

Да совсем забыл про 1 лайф-хак.. Дело в том, что модели при портирование в object builder, имеют текстуры только с одной стороны полигона, вторая прозрачная. Что создает неповторимый эффект при вращении модели вокруг своей оси и делает ее несколько "непушистой" поэтому, сразу после подвязки текстур делаем CTRL+A (выделяем все) CTRL + C (копируем в буфер обмена) CTRL + V вставляем в тоже место - W выворачиваем полигоны внутрь. 

Теперь ветку видно со всех сторон и куст приобрел нормальный вид (с кроной дерева необходимо проделать тоже самое ).

 

И еще в каждой модели должен быть обязательно финальный лод.. Представляющий из себя фактически скриншотт модели в 3-х проекциях натянутый поверх трех полигонов

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Смысл этого лода в оптимизации.  Чем вы дальше находитесь от дерева, тем больше деревьев, кустов и тд и тп попадает в поле вашего зрения. Они могут быть совсем мелкими на таком расстоянии, деталей не видно, но полигоны есть и участвуют в сцене нагружая движок.  Поэтому для любой растительность строгое правило - максимальное число лодов по формуле x/2

и последний лод в виде 3-4х полигонов. Как на скрине.

Т.е. например LOD1 = 5000 полигнов LOD2 = 2500 LOD3 = 1250 LOD4 = 625 LOD5 = 5 Если не будет строгого деления на 2 с предыдущими лодами, все будет работать так же ... но переход от лода к лоду будет заметем тем более чем больше отхождение от x/2

Для оптимизации используем модификатор ProOptimizer в 3D Max, (за другие редакторы не скажу, не знаю есть или нет).  Либо склеиваем точки путем mergenear (объединить соседние) в Objectbuilder быстрее но результат ессно корявее.

Последний лод используется для отриссовки массивных сцен - например леса покрывающего холм, находящегося от вас на расстоянии километра.  Несложно подсчитать разницу. В тополе выше 1500 полигонов, холм при плотной засадке вмешает около 100 тыс. деревьев множим... если у нас нет оптимизированного последнего лода получаем сцену в (1500 * 100000) = 150 млн. полигонов.  Если есть (5 * 100000 ) = 500 тыс. полигонов. разницу вы почувствуете сразу. Причем внешне это выглядит одинаково т.к. деталей на большом расстоянии не видно, а вот на FPS повлияет значительно.

Edited by vitacite (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.