УДК 004.94
П. О. МАТВЕЕВ, Р. С. МОЛОТОВ
ОСОБЕННОСТИ МОДЕЛИРОВАНИЯ СВЕТОТЕХНИКИ
И ЗВУКОВЫХ ЭФФЕКТОВ ТРАНСПОРТНЫХ СРЕДСТВ
ПРИ РАЗРАБОТКЕ ОБУЧАЮЩИХ СИМУЛЯТОРОВ В СРЕДЕ UNITY
Рассматриваются особенности создания и редактирования трёхмерного освещения и добавления звуковых эффектов в модели транспортных средств в среде Unity. Приведён краткий обзор различных типов освещения моделей.
Ключевые слова: unity, моделирование, симуляторы, анимация.
Введение
Программное обеспечение для обучения и контроля знаний активно применяется в современном образовательном процессе. Помимо прочих информационных технологий, для обеспечения процесса обучения всё более активно используются обучающие симуляторы и тренажёрные системы. Применять их можно на различных уровнях образования: в учреждениях дошкольного и общего, среднего профессионального, высшего и дополнительного образования.
С помощью современных технологий реализуется широкий спектр сценариев обучения, начиная от имитационного моделирования физических и химических процессов, изучаемых в школьных лабораториях, заканчивая симуляцией рабочих мест предприятий (цехов, лабораторий и т. п.) и симуляторов транспортных средств (ТС).
Для создания симуляторов используются как специализированные платформы (OpenSimulator, RealXtend, Open Wonderland и т. д.), так и игровые (Unity, Unreal Engine...), и физические (Havok, nVidia PhysX) движки. Для разработки симулято-ра - реализации имитационной модели транспортных средств - был выбран движок Unity. Основными его преимуществами являются:
• Наличие конструктора: совокупности игрового движка и интегрированной среды разработки (IDE);
• Расчёт физики с помощью физического движка PhysX, упрощающего создание физических моделей объектов симулятора;
• Поддержка популярных форматов Sd-моделей, звуковых файлов, графики;
• Простой Drag&Drop интерфейс, обеспечи-
© Матвеев П. О., Молотов Р. С., 2016
вающий отладку симулятора из редактора и снижающий порог вхождения инструментария в целом.
Далее предлагается рассмотреть реализацию светотехники и звуковых эффектов имитационной модели транспортного средства (на примере ГАЗ-66), которая будет интегрирована в обучающий симулятор военного полигона.
Моделирование светотехники ТС
Для осуществления поставленной задачи предлагается использовать стандартные инструменты для создания освещения, такие как SpotLight, PointLight, и т. д. Также для создания правильных алгоритмов работы стоп-сигналов, указателей поворота и т. п. необходимо описать логику их работы с помощью скриптов (в Unity используется язык C#). Рассмотрим пример реализации головного освещения на модели автомобиля ГАЗ-66.
if (Input.GetKeyDown("2") && !isOn) { headLights[0].material headLightsON;
headLights[1].material headLightsON;
SpolightLEFT.intensity = 5f; SpolightRIGHT.intensity = 5f;
}
if(Input.GetKeyDown("2") &&isOn){ headLights[0].material headLightsOFF;
headLights[1].material headLightsOFF;
SpolightLEFT.intensity = 0f; SpolightRIGHT.intensity = 0f;
}
if (Input.GetKeyDown("2")){
isOn = !isOn; }_
Листинг 1. Скрипт включения и отключения головного света ТС
Рис. 1. Пример реализации головных огней на модели ГАЗ-66
Как видно из листинга 1, освещение переключается при нажатии пользователем кнопки «2»: меняется материал на головных огнях, и включаются привязанные к ним объекты типа SpotLight - источники света. Чтобы реализовать в имитационной модели такое освещение, предварительно необходимо:
1. Непосредственно в Unity создать объекты - цилиндры, повторяющие форму фар (рис. 2), либо использовать готовую модель фар, являющуюся отдельной частью (Editable Poly / Editable Mesh) Sd-модели ТС, подготовленной в графическом пакете.
2. Назначить этим объектам материал (либо текстуру, либо цвет), повторяющий внешний вид выключенных головных огней. Если используется готовая модель с наложенным материалом, то менять следует его, а не накладывать новый слой.
3. Добавить в папку Assets проекта второй материал, повторяющий внешний вид включённых головных огней.
4. Прикрепить к модели головных огней необходимое количество объектов SpotLight и настроить их (указав интенсивность и цвет) в IDE.
После этого можно прикрепить к объектам фар скрипт (см. листинг 1), с помощью которого меняются вышеупомянутые материалы, прикреплённые к модели или цилиндрам, а также включаются и выключаются объекты SpotLight, привязанные к головным огням.
Схожий алгоритм действий применяется для создания стоп-сигналов. Различие состоит в том, что вместо SpotLight используется PointLight: стоп-сигналы не светят в определённую точку, а освещают пространство вокруг себя. В скрипте необходимо отслеживать нажатие кнопок «S» и «Space», чтобы стоп-сигналы загорались при включении пользователем заднего хода и торможении, а также при использовании ручного тормоза (листинг 2). Начальная интенсивность света должна быть небольшая: 0.3f - 0.4f, в отличие от головных огней, где она выключена (значение 0f).
Рис. 2. Модель левой фары головного света
if (Input.GetKey(KeyCode.S) || In-
put.GetKey("space")){
brakeLights[0].material =
brakeLightON;
brakeLights[1].material =
brakeLightON;
StoplightLEFT.intensity = 1f;
StoplightRIGHT.intensity = 1f;
}else{
brakeLights[0].material =
brakeLightOFF;
brakeLights[1].material =
brakeLightOFF;
StoplightLEFT.intensity = 0.3f;
StoplightRIGHT.intensity } = 0.3f;
Листинг 2. Скрипт включения и отключения стоп-сигналов ТС
ЩГ
ущ - I Ь
Рис. 3. Пример реализации стоп-сигналов на модели ГАЗ-66
Рис. 4. Модель левого стоп-сигнала
Рис.5. Пример реализации указателей поворота на модели ГАЗ-66
Модель указателей поворотов сложнее и поэтому интереснее: при повороте ТС (нажатии пользователем кнопок А и Б) необходимо выключать ранее включённый указатель, и включать тот, который соответствует актуальному направлению поворота ТС. В скрипте указателей поворота необходимо назначить две отдельных клавиши на каждый из указателей, реализовать мигание света с заданной частотой - автоматическую смену материала на моделях указателей, изначально выставив интенсивность источников света (Рот1^Ь1;) на ноль (листинг 3).
if(Input.GetKeyDown("3") &&
!TurnRight){
turnLights[0].material=TurnLightON;
turnLights[1].material=TurnLightON; rightSignalON = true; }else if (Input.GetKeyDown("3") || In-put.GetKeyUp(KeyCode.D) && TurnRight){ turnLights[0].material=TurnLightOFF;
turnLights[1].material=TurnLightOFF; rightSignalON = false; turNLightRF.intensity = 0f;
=turNLightRF1.intensity = 0f;
}
if (Input.GetKeyDown("3")){ TurnRight = !TurnRight;
}
if (Input.GetKeyDown("1") &&
!TurnLeft){
turnLights[2].material =
TurnLightON;
turnLights[3].material =
TurnLightON;
leftSignalON = true; }else if (Input.GetKeyDown("1") || In-put.GetKeyUp(KeyCode.A) && TurnLeft){
turnLights[2].material =
TurnLightOFF;
turnLights[3].material =
TurnLightOFF;
leftSignalON = false; turNLightLF.intensity = 0f; turNLightLFl.intensity = 0f;
}
if (Input.GetKeyDown("1")){ TurnLeft = !TurnLeft;
}
if (TurnLightON){
float floor = 0f;
float ceiling = lf; float emission = floor + Mathf .PingPong(Time.time * 2f, ceiling - floor); if (rightSignalON){
turnLights[0].material.SetColor("_E missionColor",
new Color(lf, lf, lf) * emission);
turnLights[1].material.SetColor("_E missionColor",
new Color(1f, lf, lf) * emission);
turNLightRF.intensity = lf * emission;
turNLightRFl.intensity = lf *
emission;
if (leftSignalON){ turnLights[2].material.SetColor("_Emiss ionColor",
new Color(lf, lf, lf)
* emission);
turnLights[3].material.SetColor("_E missionColor",
new Color(lf, lf, lf)
* emission);
turNLightLF.intensity = lf * emission;
turNLightLFl.intensity = lf
* emission;
}
} else if (leftSignalON){
turnLights[2].material.SetColor("_E missionColor",
new Color(lf, lf, lf) * emission);
turnLights[3].material.SetColor("_E missionColor",
Листинг 3. Продолжение
Листинг 3. Скрипт включения и отключения указателей поворотов ТС
new Color(1f, 1f, 1f) * emission);
turNLightLF.intensity = 1f * emission;
turNLightLF1.intensity = 1f *
emission;
if (rightSignalON){
turnLights[0].material.SetColor("_E missionColor",
new Color(1f, 1f, 1f)
* emission);
turnLights[1].material.SetColor("_Emission Color",
new Color(1f, 1f, 1f)
* emission);
turNLightRF.intensity = 1f
* emission;
* emission;
}
}
turNLightRF1.intensity = 1f
Листинг 3. Окончание
Рис. 6. Модель переднего левого указателя поворота
Из вышеизложенного можно сделать вывод, что создание и редактирование освещения моделей в среде разработки Unity не занимает большого количества времени. Наличие встроенного в IDE конструктора упрощает разработку, снижает объём и сложность разрабатываемого программного кода, необходимого для создания динамических интерактивных моделей, компонентов симуляторов.
Моделирование звуковых эффектов ТС
Используемая в симуляторе имитационная модель, помимо визуальной ^d-модель, световые эффекты, анимация) составляющей, должна содержать также и аудио компонент - звуковые эффекты. Для модели ТС основными звуковыми эффектами являются звук работающего двигате-
ля и звуки его включения и выключения, звук клаксона. Чтобы реализовать в имитационной модели воспроизведение данных звуковых эффектов, необходимо:
1. Создать внутри модели пустые объекты, к которым прикрепить компоненты типа Аи&о8оигсе (рис. 7).
2. Настроить основные параметры звуковых эффектов: указать аудиофайл, громкость.
3. Запрограммировать включение и выключение звуковых эффектов клаксона (листинг 4), зажигания, а также динамического изменения параметров звука двигателя (листинг 5).
4. Добавить в модель ТС компонент Аи&оЫ81епег, чтобы воспроизводимый звук был слышен при управлении автомобилем.
Для того чтобы при нажатии пользователем соответствующей кнопки включался клаксон ТС, необходимо разработать скрипт, который однократно воспроизводит звуковой эффект, соответствующий прикреплённому к родительскому объекту компоненту Аи^о8оигсе (листинг 4).
Рис. 7. Зацикленный звуковой эффект работы двигателя и прикреплённый к нему скрипт
public AudioSource Klakson; void Start(){ Klakson=
GetComponent<AudioSource>(); }
void Update () {
if (Input.GetKeyDown(KeyCode.G)) {
GetComponent<AudioSource>().Play(); }
Листинг 4. Скрипт воспроизведения звука клаксона ТС
}
Чтобы реализовать воспроизведение звуков включения и выключения мотора, используется скрипт с аналогичной логикой. Однако необходимо также включать и выключать звук работающего двигателя, громкость которого должна зависеть от числа оборотов (косвенно - от скорости ТС). Поэтому приведённый выше скрипт необходимо модернизировать следующим образом (листинг 5).
usingUnityEngine; using System.Collections; public class SoundEngine :
MonoBehaviour {
public Rigidbody rb; private AudioSource a; public float volume; public bool engineIsOn = false; void Start () {
a=GetComponent<AudioSource>(); rb.centerOfMass = new Vector3(0, 0,
0);
}
void Update(){
if (In-
put.GetKeyDown(KeyCode.R) && !engineIsOn){
GetComponent<AudioSource>().Play(); }
a.volume = Mathf
.Clamp(rb.velocity
.magnitude / l4,
0.3f, 0.7f);
if (In-
put.GetKeyDown(KeyCode.R) &&engineIsOn){
GetComponent<AudioSource>().Stop(); }
if (In-
put. GetKeyDown(KeyCode.R)){
engineIsOn = !engineIsOn; }
}
}
Листинг 5. Скрипт воспроизведения и изменения громкости звука двигателя ТС
Воспроизведение звуковых эффектов, как и включение источников света, легко связать с физической моделью объекта и действиями пользователя. Таким образом, можно значительно повысить адекватность моделей [3] в составе симулятора, реализовать все значимые для симуляции свойства реальных объектов, воспроизводимые моделями: физическую, визуальную и звуковую составляющие моделей.
Заключение
Авторами были рассмотрены примеры реализации визуальных и звуковых эффектов имитационных моделей транспортных средств в составе обучающих симуляторов. Продемонстрированный визуальный редактор, встроенный в IDE Unity, позволяет значительно упростить, а в некоторых моментах и автоматизировать проектирование и разработку компонентов моделей, входящих в состав среды симуляторов. Из рассмотренного примера можно заключить, что Unity отлично подходит в качестве инструмента для разработки обучающих симуляторов, а наличие свободно распространяемой версии и низкий порог вхождения упрощают его использование в учебных целях и студенческих исследовательских проектах, подобных этому.
СПИСОК ЛИТЕРАТУРЫ
1. Русскоязычное сообщество разработчиков на Unity. URL: http://www.unity3d.ru/
2. Официальный сайт Unity3D. URL: http://unity3d.com/ru/
3. Моделирование элементов ВС. Курс лекций / под ред. Н. С. Куцоконя. - Ульяновск : УлГТУ, архив каф. «ВТ», 2002.
4. Справочник API Unity. URL: http://docs.unity3d.com/ru/current/ScriptReference/ index.html
5. Система планирования Олимпийских игр SOCHI-2014. URL: http://www.vizerra.ru/portfolio sochi-2014/
6. Галкин А. В., Аноприенко А. Я. Использование технологии Uity 3D при разработке универсальной плоскопанельной тренажерно-обучающей системы // Материалы IV всеукраин-ской научно-технической конференции студентов, аспирантов и молодых учёных «Информационные управляющие системы и компьютерный мониторинг (ИУС КМ 2013)» - 24-25 апреля 2013 г. - Донецк : ДонНТУ, 2013.
7. Creighton, R.-H. Unity 3D Game Development by Example Beginner's Guide - Packt Publishing, 2010. - 384 c.
Матвеев Павел Олегович, студент УлГТУ, кафедра «Вычислительная техника». Молотов Роман Сергеевич, младший научный сотрудник НИО УНИ УлГТУ.
Поступила 18.08.2016 г.