WarCraft 3: Часть II: Particle Emitter 2

War3ModelEditor: создание источников частиц
Нам понадобятся:
Это самый распространённый вид частиц, используемых в варовских моделях, поэтому приступим.
Конечно, необходим пример. Сегодня вы под моим руководством сделаете (по крайней мере, попытаетесь)… огненную эльфийскую лучницу!
  1. Отрываем (как это не странно звучит) W3ME. Заходим в MPQ-браузер («Окна –> Браузер MPQ-архивов»). Жмем «Файл –> War3.mpq» Там открываем лучницу эльфов (Units\NightElf\Archer\Archer.mdx).
Не забудьте её либо экспортировать («Файл –> Экспорт»), либо сохранить («Файл –> Сохранить как»), чтобы потом открыть mdlVis'ом.
  1. Для начала нужно прилепить по источнику огня к двум шарам на концах лука (ну они прям напрашиваются). Так, текстура… Откройте ещё один раз W3ME, там браузер MPQ, вытащите из War3x.mpq текстуру «Textures\Clouds8x8.blp» и киньте ее в папку с сохраненной лучницей.
  1. Жмем «Окна –> Менеджер текстур». Щелчок правой кнопки мыши (ПКМ) вызовет меню. Выберите там «Импорт». В открывшемся окне найдите ту текстуру Clouds8x8.blp, которую вытащили на предыдущем шаге.
  1. Открываем «Окна –> Редактор узлов». Там много костей и прочего. Теперь надо определить, куда прикреплять источники. Для этого воспользуемся mdlVis'ом.
  1. Откройте сохраненную вами модель в mdlVis. Зайдите в редактор анимаций (F3), вкладку "Скелет". Там несложно обнаружить, что те самые шары прикреплены к костям Box12 и Box02. Выбираем Box02, жмем «Двигать».
  1. В W3ME в редакторе узлов находим кость Box02, щелкаем правой кнопкой, выбираем «Создать источник частиц 2». Потом щелкаем правой кнопкой по новому источнику «UNNAMED», там выбираем «Редактировать узел».
  1. Теперь из mdlVis'а в открытое в W3ME окно копируем координаты X, Y и Z соответственно. Потом вместо «UNNAMED» напишите что-нибудь осмысленное (я написал «FireBall1»). Жмем ОК.
Координаты должны быть эти: (-3.92160, -31.97090, 63.99700).
  1. Самое интересное. Теперь сделайте двойной щелчок по FireBall1. Объясняю по порядку:
8.1) Видимость. Список кадров, в которые видимость источника изменяется.
8.2) Частота излучения. Количество генераций (spawn) частиц в секунду.
8.3) Скорость. Скорость полёта. Также влияет на время жизни и дальность полета.
8.4) Кучность. Увеличивает скорость и направляет поток также и в противоположную сторону.
8.5) Широта. Отвечает за угол отклонения частицы - фактически это максимальный угол для вектора случайного отклонения. Максимальное значение - 180 (при нем частицы образуют сферу; при значении 90 - полусферу)
8.6) Ширина/Длина. Дело в том, что частицы появляются в плоском прямоугольнике. Это его длина и ширина.
8.7) Рендеринг. Там указывается используемая текстура и фильтрация.
8.8) Сегмент 1-3. Переход между цветами (напр, огонь – красный-оранжевый-желтый). Цвет, альфа (видимость: 255 – видно полностью, 0 – не видно), масштаб (размеры частиц данного цвета).
8.9) Голова/Хвост (появление/затухание). Появление и исчезание головы и хвоста (см. далее). Начало/конец – на каком расстоянии от центра; Повтор – кол-во повторов. Хотя как это работает и какая разница между разными значениями, непонятно…
8.10) Флаги:
8.10.1) Незатуманенный – на него не влияют источники света (он всегда освещен) – NETRAT поменял названия «незатуманенный» и «незатененный» местами…
8.10.2) Незатененный – это значит, что он будет виден сквозь туман войны (задается в параметрах карты). Также на него не накладывается затеняющий фильтр при открытии меню.
8.10.3) Альфав стандартных моделях не встречал
8.10.4) Линейный излучатель – излучает только в плоскости YZ
8.10.5) Sort primitives far Z – указывает движку War'а на то, что частицы нужно отображать в порядке "от дальней к ближней" (иначе они рисуются в произвольном порядке). Обычно указывается при создании эффекта лёгкого дыма (фильтр Blend). Для тех же целей используется параметр "PriorityPlane".
8.10.6) Model Space. На источник не действует движение – он как бы в невесомости.
8.10.7) XY квадрат - излучает квадраты (плоские то бишь) в пл-ти ХУ
8.10.8) Струя. Параметр используется для создания реалистичных взрывов (и во "взрывных" моделях War попадается часто). Он влияет на анимацию частиц и учитывается War'ом, только если "EmissionRate" (частота излучения) источника анимирована, а тип контроллера анимации - Bezier. В этом случае в ключевых кадрах частицы появляются очень резко и кучно. В остальных случаях параметр игнорируется.
8.10.9) Голова. Если не устанавливать галку на «Струя», она идет по умолчанию, так что ей галку можно не ставить. Частицы просто отдаляются от центра без деформации.
8.10.10) Хвост. Тут частицы растягиваются, т.е. она остается прикреплена к центру, но при этом тянется до места исчезновения.
Если поставить одновременно «Голова» и «Хвост», сначала будет растянутая частица, а за ней обычная.
Поставьте значения, как на скрине 1. В видимость запишите
199333: 0
Теперь скопируйте этот источник (ПКМ –> Дублировать) и с помощью нажатия ПКМ в выбирания там «Вверх», «Вниз», «Вправо», «Влево» сделайте этому источнику родительской кость Box12. Из mdlVis'а вставьте копии источника новые координаты.
Они должны быть (-3.92160, 74.16950, 64.32700).
Я назвал этот источник «FireBall2».
Также придется открыть свойства двойным щелчком и выбрать текстуру (так как она сбрасывается). Огонь на шарах готов. Теперь можно дублировать каждый из источников и сделать в настройках размеры частиц поменьше. Это нужно для того, чтобы огонь оставлял за собой след при движении (в этом случае у больших поставьте галку на Model Space, а у маленьких - не ставьте).
Примечание: эти два источник можно прикрепить и к кости Cylinder02, но тогда придется нажать правой по источнику, там выбрать «Редактировать узел» и поставить галку на «Billboarded» (т.е. участок будет всегда повёрнут лицевой стороной к пользователю). Я сделал именно так (см. скрин 2).
Теперь сделаем огненную тетиву.
В mdlVis’е видно, что тетива прикрепляется к костям Box01 и Mesh03.
Щелкните по Box01 правой кнопкой мыши и создайте новый источник. В координатах запишите координаты кости-родителя (-3.66772, -24.3604, 67.1364). Галки не ставьте. Также щелкните там по кнопке «Поворот», затем ОК. Потом объясню. Теперь списывайте со скрина 3, пока никто не видит… У меня это «FireLine1»
Дублируйте источник и присоедините его к Mesh03. Настройте текстуру. В координатах – координаты родительской кости (-3.66772, 68.1433, 66.836). Щелкните по кнопке «Поворот», потом ОК. Это «FireLine2». Готово, но одна проблема – распространение частиц направлено вверх…
Беда в том, что поворот в W3ME настроить нельзя (он как-то криво работает – перед тем, как в окне «Поворот» вы нажали ОК, там стояли координаты { 0, 0, 0, 1 }, а после этого - { 0, 0, 1, 0 }, хотя ничего не меняли…), поэтому придется это настраивать с помощью блокнота. Сохраните модель в *.mdl. (я сохранил как «FArcher.mdl»).
Теперь вернёмся к mdlVis'у. В редакторе анимаций выберите кость Box01 в поверните её в плоскости YZ на -90 градусов, а кость Mesh03 – на 90. Это надо будет для поворота источников. Сохраните эту модель как-нибудь типа 1.mdl (смотрите не перепишите модель из W3ME!!!). Откройте 1.mdl в блокноте и в поиске (Ctrl+F) найдите «Box01». Там в блоке поворотов самая первая строка будет
0: { -0.7071067, 0, 0, 0.7071068 }
Это результат недавнего вращения кости. То же самое с Mesh03. Там строка отличается на один «минус»:
0: { 0.7071067, 0, 0, 0.7071068 }
Теперь откройте FArcher.mdl и там найдите через поиск «Line1». Он найдет источник «FireLine1». В нем будет блок поворотов (Rotation), который вписался благодаря тому, что вы нажимали «Поворот –> ОК». Так бы пришлось создавать вручную, но зачем это нужно? В блоке написано
0: { 0, 0, 1, 0 }
Нужно все координаты заменить на { -0.707107, 0, 0, 0.707107 }, но если заменить только в нуле, при первой же анимации они восстановят начальное положение, птму надо менять для каждой анимы. В mdlVis’е перебирайте все анимации по очереди и записывайте начальный кадры, присваивая им нужные координаты. В итоге должно получиться так:
…
ParticleEmitter2 "FireLine1" {
	ObjectId 62,
	Parent 21,
	Rotation 12 {
		DontInterp,
		167: { -0.707107, 0, 0, 0.707107 },
		1500: { -0.707107, 0, 0, 0.707107 },
		3667: { -0.707107, 0, 0, 0.707107 },
		7467: { -0.707107, 0, 0, 0.707107 },
		11500: { -0.707107, 0, 0, 0.707107 },
		15933: { -0.707107, 0, 0, 0.707107 },
		17100: { -0.707107, 0, 0, 0.707107 },
		18267: { -0.707107, 0, 0, 0.707107 },
		34333: { -0.707107, 0, 0, 0.707107 },
		39733: { -0.707107, 0, 0, 0.707107 },
		46667: { -0.707107, 0, 0, 0.707107 },
		99333: { -0.707107, 0, 0, 0.707107 }
	}
Additive,
…
Для FireLine2 будет то же, но только без «минусов»:
...
ParticleEmitter2 "FireLine2" {
	ObjectId 62,
	Parent 21,
	Rotation 12 {
		DontInterp,
		167: { 0.707107, 0, 0, 0.707107 },
		1500: { 0.707107, 0, 0, 0.707107 },
		3667: { 0.707107, 0, 0, 0.707107 },
		7467: { 0.707107, 0, 0, 0.707107 },
		11500: { 0.707107, 0, 0, 0.707107 },
		15933: { 0.707107, 0, 0, 0.707107 },
		17100: { 0.707107, 0, 0, 0.707107 },
		18267: { 0.707107, 0, 0, 0.707107 },
		34333: { 0.707107, 0, 0, 0.707107 },
		39733: { 0.707107, 0, 0, 0.707107 },
		46667: { 0.707107, 0, 0, 0.707107 },
		99333: { 0.707107, 0, 0, 0.707107 },
	}
Additive,
…
Внимание! Если в строке «Parent» у вас стоит другое значение, не меняйте его!
Вернитесь в начало файла в блок текстур и измените «Clouds8x8.blp» на «Textures\Clouds8x8.blp», чтобы Вар использовал стандартную текстуру.
Ну а теперь последний штрих – горящие глаза.
В mdlVis'е выберите треугольники, которые текстурируются как левый глаз. У меня получилось так:
(3.94080, -1.97630, 92.70400)
Координаты правого глаза, не задумываясь, принимаем за (3.94080, 1.97630, 92.70400), т.к. модель симметрична относительно XOZ
Глаза движутся вместе с головой, а голова прикреплена к кости «Head mesh», так что создаем на ней источник частиц. Пишем координаты левого глаза, ставим «Billboarded» и жмем ОК. Воруем информацию с 4-ого скрина. Дублируем источник, изменив название и стерев «минус» у координаты Y.
Последний скрин иллюстрирует результат.
Тихо радуемся…
Ну вот. Пока хватит)

Просмотров: 10 064

FlameSword #1 - 7 лет назад 2
Wulfrein, огромное спасибо за статью) очень помогла))
ShamaN26 #2 - 7 лет назад 1
Да, статья хорошая, жаль что я её так поздно нашёл...
Zahanc #3 - 5 лет назад 0
Как сделать так, чтобы частицы появлялись не во всех кадрах, а только в определенный момент? Ответ — скрывать в нужный момент кость, к которой крепятся частицы. Для этого можно использовать MdlVis.
P. S. Я написал это, на случай если у кого-нибудь возникнет такая же проблема, какая возникла у меня. В статье я этого не нашел.
Стратег #4 - 4 года назад (отредактировано ) 1
Подскажите пожалуйста, как сделать , чтобы частицы не были квадратными, а то у меня куча квадратиков летает:)
Вот скриншот
Мне нужно, чтобы не было квадратов и чтобы частицы не отлетали далеко, что для этого нужно, какие параметры за это отвечают?
прикреплены файлы
Zahanc #5 - 4 года назад (отредактировано ) 0
Чтобы не было квадратов нужно текстуру подходящую подобрать. А какие параметры за что отвечают легко определить методом тыка в War3ME. Я так и разобрался, но уже забыл.
Стратег #6 - 4 года назад 1
Действительно, изменил текстуры на ту, что предложена здесь (т.е. клауд) и действительно квадраты исчезли. Но прошлая текстура тоже являлась какой-то текстурой для эффекта, в том эффекте нету квадратов, хоть он и использует эту же текстуру. В чем же дело?
Zahanc #7 - 4 года назад 0
Эффекты разные бывают. Видимо в данном случае поддерживается только определенное разрешение текстуры.
Tiodor #8 - 4 года назад (отредактировано ) 0
проблема в том, что ты установил неверное значение рядков и колонок
колонки эти... в общем если это одно изображение то там должно стоять 1 и 1
если их там 3х4, то ставишь соответственно
Стратег #9 - 4 года назад (отредактировано ) 2
Ах
Действительно, ты прав Тиодор, спасибо большое за помощь, и тебе, bladget, спасибо
У меня еще вопрос появился:). Если кому-то не трудно ответить, то отпишитесь.
Вот я сделал посох. Посох сияет (правда не весь, а только шар на конце). Посох я прикрепляю к руке модели, а модель уже анимированна. Во время игры модель шатает рукой, посох шатается вместе с ней, но сияние всегда на одном месте(что, в общем, не удивительно). И мне бы хотелось узнать, как сделать, чтобы эффект следовал за посохом, а точнее за рукой, ведь она совершает анимацию.
Tiodor #10 - 4 года назад (отредактировано ) 0
в одном месте относительно модели или движется вместе с посохом, но не идет шлейф за ним?
Стратег #11 - 4 года назад 0
Что ты подразумиваешь под шлейфом, а то я не понимаю). Эффект находится постоянно на одном месте, если юнит передвигается, то и эффект передвигаться, но он не следует за посохом, когда юнит им болтает, просто в воздухе висит.
God_of_light #12 - 4 года назад (отредактировано ) 0
Стратег, ты случайно не ставил галочку Model Space? вроде бы она и дает такой эффект
Tiodor #13 - 4 года назад 0
еще может быть, что ты не прикрепил кость, к с эффектом к модели
Стратег #14 - 4 года назад (отредактировано ) 0
не, model Space не стоит. Ну все, я разобрался, я в анимациях связал эффект с рукой и теперь эффект передвигается за посохом (только долго исчезает, ну с этим я разберусь). Благодарю за помощь.
Еще возник вопрос. Эффект теперь передвигается за посохом, но он немного не успевает, как будто огонь. Но у меня сияние и оно должно исходить точно из шара на конце посоха. Как мне сделать так, что сияние поспевало за шаром на посохе? А то получается: шар на середине пути, сияние отстает и до сих пор внизу, шар достигает макс. высоты, сияние посередине, шар обратно на середину, сияние только дошло до верха, шар внизу, сияние только по середине. Я уже все параметры перекопал, не могу найти ничего оптимального, может кто знает ответ на мой вопрос?
God_of_light #15 - 4 года назад 0
Стратег, попробуй сделать почаще эмиссию, а время жизни частиц поменьше