Пользовательская Анимация. — Создание моделей и текстур

Уважаемые коллеги!
Создал эту тему исключительно для FAQ.

У меня вот такой вопрос сложился. Если анимацию по SDK разобрал и делаю без особых проблем, то вот как быть с созданием своей анимации? Например:

Хочется сделать такую фишку(чисто эксперимент — пока).
— В самолете есть некий ящик(коробка и пр.);
— требуется его открыть в VC.

Разумеется тут всякие двери и пр. не подходят. Как разумно обозвать деталь? Что написать в XML? и как правильно откомпилить?

Не хотелось бы разводить флейм в этом топике — давайте делиться опытом :)

PS Пардон что влез. Прикрепляю тему, пмм дело нужное, а значит архимодерируемое. ;) Флей будем вырубать на корню… :huh:

Сообщение отредактировано Yelky-Palky: 26 May 2012 — 23:40

Ответов: 19

Хм, я могу предположить из своего небольшого опыта стояния поблизости со знатоком кастомной анимации, что обозвать ты ее можешь как угодно, лишь бы код написать по смыслу «При нажатии выключателя А откроется ящик Б».

Т.е., совершенно не требуется ящик вешать на переменную f_canopy или любую другую дефолтную симовскую.

В makemdl.parts.xml добавляем код

<part>
<name>MySwitch</name> //�мя детали/части в gmax (любое, можно krishka_yschika или box_cover)
<animation>
<parameter>
<code>(L:MySwitch, bool) 50 *</code> // Сдесь: (L:MySwitch, bool)- переменная ( значения 0 или 1), далее- » X 50 * » надо понимать как » X * 50 «
Результатом Р±СѓРґСѓС‚ числа 0 или 50. Р’ понимании СЃРёРјР° это кадры анимации (например РІ gmax сделаем анимацию: кадр «0» — ящик закрыт, кадр «50»- открыт).
<lag>500</lag> // Скорость СЃ которой будет проигрываться анимация (пример lag=500 — крышка откроется мгновенн, lag=10 — будет открываться медленно)
</parameter>
</animation>
<mouserect>
<cursor>Hand</cursor>
<tooltip_text>MySwitch</tooltip_text> // Всплывающая подсказка — РјРѕР¶РЅРѕ написать РІСЃРµ что СѓРіРѕРґРЅРѕ
<mouse_flags>LeftSingle</mouse_flags> // Тип клика мышкой (можно задать- правой, средней, колесом и т.д.)
<callback_code>(L:MySwitch, bool) ! (&gt;L:MySwitch, bool)</callback_code> // Это то, что произойдет РїСЂРё клике мышкой. Любое арифметическое действие СЃ любыми переменными. Р’ данном примере — РїСЂРё клике поменять значение переменной СЃ 0 РЅР° 1 или обратно (РЅРµ знаю как дословно РІСЃРµ это понимать, РЅРѕ для меня это РЅРµ главное, главное что работает).
</mouserect>
</part>

Р’ gmax делаем часть СЃ именем «MySwitch», делаем ей анимацию РІ 50 кадров.
Экспортируем.
Р’СЃРµ.

Ну, и, конечно же, делаем ящик с анимацией? � надо связать открытие ящика с переключением MySwitch?

Алекс,а можешь подробно обьяснить значение каждой строчки кода?
А то чота я хмл пытался изучать-так ниче и не понял-все туторы пишуться применительно к интернету…

Можно не только писать код вшитый на XML а так
же вызывать анимацию из панели по требованию
Т.е. вы пишете не <CODE> …
а просто <VALUE> дял L: переменной
а дальше используя механизм Named Vars
initalize_named_value,set_named_value и т.д.
( подробности в Panel SDK ) устанавливаете
нужные фреймы анимации либо просто bool — есть нету или
открыто закрыто.

Если это возможно, то тоже самое применительно к внешней модели и с
использованием команд по нажатию клавиш — например, надо
открыть некий люк нажатием клавиши «А».
Заранее спасибо. Дмитрий.

Для того чтобы сделать люк, открываемый клавишей на клавиатуре без использования Gau-прибора, делаем следующее:
1. Вписываем в makeMDL.parts этот код:

<part>
<name>luk</name>
<animation>
<parameter>
<code>
(L:luk,bool) 100 *
</code>
<lag>350</lag>
</parameter>
</animation>
</part>

2. Создаем XML прибор для вашего самолета со следующим кодом и сохраняем его, например, с названием key.xml.

<Gauge Name=»Luk Key» Version=»1.0″>
<Keys>
<On Key=»K»>0
(L:luk,bool) ! (>L:luk,bool)</On>
</Keys>
</Gauge>

