Форум Trainsim

Форум Trainsim (http://www.trainsim.ru/forum/index.php)
-   TS - Маршруты и сценарии (http://www.trainsim.ru/forum/forumdisplay.php?f=38)
-   -   Звуковые эффекты в сценариях (http://www.trainsim.ru/forum/showthread.php?t=16697)

awaken 18.12.2013 18:56

Звуковые эффекты в сценариях
 
Ковыряю такую вещь, нигде толком не описанную
разве что вот здесь единственное более-менее внятное объяснение

[URL="http://www.railunion.net/forum53/topic10420.html"]http://www.railunion.net/forum53/topic10420.html[/URL]


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

в Stevens Pass таким образом сделаны говорящие детекторы неисправностей поезда, осуществляющие контроль нагрева букс, и контроль верхнего и нижнего габарита ПС (аналог наших ПОНАБ и УКСПС)

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

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

Чтобы активировать эту возможность , придется немного попотеть. Чтобы понять как это работает, я расковырял несколько сценариев из воркшопа, где задействована эта фишка.

1) вставить в скрипт сценария активацию событий смены погоды

пример скрипта:

[PHP]
function OnEvent ( event )

-- Instruction triggers
---------------------------

-- Timed triggers
---------------------------

if event == "MP1735" then

SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1735" )
return TRUE

end

if event == "MP1740" then

SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1740" )
return TRUE

end

return FALSE

end
[/PHP]

вкратце что здесь делается. MP1735, MP1740 - это имена событий привязанные к маркерам пути в сценарии (названы по номеру пикета/километражу, название может быть любым ). эти имена нужно прописать в свойство TriggerEventSuccess у путевого маркера, при проезде которого будет срабатывать событие.

код вышеуказанного скрипта по имени события вызывает эффект погоды из файла расширения WeatherExtension

далее, чтобы добавить расширение погоды к сценарию, нужно вручную отредактировать файл ScenarioProperties.xml

изначально там было вот что:
никакого расширения не задано

[PHP]
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString"></Provider>
<Product d:type="cDeltaString"></Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString"></BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
[/PHP]

мы там прописываем ссылку на наш собственный файл расширения погоды

как-то так

собственно Tour.xml это и есть файл расширения погодных эффектов
находится он в папке Assets в подкаталоге принадлежащей конкретному маршруту. audio это относительный путь внутри ассетов маршрута.
в данном случае это путь

папка_игры\Assets\GNTX\Stevens Pass\audio

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

[PHP]
<WeatherExtensionBlueprint>
<iBlueprintLibrary-cAbsoluteBlueprintID>
<BlueprintSetID>
<iBlueprintLibrary-cBlueprintSetID>
<Provider d:type="cDeltaString">GNTX</Provider>
<Product d:type="cDeltaString">StevensPass</Product>
</iBlueprintLibrary-cBlueprintSetID>
</BlueprintSetID>
<BlueprintID d:type="cDeltaString">audio\Tour.xml</BlueprintID>
</iBlueprintLibrary-cAbsoluteBlueprintID>
</WeatherExtensionBlueprint>
[/PHP]

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

для активации аудиовоспроизводящих маркеров там есть такие записи

[PHP]
<cTriggeredWeatherEventChain d:id="7896">
<Name d:type="cDeltaString">DetMP1776</Name>
<BlendOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</BlendOutTime>
<LoopMode d:type="cDeltaString">eStop</LoopMode>
<TimedWeatherEvent>
<cWeatherTypeEvent d:id="7901">
<WeatherType d:type="ref">7145</WeatherType>
<Duration d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Duration>
</cWeatherTypeEvent>
</TimedWeatherEvent>
<LocationEvent>
<cLocationWeatherEvent d:id="7905">
<Name d:type="cDeltaString">MP1776</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000A09999B93F" d:precision="string">0.1</Delay>
<AudioControllerName d:type="cDeltaString">Det1776</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
<cLocationWeatherEvent d:id="7932">
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
<InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude>
<InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude>
<TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude>
<TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude>
<FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain>
<HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset>
<AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting>
<AdditiveLightingColour>
<cHcColour>
<Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red>
<Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green>
<Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue>
<Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha>
</cHcColour>
</AdditiveLightingColour>
<Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration>
<TextureID d:type="cDeltaString"></TextureID>
<BottomLeftUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</BottomLeftUV>
<TopRightUV>
<cRVector2>
<X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X>
<Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y>
</cRVector2>
</TopRightUV>
<Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale>
<FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime>
<FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime>
</cLocationWeatherEvent>
</LocationEvent>
</cTriggeredWeatherEventChain>

[/PHP]

нас собственно интересует это :

[PHP]<Name d:type="cDeltaString">DetMP1776</Name>[/PHP]

вот это ссылка на эффект погоды, вызываемый из скрипта через
[PHP]"WeatherController:SetCurrentWeatherEventChain", "DetMP1735"[/PHP]

то есть при проезде маркера с именем MP1735 будет проигрываться звуковой эффект под именем DetMP1735.
далее, про синтезированную речь со счетом осей поезда.
для этого внутри данного XML блока есть строчка Axle(число осей)
и ниже еще раз это же число в виде 24X.

[PHP]
<Name d:type="cDeltaString">Axle24</Name>
<Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay>
<AudioControllerName d:type="cDeltaString">24X</AudioControllerName>
[/PHP]

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

awaken 19.12.2013 00:00

зы я ошибся никакая речь там не синтезируется

там заранее записаны цифры для определенных длин состава - 24х, 36х, 190х
соответственно если хочется подогнать под свой случай, нужно использовать ближайшее число

E.depo 19.12.2013 16:02

Вообще мысль, по поводу синтеза речи, очень интересна. Даже есть программы-говорилки, там водишь текст и программа озвучивает его, вроде в Винде это реализовано стандартно. Я как-то ставил такую говорилку и на сайте Мелкософта скачивал звуковые библиотеки, ну там под разные голоса (мужские - женские), и под разные языки. Правда читают они без интонации , да и ударения не туда делают - но всё-равно приемлемо для слуха.
Да, такую "фишку" не плохо бы иметь для редактора сценариев. Ввёл к примеру текст в редакторе, а потом во время сценария, тебе вместо текстового сообщения на экран, вдруг голосом, какое-то распоряжение диспетчера.[img]http://arcanumclub.ru/smiles/smile166.gif[/img]

awaken 19.12.2013 19:00

теоретически это возможно если написать какой-то модуль расширения игры (в виде DLL) , в который скрипт будет подсовывать параметр в виде текстовой строки

я не знаю, допускает ли движок расширения бинарными программными модулями? в lua скрипт синтез речи не запихнешь, но библиотеки для C/C++ с подобными алгоритмами есть

le Sandro 20.12.2013 10:48

Мне кажется, что все-таки лучше будет в стороннем софте нормальных wav-ов насинтезировать и вставить в роут или сцену в виде маркеров.

E.depo 21.12.2013 20:47

Не-е, конечно на синтезировать можно, но тут теряется гибкость, так как, если потребуется неожиданно изменить сообщение, то опять потребуется синтезировать. Я имел ввиду, чтоб только ввёл нужный, произвольный текст в свойство правила, ну там где вводится текст выводимого сообщения, нажал скажем иконку "звук" (которой нет:D) и вовремя прохождения сценария, тебе вместо вывода текста - будет голосовое сообщение, приятным женским голосом (слегка побритым и немного выпившим баритоном);)
Можно и маркеры специальные добавить или использовать те, что есть.


Текущее время: 13:12. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim