всем добра =)
menu
person
Главная » Файлы » Уроки » Уроки по MMD

Получите полный контроль над эффектами MME, редактируя файлы .fx

Описание:

Как мне получить доступ к MME-эффектам? Как настроить эффекты MME для большей гибкости? Как я могу настроить параметры эффекта? Каким образом я могу изменить эффект горелки Beamman?

      Получите полный контроль над эффектами MME, редактируя файлы .fx (это реально и достаточно просто!)

      Итак, вы загрузили новый блестящий эффект Beamman, и теперь вы с нетерпением пытаетесь использовать его в своём видео. Вы прикрепляете его к Dummy Bone, перемещаете его, играете с его настройками Si и Tr ... но по некоторым причинам это не совсем то, что вы ожидали. Это наверняка выглядело более роскошным на NikoNiko. Каким-то образом вы чувствуете, что не раскрываете весь его потенциал. И наверняка так оно и есть.

      Каждый эффект имеет в своем сценарии множество частей, с которыми можно работать, что делает его более гибким. Ранее мы научились использовать настройки аксессуара для настройки некоторых внутренних параметров эффекта с панели AMP. Однако этот инструмент ограничен - он имеет ограниченное количество полей, которые можно использовать, и чаще всего большую их часть нельзя использовать, потому что путаница с полями положения и вращения аксессуара может сместить визуальный эффект по нежелательному пути. К счастью, есть способ иметь столько контроля над параметрами .fx, сколько вы пожелаете.

  Нужно посмотреть что "внутри" файла.

   Сегодняшним примером будет эффект Burner от Beamman - загрузите и   откройте файл «burner.fx» в текстовом редакторе. Я выбрал этот эффект, потому что он довольно прост, все его изменения сразу становятся очевидными на экране MMD, и он относительно дружественен по отношению к виду редактирования, который я собираюсь описать. Не стоит переживать, что это сложно.

 

В самом начале скрипта вы можете увидеть следующий код:

// パーティクル数(0~1024)
#define PARTICLE_COUNT 1024
//生成制
float CutSpeed = 0;

//色
//フィルライト色
float3 ParticleColor <
 string UIName = "ParticleColor";
 string UIWidget = "Color";
 bool UIVisible = true;
> = float3(0.1,0.5,1);

//バラけ角度
float particleSpread <
 string UIName = "particleSpread";
 string UIWidget = "Slider";
 bool UIVisible = true;
 float UIMin = 0;
 float UIMax = 360;
> = 120;

//再生スピード
float particleSpeed <
 string UIName = "particleSpeed";
 string UIWidget = "Slider";
 bool UIVisible = true;
 float UIMin = 0;
 float UIMax = 10;
> = 5;

      Строки, начинающиеся с «define», мы пока проигнорируем. Хотя их можно изменить, но нежелательно, поскольку у автора эффекта, возможно, была причина написать именно то что написано =)) Нашей целью является, преобразовать их в полноценные элементы управления. Остальное же интереснее.

      Хотя код может показаться пугающим для тех, кому никогда не приходилось иметь дело с программированием, на самом деле в этом нет ничего сложного. Фактически, каждая из этих частей - просто прославленный способ определения частиц (ну или отображения)  «float particleSpeed = 5» (многие эффекты просто так делают). На самом деле он не оказывает влияния на механизм MME и является просто признаком того, что эффект был создан с помощью какого-либо профессионального инструмента (ну например, NVIDIA FX Composer), а затем скопирован в виде сценария MME с минимальными изменениями. Там (в программе NVIDIA FX Composer) подробные описания, подобные этим, действительно имеют смысл, поскольку они позволяют использовать удобные инструменты для простой настройки их значений. А вот для нашей MME  важны только реальные цифры.

