Добавлен , опубликован

Источники света

Содержание:

Глобальное освещение

Основы

Все объекты видны в игре потому что их все освещает модель глобального освещения, ее еще называют DNC (Day Night Cycle). Модель глобального освещения это обычная моделька которая содержит источник света, а то и несколько источников (чего я не встречал нигде).
Дефолтные модельки находятся по пути Environment\DNC в поддиректориях, например:
Environment\DNC\DNCLordaeron\DNCLordaeronTerrain\DNCLordaeronTerrain.mdx
Environment\DNC\DNCLordaeron\DNCLordaeronUnit\DNCLordaeronUnit.mdx
Как видно тут у нас для определенного типа ланда используются 2 модели освещения, одна заканчивается на Terrain, другая на Unit:
  1. Terrain - эта модель освещает только ландшафт и воду;
  2. Unit - эта модель освещает все объекты в игре.
Если глянуть на внутренности модельки, увидите там один единственный источник света:
Version {
	FormatVersion 800,
}
Model "DNCLordaeronUnit" {
	NumLights 1,
	BlendTime 150,
	MinimumExtent { 0, 0, 0 },
	MaximumExtent { 0, 0, 0 },
	BoundsRadius 0,
}
Sequences 1 {
	Anim "Stand" {
		Interval { 333, 60333 },
		MinimumExtent { 0, 0, 0 },
		MaximumExtent { 0, 0, 0 },
		BoundsRadius 0,
	}
}
GlobalSequences 1 {
	Duration 0,
}
Light "FDirectSun" {
	ObjectId 0,
	Directional,
	static AttenuationStart 80.0,
	static AttenuationEnd 200.0,
	static Intensity 1.2999999523162842,
	Color 8 {
		Hermite,
		333: { 0.799191, 0.532794, 0.313408 },
			InTan { 0, 0, 0 },
			OutTan { 0.196887, 0.223073, 0.313408 },
		13667: { 0.996078, 0.755867, 0.626817 },
			InTan { 0.196887, 0.223073, 0.313408 },
			OutTan { 0, 0.240211, 0.369262 },
		15333: { 0.996078, 0.996078, 0.996078 },
			InTan { 0, 0.240211, 0.369262 },
			OutTan { 0, 0, 0 },
		15367: { 0.996078, 0.996078, 0.996078 },
			InTan { 0, 0, 0 },
			OutTan { 0, 0, 0 },
		43700: { 0.996078, 0.996078, 0.996078 },
			InTan { 0, 0, 0 },
			OutTan { 0, 0, 0 },
		45367: { 0.996078, 0.996078, 0.996078 },
			InTan { 0, 0, 0 },
			OutTan { 0, -0.147828, -0.324197 },
		48567: { 0.996078, 0.848251, 0.671882 },
			InTan { 0, -0.147828, -0.324197 },
			OutTan { -0.196887, -0.315457, -0.358473 },
		60333: { 0.799191, 0.532794, 0.313408 },
			InTan { -0.196887, -0.315457, -0.358473 },
			OutTan { 0, 0, 0 },
	}
	static AmbIntensity 0.30000001192092896,
	AmbColor 9 {
		Hermite,
		333: { 0.799191, 0.532794, 0.313408 },
			InTan { 0, 0, 0 },
			OutTan { 0.166639, -0.010447, 0.154114 },
		13733: { 0.96583, 0.522347, 0.467523 },
			InTan { 0.166639, -0.010447, 0.154114 },
			OutTan { 0.0145619, 0.317505, 0.37233 },
		15333: { 0.980392, 0.839852, 0.839852 },
			InTan { 0.0145619, 0.317505, 0.37233 },
			OutTan { 0, 0, 0 },
		15367: { 0.980392, 0.839852, 0.839852 },
			InTan { 0, 0, 0 },
			OutTan { 0, 0, 0 },
		43700: { 0.980392, 0.839852, 0.839852 },
			InTan { 0, 0, 0 },
			OutTan { -0.0775508, -0.317505, -0.203499 },
		45433: { 0.902841, 0.522347, 0.636354 },
			InTan { -0.0775508, -0.317505, -0.203499 },
			OutTan { 0, 0, -0.266795 },
		46733: { 0.902841, 0.522347, 0.369559 },
			InTan { 0, 0, -0.266795 },
			OutTan { 0.0629889, 0, -0.108385 },
		48333: { 0.96583, 0.522347, 0.261174 },
			InTan { 0.0629889, 0, -0.108385 },
			OutTan { -0.166639, 0.010447, 0.0522348 },
		60333: { 0.799191, 0.532794, 0.313408 },
			InTan { -0.166639, 0.010447, 0.0522348 },
			OutTan { 0, 0, 0 },
	}
	Rotation 1 {
		DontInterp,
		GlobalSeqId 0,
		333: { 0.3815389, -0.21586396, -0.4425869, 0.78227085 },
	}
}
PivotPoints 1 {
	{ 30.4879, -24.1937, 444.411 },
}
Рассмотрим модель DNCLordaeronUnit приведенную выше.
  • У нее есть одна анимация Stand длиною в 60000 кадров - она условно содержит инфу о смене дня и ночи, это можно понять по анимации цвета Color и AmbColor.
  • Есть зачем-то глобальная анимация с длиною в 0 кадров, через нее осуществляется поворот источника света Rotation на привычный игроку угол. Непонятно на кой хрен это сделано когда можно через анимацию Stand. В DNC кстати глобалки полноценно не работают.
  • Сам источник света почему-то расположен в {30.4879, -24.1937, 444.411} судя по PivotPoints. Конкретно в DNC это не имеет смысла, ведь такие модели обычно используют тип источника Directional или Ambient.
  • В остальном это обычный направленный источник света. Использует анимацию цвета для имитации суточного освещения.
