Проект "Виртуальное вождение автомобиля"

  • Игры
  • Компьютерные программы
  • docx
  • 16.09.2019
Публикация в СМИ для учителей

Публикация в СМИ для учителей

Бесплатное участие. Свидетельство СМИ сразу.
Мгновенные 10 документов в портфолио.

Публикация является частью публикации:

Иконка файла материала портфолио.docx
Департамент образования мэрии города Новосибирска Дворец творчества детей и учащейся молодежи «Юниор» Городской конкурс исследовательских проектов учащихся 5­8 классов Направление: научно­техническое «Тренажер виртуального вождения автомобиля» Автор: Шурыгин  Роман МБОУ  «Гимназия №8»,5 «Б» класс    Первомайский район г.Новосибирска    Консультант проекта:     Дмитриева Светлана Николаевна,    учитель математики Новосибирск 2018I. Паспорт проекта. Название проекта.   Разработка  игры «Тренажер виртуального вождения автомобиля» Разработчик.  Шурыгин  Роман, МБОУ  «Гимназия №8»,5 «Б» класс Предметная область .   Информатика.  ПДД. Время разработки проекта    4 недели.  Проблема проекта.    Несоблюдение  школьниками  правил дорожного движения. Случаи травматизма и  несчастных случаев  на дороге  Цель проекта:  Привлечь внимание школьников к изучению правил дорожного движения и их  соблюдению.   Обучение навыкам безопасного поведения на дороге.  Задачи проекта:  Изучить литературу по данной теме из различных источников.  Выбрать нужные программы  и язык программирования для создания игры.  Создать знаки дорожного движения, элементы дороги, парковку, дома, деревья,  людей. Заставить  автомобиль выполнять  команды движения и «научить»  людей  двигаться.  Составить вопросы по ПДД .  Провести опрос (консультацию учащихся) перед  началом игры. Опробовать тренажер на учащихся своего класса. Тип проекта.     Социально значимый творческий, игровой проект.  Используемые технологии.    Программирование, графический дизайн, анимация.  Программы Unity3D на языке С#,  Cinema4G, Make Human.Форма проекта.     Виртуальная игра. Содержание.   Автомобиль должен двигаться правилам дорожного движения, согласно установленным  знакам.  Область применения результата проекта • Использовать тренажер для информационной работе по ПДД учащимися нашей  школы.  • Преподнести тренажер в качестве подарка Детскому Автогородку в рамках  Городского конкурса «Зеленая волна». Результативность • Повышение активности в изучении и соблюдении ПДД.  • Уменьшение числа правонарушений учащимися нашей школы. Литература. Источники. //www.youtube.com/channel/UCvEWclLkExSIsig9G_Z4e1Q?view_as=subscriber  1. 2. https://unity3d.com/ru/get­unity/download 3. http://www.makehuman.org/download.php  II. Описание работы над проектом.     Мною   выбран   данный   проект   не   случайно.   За   последние   три   года     произошел   рост нарушений   ПДД   учащимися   нашей   школы.   За   2016­17   уч.год   ими   было   совершено   57 правонарушений   в   качестве   участников   дорожного   движения.   По   данным   текущего учебного года в нашей школе 8 нарушений.    Не соблюдение учащимися правил Дорожного движения привело меня к  созданию игры – тренажера,   которая   бы   вызвала   у   школьников   интерес   к   изучению   правил   дорожного движения.     В   моей   игре     водителем   виртуального   автомобиля   может   стать   любой   желающий, имеющий элементарные навыки работы с компьютером.      Автомобиль   должен   двигаться   согласно   правилам   дорожного   движения,   согласно установленным   знакам.   Авто   может   набирать   и   уменьшать   скорость   движения, поворачивать и разворачиваться, останавливаться. Мне удалосьанимировать движение и торможение сопроводить различными звуковыми эффектами. При торможении появляется дым.    Мною установлена невидимая стена с целью, чтобы авто не сносило с дорожного полотна. Я «научил» оборачиваться пешеходов.     Моя   работа   была   начата   с   написания   скрипта   контроля   дороги,   создания   карты (поверхности).   Затем   расположил   дороги,   установил   авто.     Создал   знаки   и   светофор. Написал   скрипты   для   камеры.   Чтобы   камера   могла   отслеживать   движение   авто.   Ввел различные объекты дома, деревья, людей.   Добавил     анимацию.     Дома   возникают   при   приближении   к   объекту,   увеличиваются   в размере. Люди оглядываются, чтобы приступить к движению по пешеходному переходу. Использовал скрипты контроллера управления персонажами.  Конечная цель в работе мною еще не достигнута. Но уже проявился интерес к моей игре не только у моих одноклассников, но и учителей нашей школы. Первым испытателем моей виртуальной игры стала Светлана Николаевна.    Я планирую усовершенствовать игру. Добавить в игру новые объекты, «научить» людей и другие объекты  передвигаться. Добавить переключение сигналов светофора.    В интернете есть 3 моих обучающих видеоролика: 1. Как создать персонаж.  2. Как сделать машину. 3. Скрипты. 1 часть. Урок по  скриптингу. Включение и выключение объекта. В дальнейшем, возможно, мое увлечение станет моей основной работой.Приложение 1. Скрипты для программы Unity Контролер using UnityEngine; using UnityStandardAssets.CrossPlatformInput; namespace UnityStandardAssets.Characters.ThirdPerson { [RequireComponent(typeof (ThirdPersonCharacter))] public class ThirdPersonUserControl : MonoBehaviour { private ThirdPersonCharacter m_Character; // A reference to the ThirdPersonCharacter on the object private Transform m_Cam; // A reference to the main camera in the scenes transform private Vector3 m_CamForward; // The current forward direction of the camera private Vector3 m_Move; private bool m_Jump; // the world-relative desired move direction, calculated from the camForward and user input. private void Start() {// get the transform of the main camera if (Camera.main != null) { m_Cam = Camera.main.transform; } else { Debug.LogWarning( "Warning: no main camera found. Third person character needs a Camera tagged \ "MainCamera\ ", for camera-relative controls.", gameObject); // we use self-relative controls in this case, which probably isn't what the user wants, but hey, we warned them! } // get the third person character ( this should never be null due to require component ) m_Character = GetComponent(); } private void Update() { if (!m_Jump) { m_Jump = CrossPlatformInputManager.GetButtonDown("Jump"); } } // Fixed update is called in sync with physics private void FixedUpdate() { // read inputs float h = CrossPlatformInputManager.GetAxis("Horizontal"); float v = CrossPlatformInputManager.GetAxis("Vertical"); bool crouch = Input.GetKey(KeyCode.C); // calculate move direction to pass to character if (m_Cam != null) { // calculate camera relative direction to move: m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized; m_Move = v*m_CamForward + h*m_Cam.right;} else { // we use world-relative directions in the case of no main camera m_Move = v*Vector3.forward + h*Vector3.right; } #if !MOBILE_INPUT // walk speed multiplier if (Input.GetKey(KeyCode.LeftShift)) m_Move *= 0.5f; #endif // pass all parameters to the character control script m_Character.Move(m_Move, crouch, m_Jump); m_Jump = false; } } } Аудио Авто using System; using UnityEngine; using Random = UnityEngine.Random; namespace UnityStandardAssets.Vehicles.Car {     [RequireComponent(typeof (CarController))]     public class CarAudio : MonoBehaviour     {         // This script reads some of the car's current properties and plays sounds accordingly.         // The engine sound can be a simple single clip which is looped and pitched, or it         // can be a crossfaded blend of four clips which represent the timbre of the engine         // at different RPM and Throttle state.         // the engine clips should all be a steady pitch, not rising or falling.         // when using four channel engine crossfading, the four clips should be:         // lowAccelClip : The engine at low revs, with throttle open (i.e. begining acceleration at  very low speed)         // highAccelClip : Thenengine at high revs, with throttle open (i.e. accelerating, but almost  at max speed)         // lowDecelClip : The engine at low revs, with throttle at minimum (i.e. idling or engine­ braking at very low speed)         // highDecelClip : Thenengine at high revs, with throttle at minimum (i.e. engine­braking at very high speed)// For proper crossfading, the clips pitches should all match, with an octave offset between  low and high.         public enum EngineAudioOptions // Options for the engine audio         {             Simple, // Simple style audio             FourChannel // four Channel audio         }         public EngineAudioOptions engineSoundStyle = EngineAudioOptions.FourChannel;// Set  the default audio options to be four channel         public AudioClip lowAccelClip;                                              // Audio clip for low  acceleration         public AudioClip lowDecelClip;                                              // Audio clip for low  deceleration         public AudioClip highAccelClip;                                             // Audio clip for high  acceleration         public AudioClip highDecelClip;                                             // Audio clip for high  deceleration         public float pitchMultiplier = 1f;                                          // Used for altering the pitch of  audio clips         public float lowPitchMin = 1f;                                              // The lowest possible pitch for  the low sounds         public float lowPitchMax = 6f;                                              // The highest possible pitch for  the low sounds         public float highPitchMultiplier = 0.25f;                                   // Used for altering the pitch  of high sounds         public float maxRolloffDistance = 500;                                      // The maximum distance  where rollof starts to take place         public float dopplerLevel = 1;                                              // The mount of doppler effect  used in the audio         public bool useDoppler = true;                                              // Toggle for using doppler         private AudioSource m_LowAccel; // Source for the low acceleration sounds         private AudioSource m_LowDecel; // Source for the low deceleration sounds         private AudioSource m_HighAccel; // Source for the high acceleration sounds         private AudioSource m_HighDecel; // Source for the high deceleration sounds         private bool m_StartedSound; // flag for knowing if we have started sounds         private CarController m_CarController; // Reference to car we are controlling         private void StartSound(){             // get the carcontroller ( this will not be null as we have require component)             m_CarController = GetComponent();             // setup the simple audio source             m_HighAccel = SetUpEngineAudioSource(highAccelClip);             // if we have four channel audio setup the four audio sources             if (engineSoundStyle == EngineAudioOptions.FourChannel)             {                 m_LowAccel = SetUpEngineAudioSource(lowAccelClip);                 m_LowDecel = SetUpEngineAudioSource(lowDecelClip);                 m_HighDecel = SetUpEngineAudioSource(highDecelClip);             }             // flag that we have started the sounds playing             m_StartedSound = true;         }         private void StopSound()         {             //Destroy all audio sources on this object:             foreach (var source in GetComponents())             {                 Destroy(source);             }             m_StartedSound = false;         }         // Update is called once per frame         private void Update()         {             // get the distance to main camera             float camDist = (Camera.main.transform.position ­ transform.position).sqrMagnitude;             // stop sound if the object is beyond the maximum roll off distance             if (m_StartedSound && camDist > maxRolloffDistance*maxRolloffDistance)             {                 StopSound();             }// start the sound if not playing and it is nearer than the maximum distance             if (!m_StartedSound && camDist < maxRolloffDistance*maxRolloffDistance)             {                 StartSound();             }             if (m_StartedSound)             {                 // The pitch is interpolated between the min and max values, according to the car's  revs.                 float pitch = ULerp(lowPitchMin, lowPitchMax, m_CarController.Revs);                 // clamp to minimum pitch (note, not clamped to max for high revs while burning out)                 pitch = Mathf.Min(lowPitchMax, pitch);                 if (engineSoundStyle == EngineAudioOptions.Simple)                 {                     // for 1 channel engine sound, it's oh so simple:                     m_HighAccel.pitch = pitch*pitchMultiplier*highPitchMultiplier;                     m_HighAccel.dopplerLevel = useDoppler ? dopplerLevel : 0;                     m_HighAccel.volume = 1;                 }                 else                 {                     // for 4 channel engine sound, it's a little more complex:                     // adjust the pitches based on the multipliers                     m_LowAccel.pitch = pitch*pitchMultiplier;                     m_LowDecel.pitch = pitch*pitchMultiplier;                     m_HighAccel.pitch = pitch*highPitchMultiplier*pitchMultiplier;                     m_HighDecel.pitch = pitch*highPitchMultiplier*pitchMultiplier;                     // get values for fading the sounds based on the acceleration                     float accFade = Mathf.Abs(m_CarController.AccelInput);                     float decFade = 1 ­ accFade;                     // get the high fade value based on the cars revs                     float highFade = Mathf.InverseLerp(0.2f, 0.8f, m_CarController.Revs);                     float lowFade = 1 ­ highFade;                     // adjust the values to be more realistic                     highFade = 1 ­ ((1 ­ highFade)*(1 ­ highFade));                     lowFade = 1 ­ ((1 ­ lowFade)*(1 ­ lowFade));                     accFade = 1 ­ ((1 ­ accFade)*(1 ­ accFade));decFade = 1 ­ ((1 ­ decFade)*(1 ­ decFade));                     // adjust the source volumes based on the fade values                     m_LowAccel.volume = lowFade*accFade;                     m_LowDecel.volume = lowFade*decFade;                     m_HighAccel.volume = highFade*accFade;                     m_HighDecel.volume = highFade*decFade;                     // adjust the doppler levels                     m_HighAccel.dopplerLevel = useDoppler ? dopplerLevel : 0;                     m_LowAccel.dopplerLevel = useDoppler ? dopplerLevel : 0;                     m_HighDecel.dopplerLevel = useDoppler ? dopplerLevel : 0;                     m_LowDecel.dopplerLevel = useDoppler ? dopplerLevel : 0;                 }             }         }         // sets up and adds new audio source to the gane object         private AudioSource SetUpEngineAudioSource(AudioClip clip)         {             // create the new audio source component on the game object and set up its properties             AudioSource source = gameObject.AddComponent();             source.clip = clip;             source.volume = 0;             source.loop = true;             // start the clip from a random point             source.time = Random.Range(0f, clip.length);             source.Play();             source.minDistance = 5;             source.maxDistance = maxRolloffDistance;             source.dopplerLevel = 0;             return source;         }         // unclamped versions of Lerp and Inverse Lerp, to allow value to exceed the from­to range         private static float ULerp(float from, float to, float value)         {             return (1.0f ­ value)*from + value*to;         }     } }Приложение 2. Викторина.