Департамент образования мэрии города Новосибирска
Дворец творчества детей и учащейся молодежи «Юниор»
Городской конкурс исследовательских проектов
учащихся 58 классов
Направление: научнотехническое
«Тренажер виртуального вождения автомобиля»
Автор: Шурыгин Роман
МБОУ «Гимназия №8»,5 «Б» класс
Первомайский район г.Новосибирска
Консультант проекта:
Дмитриева Светлана Николаевна,
учитель математики
Новосибирск 2018 I. Паспорт проекта.
Название проекта.
Разработка игры «Тренажер виртуального вождения автомобиля»
Разработчик.
Шурыгин Роман, МБОУ «Гимназия №8»,5 «Б» класс
Предметная область .
Информатика. ПДД.
Время разработки проекта
4 недели.
Проблема проекта.
Несоблюдение школьниками правил дорожного движения. Случаи травматизма и
несчастных случаев на дороге
Цель проекта:
Привлечь внимание школьников к изучению правил дорожного движения и их
соблюдению.
Обучение навыкам безопасного поведения на дороге.
Задачи проекта:
Изучить литературу по данной теме из различных источников.
Выбрать нужные программы и язык программирования для создания игры.
Создать знаки дорожного движения, элементы дороги, парковку, дома, деревья,
людей. Заставить автомобиль выполнять команды движения и «научить» людей
двигаться.
Составить вопросы по ПДД . Провести опрос (консультацию учащихся) перед
началом игры. Опробовать тренажер на учащихся своего класса.
Тип проекта.
Социально значимый творческий, игровой проект.
Используемые технологии.
Программирование, графический дизайн, анимация. Программы Unity3D на языке С#,
Cinema4G, Make Human. Форма проекта.
Виртуальная игра.
Содержание.
Автомобиль должен двигаться правилам дорожного движения, согласно установленным
знакам.
Область применения результата проекта
• Использовать тренажер для информационной работе по ПДД учащимися нашей
школы.
• Преподнести тренажер в качестве подарка Детскому Автогородку в рамках
Городского конкурса «Зеленая волна».
Результативность
• Повышение активности в изучении и соблюдении ПДД.
• Уменьшение числа правонарушений учащимися нашей школы.
Литература. Источники.
//www.youtube.com/channel/UCvEWclLkExSIsig9G_Z4e1Q?view_as=subscriber
1.
2. https://unity3d.com/ru/getunity/download
3. http://www.makehuman.org/download.php
II. Описание работы над проектом.
Мною выбран данный проект не случайно. За последние три года произошел рост
нарушений ПДД учащимися нашей школы. За 201617 уч.год ими было совершено 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. enginebraking 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 fromto range
private static float ULerp(float from, float to, float value)
{
return (1.0f value)*from + value*to;
}
}
} Приложение 2.
Викторина.
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Проект "Виртуальное вождение автомобиля"
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.