3. Правильно прописываем прибор key.xml в Panels.cfg вашего самолета.
4. Создаем в gmax-е запчасть люка, обзываем ее luk и анимируем. На кадре 0 она закрыта. На кадре 100 – открыта. Эту запчасть вы можете разместить, где хотите. (или в виртуалке, или снаружи)
5. Компилируем модель.
6. Выбираем ваш самолет и в 2D панели жмем клавишу K, и ваш люк открывается.

Единственный недостаток – люк открывается только в 2D панели, но его легко убрать прописав этот прибор в виртуалку.

Если вам нужно чтобы люк открывался нажатием клавиши A, то в приборе вместо
<On Key=»K»>0 напишите <On Key=»A»>0

Внимание! При использовании этого прибора дефолтные команды на клавишах не убираются. Например, если вы присвоите действие клавише G, то у вас откроется люк, и выпустится шасси. Чтобы этого не было нужно просто в настройках симулятора с этой клавиши убрать команду.

В следующий раз я напишу как сделать 3D компас и указатель скорости.

С уважением, �лья.

Теперь начнем с создания компаса и указателя скорости.
Компас:
1. Скопируйте этот код в makeMDL.parts
2.
<part>
<name>compass</name>
<animation>
<parameter>
<code>
(A:Wiskey compass indication degrees,degrees) 3.6 /
</code>
<lag>100</lag>
</parameter>
</animation>
</part>

3. В gmax-e создайте цилиндр, назовите его compass, наложите на него текстуру (их можно взять из XML компаса любого самолета), и заанимируйте его так, чтобы на 0 кадре он показывал север, на 50 юг и на 100 опять север.
4. Теперь можно компилировать вашу модель.
5. Если компас будет поттормаживать, то поставьте в секции <lag> не 100, а цифру чуть поменьше, например, 50.

В полете при проходе через север компас может перескакнуть на 360 градусов, но при аккуратной анимации это будет не заметно.
Объясню, код секции <code>.
(A:Wiskey compass indication degrees,degrees) – это параметр, того, что на нужно вывести.
3.6 / — это деление РЅР° 3,6. Параметр делится РЅР° 3,6 потому что максимальная цифра показываемая РЅР° компасе – 360 градусов. Разделив 360 РЅР° 3,6 РјС‹ получаем 100 (количество кадров анимации)

Указатель скорости:
1. В этом примере я расскажу как создать УС-350, но создание других почти аналогично.
2. Впишите в makeMDL.parts это
<part>
<name>us350-strelka</name>
<animation>
<parameter>
<code>
(A:Airspeed select indicated or true,knots) 1.852 * 3.5 /
</code>
<lag>200</lag>
</parameter>
</animation>
</part>
3. Создайте в gmax-e цилиндр, покрасьте его текстурой со шкалой.
4. Создайте в 3D стрелку и назовите ее us350-strelka. Заанимируйте ее так, чтобы на 0 кадре она показывала на 0, на 100 кадре – 350. Для того, чтобы сделать нелинейность, сделайте следующее. Выберите значение скорости (2, 5, 10, 15, 20, 25, 30, 35). Например, выберем 2 то есть 20 км/ч. Делим 20 на 3.5 (или другую цифру указанную в секции <code>) и получаем 5,7. Значит идем на 6 кадр, в нем делаем keyframe и крутим стрелку на значение 2. � так для остальных значений.
5. Теперь компилируете вашу модель, и смотрите результат в симе.

РћР±СЉСЏСЃРЅСЋ РєРѕРґ РїСЂРёР±РѕСЂР°.

(A:Airspeed select indicated or true,knots) – параметр приборной скорости
1.852 * — умножение РЅР° 1,852. Умножаем для того, чтобы получить скорость РІ километрах.
3.5 / — деление РЅР° 3.5. Делим, чтобы перевести скорость РІ 100 кадров. Если вам РЅСѓР¶РЅРѕ создать например РЈРЎ-450, то вместо 3,5 напишите 4,5.

2PRE
Вы немного ошиблись. <Value> можно использовать ТОЛЬКО для A: переменной.

Если нужно еще что-то, спрашивайте здесь, по возможности отвечу.

С уважением, �лья.

P.S
На скриншоте – панель самолета �л-103, полностью сделанная в 3D, без использования 2D приборов.

Прикрепленные изображения

  • il103.jpg

РЇ — Р·Р° трехмерность, там РіРґРµ РѕРЅР° действительно поможет — например, авиагоризонт.

Вариометр трехмерный — излишек, РЅР° РјРѕР№ взгляд. Чтобы сделать круглый РїСЂРёР±РѕСЂ, без видимых углов, надо делать многогранник хотя Р±С‹ РЅР° 24 стороны (Рё то заметно). Потом, надо делать рамки РїСЂРёР±РѕСЂР°, это еще РјРёРЅРёРјСѓРј три стороны. Рў.Рµ., РЅР° РѕРґРёРЅ такой РїСЂРёР±РѕСЂ — 24С…3 = 72С…2= 144 треугольника.