На счет 60000 кадров, условно делятся так:
  • 0 - 15000 : ночь → утро
  • 15000 - 45000 : утро → день → вечер
  • 45000 - 60000 : вечер → ночь
Для смены DNC во время игры используют функцию SetDayNightModel
native SetDayNightModels takes string terrainDNCFile, string unitDNCFile returns nothing
// Пример
call SetDayNightModels("war3mapImported\\DNCTerrain.mdx","war3mapImported\\DNCUnit.mdx")

Примеры

Будем создавать DNC с нуля. Для дальнейших опытов сделаем костяк нашей модели - в RMS Twilac Edition через File - New откроется окошко создания модели, назовем ее DNC, остальные поля оставим дефолтными.
Дальше мы будем работать только на вкладке Model. Можем зайти в корень модельки и занулить такие значения как Minimum Extent, Maximum Extent, Bounds Radius, они нам не нужны.
Как видим по умолчанию создалась анимация Stand (в Sequences), проделаем с ней те же действия и установим ей длительность на 60000 кадров.
Так же автоматически была создана кость Root (в Nodes), можно ее удалить нажав на Delete, нам кости вообще не понадобятся.
Добавим источник света через Add - Light. Можем сразу же изменить AttenuationStart и AttenuationEnd на 80 и 200 чтобы не нарушать традиций.
Костяк готов, можем приступать к тестам. Будем использовать одну и ту же модельку при вызове SetDayNightModel - как для ланда, так и для объектов.

Окружающий свет (Ambient)