Ну - с, идем дальше "Гори детка, гори =D"

         Загрузите эффект Burner в MMD и проведите некоторое время, играя с этими числами, чтобы лучше понять их назначение. После некоторых экспериментов я понял, что эффект состоит из двух равных пучков частиц (поначалу это может быть трудно заметить, поскольку их соответствующие переменные перечислены в творческом беспорядке), каждый с набором параметров, определяющих их форму. Переменная «icleSpread »определяет угол, под которым эти частицы распространяются от центра эмиссии. Переменная «particleSize» задает не столько физический размер эффекта, сколько интенсивность света в его пучке. Фактический размер определяется значениями «MinMoveSpd» и «MaxMoveSpd», которые устанавливают ограничения на дисперсию длин отдельных частиц. Каждый из них дублируется для двух связок (то есть «particleSpread» и «particleSpread2» и т. Д.).

        Существуют также переменные «ParticleColor» и «ParticleSpeed», назначение которых должно быть очевидным. Если не очевидно, то это цвет и скорость частиц.  («CutSpeed» и «Grv» не используются). Простое редактирование этих переменных в файле .fx позволяет нам формировать Burner так, как нам нравится (а также дает вам более четкое представление о том, какого черта я говорю, на случай, если этот абзац уже начал вызывать у вас головную боль :) ). Однако для того, чтобы по-настоящему контролировать эффект, нам нужно преобразовать их в реальные инструменты, которые будут доступны прямо в MMD. Но как? Их слишком много, для начала!

       Параметр «name» здесь относится к экземпляру тела, к которому прикреплен скрипт .fx. И, как мы привыкли прикреплять эффекты к аксессуарам, оператор имеет доступ только к свойствам аксессуара (в данном случае, к параметру «Размер», предоставляемому AMP), которых немного. Задавая имя * другого * объекта, мы можем также проверить свойства этого другого объекта. И, в отличие от аксессуаров, модели .pmd имеют неограниченное количество элементов, значения которых могут быть доступны и использованы в качестве переменной в скрипте. Для эффекта с большим количеством параметров это может быть большим преимуществом. Мы можем создать фиктивную модель .pmd, добавить к ней несколько именованных элементов, а затем сослаться на их имена в качестве элементов управления нашего скрипта.

      Теперь давайте исправим наш скрипт. Во-первых, мы возьмем простую переменную «particleSpeed» и передадим ей элемент управления. Вместо оригинального описания.

float particleSpeed <
string UIName = “particleSpeed”;
string UIWidget = “Slider”;
bool UIVisible = true;
float UIMin = 0;
float UIMax = 10;
> = 5;

мы определяем это так:

float particleSpeed : CONTROLOBJECT < string name = “burnerControl.pmd”; string item = “Speed”; >;

       Что это значит? Увидев такую ​​команду, интерпретатор сценариев предполагает, что

   а) где-то среди моделей, загруженных в MMD, есть модель с именем «burnerControl.pmd», и

   б) среди ее костей или морфов (так называемых «маски») есть модель с именем «Speed» ( мы могли бы дать ему то же имя, что и для переменной, но вы бы хотели видеть более понятные заголовки, когда работаете со своим эффектом в MMD). Если бы это была кость, значениями, которые можно было бы из нее прочитать, были бы ее координаты и / или углы поворота. Однако мы будем придерживаться морфов, поскольку MMD предоставляет для них удобные ползунки в панели манипуляции лица.

     Итак: если у нас есть модель «Speed» в модели «burnerControl», ее положение ползунка будет отсканировано в реальном времени и немедленно назначено нашей переменной «particleSpeed».

     Здесь есть оговорка. Из описания «particleSpeed» в нашем исходном скрипте мы можем предположить, что он должен иметь значения в интервале от 0 до 10 (именно поэтому я назвал этот эффект «дружественным». В сценариях, которые дают нам только короткие определения переменных, мы должны * угадать * какие значения они могут принимать). И значение, возвращаемое из ползунка морфинга, может быть только между 0,0 и 1,0. Поэтому нам нужно найти, где эта переменная используется * внутри * скрипта ...

... к счастью, есть только одна такая линия ...

float t = frac(Pos.z + particleSpeed * time_0_X);

 … И измените его, чтобы пересчитать значение, полученное от элемента управления:

float t = frac(Pos.z + particleSpeed * time_0_X * 10);

          Ну-с, теперь баланс восстановлен. Не забудьте удалить оригинальное описание частичек скорости из начальной части. 
         Еще одна вещь, прежде чем мы перейдем к другим переменным. Для наглядности имя объекта управления было включено в нашем примере выше, как буквальное значение. Это нормально, если мы будем использовать его только один раз, но поскольку наш объект будет использоваться для хранения большого количества элементов управления, предпочтительно определить его как отдельный параметр. Поэтому мы немного изменим наше определение:

#define myPmd “burnerControl.pmd”
float particleSpeed : CONTROLOBJECT < string name = myPmd; string item = “Speed”; >;

          Следующий шаг - переменная «particleSize». Процедура та же: замените исходное определение тем, которое использует модель управления (я пропущу этот шаг для остальных переменных, так как он тот же):

float particleSpeed : CONTROLOBJECT < string name = myPmd; string item = “Size“; >;

     Теперь меняем эту строку:

Base.xyz += (Pos.x * 10)*Side*0.1*particleSize;

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

Base.xyz += (Pos.x * 10)*Side*particleSize;

      Меняем это:

particleSpread = particleSpread * 3.14159265/180.0;
particleSpread *= 0.5;

      Принимая во внимание, что ограничение для этой переменной установлено в 360 в исходном описании, я надеюсь, что вас не смущают эти цифры. Все, что нам нужно, это снова удалить ненужные множители:

particleSpread = particleSpread * 3.14159265;

      И две другие переменные фактически используются в одном месте, поэтому мы позаботимся о них обеих:

len = (len*(MaxMoveSpd-MinMoveSpd))+MinMoveSpd;
ret_mat[3].z = -len*t * 10;

      Существует также множество переменных, таких как «particleSize2», «particleSpread2» и т. Д. Единственное место, где они упоминаются, это здесь:

if((idx % 2) == 0)
{
MinMoveSpd = MinMoveSpd2;
MaxMoveSpd = MaxMoveSpd2;
particleSpread = particleSpread2;
particleSize = particleSize2;
}

       Теперь оставшаяся переменная «ParticleColor» немного отличается. Она объявляется как float3, составной тип данных, состоящий из трех чисел (для компонентов R, G и B). HLSL, язык программирования, разработанный специально для создания шейдеров (и с одним эффектом MME, написанным на них), имеет встроенную поддержку для обработки таких специфических типов данных, используемых в графических вычислениях.

       Однако морфы могут возвращать только одно число (технически мы могли бы создать кость для обработки этой конкретной переменной, но это было бы более неудобно по нескольким причинам). Итак, мы создадим три элемента управления вместо одного:

float PcolorRed : CONTROLOBJECT < string name = myPmd; string item = “ColorRed”; >;
float PcolorGreen : CONTROLOBJECT < string name = myPmd; string item = “ColorGreen”; >;
float PcolorBlue : CONTROLOBJECT < string name = myPmd; string item = “ColorBlue”; >;

      … И измените строку, которая использует ParticleColor, соответственно:

col.rgb *= ParticleColor;

     на

col.rgb *= float3(PcolorRed, PcolorGreen, PcolorBlue);

      Это касается изменений, которые нам нужно внести в скрипт, чтобы он слушал наши слайдеры. Сохраните скрипт под другим именем, например, «burnerPro.fx» и сделайте копию «burner.x» с именем «burnerPro.x».

Теперь делаем контролер для нашего эффекта

        Время подготовить руль к нашему эффекту. Запустите PMDE и запустите новую модель. Создайте Примитив (независимо от того, какой именно) и сделайте его невидимым, свернув его размер до нуля. Для фактического эффекта это не имеет значения, оно понадобится только в качестве заполнителя для создания морфов.

       Теперь перейдите в главное окно и выберите вкладку «Expression», щелкните правой кнопкой мыши пустой список и нажмите «New look created» («Morph» и «New morph create» -> «Vertex», если вы не выключили Режим PMX). Появится дополнительное окно «Morph edit - Add new». Сделайте вершины вашей модели видимыми, нажав кнопку «зеленое облако "или травка"» на нижней панели инструментов, выделите их мышью и немного потяните в сторону. Затем нажмите кнопку «Reflection (отрожение)» (метка «Differences» должна измениться с 0 на другой номер) и нажмите «Add New». Поздравляю, ваша модель только что улыбнулась вам первой улыбкой: P.

       Закройте окно морфа, оно вам больше не понадобится. Теперь просто щелкните правой кнопкой мыши на новом морфе в списке и выберите «Replication»  вам понадобится много элементов управления. Начните переименовывать их прямо здесь, в списке. Не забудьте переименовать оба поля на английском и японском - вы будете смотреть на первое при работе с MMD, но именно последнее ищет движок MME. Вот полный список морфов, которые вам нужны (убедитесь, что вы определили элементы управления для каждого из них в сценарии):

ColorRed
ColorGreen
ColorBlue
Speed

Size
Spread
MinMoveSpd
MaxMoveSpd

Size2
Spread2
MinMoveSpd2
MaxMoveSpd2

      Они должны совпадать со значениями параметров «string item» ваших определений, а не с соответствующими именами переменных, используемых в сценарии. Кроме того, вы можете распределять морфы по группам (глаз, лоб, губы, другие) так, как вам удобно. Заполните тег «Model name», чтобы запомнить, что делает модель, когда она отображается в списке, и сохраните модель как «burnerControl.pmd».

       Теперь запустите MMD. Загрузите аксессуар «burnerPro.x» в AMP, затем модель «burnerControl.pmd». Сначала вы не увидите никакого эффекта, потому что в отличие от стандартного Burner, его параметры не инициализируются какими-либо значимыми значениями. Вы должны будете дать его элементам управления некоторые значения, а затем ...

Делай свою магию.

 


ВНИМАНИЕ
1.Если под каким-то файлом Вы не можете найти ссылку на загрузку, то отключите дополнение "АНТИРЕКЛАМА" в вашем браузере
Правила публикации комментариев:
1. Запрещено оскорблять, унижать в грубой форме других пользователей.
2. Мат и грубые слова запрещены, даже в скрытой форме, для этого существуют масса слов которые заменяют мат.

Случайные материалы:

Всего комментариев: 0
avatar