Основание РїСЂРёР±РѕСЂР° (циферблат) РјРѕР¶РЅРѕ сделать четырехугольником Рё РЅР° него натянуть текстуру РїСЂРёР±РѕСЂР°. (или, если делать СѓР¶ совсем трехмерным, СЃРѕ стрелкой — то РєСЂСѓРі РёР· 24 РєСЂСѓРіРѕРІ Рё стрелку)

Сверху еще стеклом закрыть — РєСЂСѓРі РёР· 24 углов.

� так вот штук 40 приборов.

:rolleyes:

Рђ РЅР° авиагоризонт — тут СЏ согласен тратиться :)

Конечно нужно анимировать только стрелки. В CFS3 так и сделано. Только хотел поднять вопрос, возможно ли такое в MSFS, и вот пожалуйста- готовый ответ. Здорово!

Да можно, конечно. Но, если анимировать только стрелки, тогда теряется смысл — надо или делать трехмерный прибор с окантовкой, либо оставлять текстуру.

Я все равно за производительность, а не за 5-7 фпс на среднем компе.

denokan
Конечно нужно делать так, чтобы полигонов было поменьше. Но зачем мелочиться, покрайней мере для маленького самолета, типа �л-103. У меня на нем на стеклах и носу блеск, приборов на 3080 полигонов (не готов еще только 1 прибор) и наружа на 50000. � на нашем компе (P4 2400, 768 ОЗУ видюха GeForce5900) 24,5 кадра держит спокойно. Да загружается может и долго, но зато выглядит красиво. Тем более для большого самолета это делать никто не заставляет, но на �л-103 всего 21 прибор.
Кстати, по этой технологии если хорошо заанимировать приборы не тормозят вообще. Так что на нашем следующем проекте (не �л-103) не будет тех же тормозов с приборами, как в виртуалке Як-12
С уважением, �лья.

Не хило. У меня туполь на 42 наружка :rolleyes:

Я не имел в виду самолет с десятью приборами, может, я неточно выразился. У меня была задумка сделать ВК в эмке по тому же методу, потом я от нее отказался, ибо летать на слайдшоу и любоваться красявостью — это ацтой.

Требуется еще один ответ на вопрос — поковырявшись в разных материалах не нашел или не правильно понял. Требуется сделать, например, тормозные колодки.
Т.е. при условии, что ВСУ(электрика… трам-пам-пам, рояля не играет) выключена и самолет на стояночном. Колодки видны, в противном случае нет. Как делать в сценах вызов чего либо по радио, понятно, но в самолете, было бы не совсем корректно сие использывать, или я не прав?

Наставтье на путь истинный, коллеги!

Сообщение отредактировано Igor Goncharov: 20 April 2006 — 16:02

действительно, в самолете это делается не через вызов по радио. Определяем состояние двигателей,если они выключены-значит,колодки. Но тут есть еще момент буксировки. Посему,еще надо и его учитывать каким-то образом,например по условию, что путевая скорость ноль.

хотя я,вообще считаю, что для таких анимаций лучше использовать отдельную панель.

Про отдельную панель мысль интересная, спасибо за идею!
А вот тогда уточняющий вопрос:
Допустим, нарисовал СЏ РІ 0-Р№ позиции анимации некий объект. Р’ некоторой позиции (1-Р№) его «СЃРїСЂСЏС‚ал» например РІ крыло, дабы «РЅРµ светился», РЅРѕ это хорошо СЃ маленьким объектом (Рё вообще верно ли СЏ делаю, что прячу его? Может есть какой-нить РґСЂСѓРіРѕР№ алгоритм работы — поделитесь?). Рђ что сделать СЃ большим? РџРѕ размеру соизмеримым хотя Р±С‹ … СavsimёРЅРѕР№-заправшиком?

<part>
<name>PARK_BRAKES</name>
<visible_in_range>
<parameter>
<code>(A:Circuit general panel on, bool) ! (A:SIM ON GROUND, bool) * (A:VELOCITY BODY Z, kilometers/hour) 1 &lt; &amp;&amp; (A:Turb eng1 N1, percent) 2 &lt; &amp;&amp; (A:Turb eng2 N1, percent) 2 &lt; &amp;&amp; (A:Turb eng3 N1, percent) 2 &lt; &amp;&amp; (A:Turb eng4 N1, percent) 2 &lt; &amp;&amp;
</code>
</parameter>
<minvalue>1</minvalue>
</visible_in_range>
</part>

Roger B)
Спасибо — поробую, о результатах доложу!