Тип Ambient сам по себе обычно не используется ибо является частью типа Directional, но если мы хотим использовать в источнике только окружающее освещение, то для наглядности его можно применить.
Для этого типа имеет смысл изменять значения AmbIntensity (в DNC обычно от 0 до 1) и AmbColor.
Устанавливаем в DNC тип источника на Ambient и поехали.
1) Статический свет:
Создадим 3 модельки на основе нашей DNC, по одной для каждого цветового канала. Они будут имитировать что-то типа фильтра на камере, вроде ночного видения и т.п.
AmbIntensity в каждой из моделек установим на 1.
AmbColor установим соответственно на красный, зеленый, синий.
DNC_1
DNC_2
DNC_3
2) Динамический свет:
Совместим 3 модельки выше в одну, сделав линейный переход между цветами и интенсивностями. Т.е. красный будет плавно переходить в зеленый, зеленый в синий, синий в красный, и так по кругу. Интенсивность сделаем максимальной на пике перехода и минимальной на середине перехода.
Создадим модель DNC_4 на основе нашей DNC.
Чтобы сделать значение поля динамическим нажимаем под ним на Make Dynamic, у нас чуть изменится структура. Тип интерполяции ставим Linear (чисто для примера, можно какой вам угодно), и вводим значения:

Направленный свет (Directional)

Тип Directional в DNC используют в подавляющем большинстве случаев.
Для этого типа имеет смысл изменять значения Intensity (в DNC обычно от 0 до 2) и Color, AmbIntensity (в DNC обычно от 0 до 1) и AmbColor, а так же Rotation.
Тут можно применять всё то что проделали выше с типом Ambient, но мы пойдем чуть в другую степь.
Устанавливаем в DNC тип источника на Directional и поехали.
1) Направление света:
Создадим на основе DNC модель DNC_5 - она будет менять свой вектор направления света, как бы имитируя движение небесного светила по небосводу (это правда не похоже на реальное движение, если конечно вы не на полюсе живете).
Intensity установим на 1,3.
Color установим на белый.
AmbIntensity установим на 0,2.
AmbColor установим на белый.
Rotation возьмем значение {0.381539, -0.215864, -0.442587, 0.782271} со стандартной DNCLordaeronUnit которую мы рассматривали в самом начале статьи.
Для удобства вращения источника света можно привязать его к хелперу и вращать сам хелпер. Добавляем его через Add - Helper, затем в источнике света нажимаем на кнопку change и устанавливаем родителем хелпер. В Rotation хелпера прописываем значения (он 2 раза обернется вокруг своей оси за цикл):
2) Количество источников:
Создадим на основе DNC модель DNC_6 - в принципе она будет делать то же самое что и DNC_5, но в ней будет 2 источника света направленных друг на друга. Сделаем первый красного цвета, а второй синего, чтобы лучше различать их.
Intensity в каждом источнике установим на 1,6.
AmbIntensity в каждом источнике установим на 0,05 (чтобы грани которые не получают направленного света не были полностью черными).
Color установим на красный для первого и синий для второго.
AmbColor установим на красный для первого и синий для второго.
Rotation в первом впишем {0.381539, -0.215864, -0.442587, 0.782271}, а во втором {-0.381539, 0.215864, -0.442587, 0.782271} (тут как видите пару знаков только поменялись, если интересно можете почитать за кватернионы).
Далее создадим и отредактируем хелпер точно так же как делали это в DNC_5 и привяжем к нему оба источника.

В тестовой карте можно попереключать все эти DNC.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
18
Хм, изображения почему-то в макетной сетке не отобразились. Или они должны быть меньшего размера для этого?
8
Очень полезная механика, добавляющая атмосферности карте. Использую в своей мапе cruiser command, хочу поделится фишками.
  1. изменять освещение можно у локального игрока. Например один игрок находится в подземелье, а другие на поверхности.
  1. при отсутствии освещения круто смотрится фонарик в руках юнитов.
Модели "солнца" и фонарика прикрепил, может кому пригодятся.
23
Ох я намаялся с этими источниками, в своё время, чтоб более менее реалистичный свет сделать... но статья полезная, спасибо, хоть ничего нового не почерпнул.
И да, можно делать их и в war3me, только нужно чтоб там была 1 вершина, материал и пустая текстура. Это чтоб сохранить в mdl а потом пересохранить через mdlvis в mdx и не поломать ничего )
Чтобы оставить комментарий, пожалуйста, войдите на сайт.