• Increase font size
  • Default font size
  • Decrease font size
  • default color
  • cyan color
  • red color
Создание вертолета(Helicopter Tutorial)
Автор: Administrator   
30.06.2011 23:49

 

Автор: CopyrightAndrewGotow

Источник: Helicopter Tutorial

Автор перевода: Поляков Сергей(для сайта http://unity3d.vx0.ru)

 
 
Часть 1. Принцип работы Вертолета
 
Сам принцип работы вертолета устроен, так же, как и принцип работы самолета. Крыло самолета - представляет из себя длиную плоскоть, 
 
если смотреть в профиль но крыло напоминает форму капли. Принци работы крыла, в возникновение подъёмной силы приписывается разности 
 
давлений на верхней и нижней сторонах профиля. Обычно рассматривается крыло с плоско-выпуклым профилем: нижняя поверхность плоская, 
 
верхняя — выпуклая. Набегающий поток разделяется крылом на две части — верхнюю и нижнюю, — при этом верхняя часть вынуждена проходить 
 
более длинный путь, чем нижняя, вследствие выпуклости крыла. Исходя из условия о неразрывности потока, делается заключение, что 
 
скорость потока сверху крыла должна быть больше, чем снизу, что вызывает разность давлений и подъёмную силу. Т.е. воздух на одной 
 
стороне крыла течет быстрее, чем на другом.
 
 
Изменяя различие в скорости ветра, есть различие давления между вершиной и основанием крыла, которое проявляет силу к области более 
 
низкого давления. Точно так же как, если бы Вы поместили бы крыло под воду, вода текла бы вокруг одной стороны медленнее чем на 
 
другой.Для крыла, чтобы произвести взлет, оно должно перемещаться очень быстро, чтобы создавалась большая разница в давлении, чтобы 
 
поднять транспортное средство вверх. Самолеты достигают огромной скорости,чтобы скорость вдоль ветра относительно крыла была достаточно 
 
высока. Вертолеты взлетают немного другим способом. Вместо того, чтобы перемещать транспортное средство, вертолеты перемещают крыло! 
 
Каждое лопость прикрепленная на роторе - фактически напоминает крыло, и их вращение вокруг оси должно быть очень быстрое, чтобы поднять 
 
в воздух сам вертолет. Изменяя скорость ротора, также возможно контролировать поднимающую силу вертолета.
 
Теперь вопрос состоит в другом,как же нам повернуть вертолет? Вот еще одна схожесть между вертолетами и самолетами. Чтобы повернуться, 
 
самолет может поворачивать маленькие откидные створки на своих крыльях, изменяя угол одного из крыльев. Из-за этого, различия на одном 
 
крыле подъемная сила становится больше, чем на другом, и крыло поворачивает самолет. Создаваемый угол, называют углом нападения.
 
 
Вертолеты так же используют этот принцип. Ротор на вертолете может свободно изминить угол, разрешая пилоту контролировать угол 
 
нападения каждой лопости ротора, когда они вращаются. Увеличивая угол нападения лопастей, в то время как они находятся на одной стороне 
 
вертолета, Вы получаете намного более высокую подъемную сил на той стороне, вынуждая вертолет наклониться и полететь в противоположном 
 
направлении.
 
 
У вертолетов также есть ротор хвоста, меньший пропеллер.Регулируя скорость ротора хвоста, Вы можете также увеличить или уменьшить 
 
чистый вращающий момент на вертолете, заставляя его отклоняться от курса, или вращаться по Оси Y. Это позволяет пилоту легко вращать 
 
вертолет, застыв на одном месте.
 
Комбинация всех этих систем позволяет вертолету, полететь вперед, назад, влево, право, вниз, верх и вращаться вдоль осей X, Y, и Z. 
 
Из-за этого у вертолета намного больше контроля и маневренности, чем у любого другого аэроплана. Однако, если одна из этих систем 
 
перестанет работать, результаты могут быть катастрофическими.
 
Часть 2. Настройка Вертолета в Unity3D
 
Теперь, когда у нас есть основное понимание того, как работают реальные вертолеты, мы должны выяснить, как смоделировать все это в 
 
Unity3d. В то время как мы могли технически начать программировать все движущие силы, вовлеченные в двигатель Unity, это будет работать 
 
не достаточно быстро, и будет совсем не устойчиво, для того, чтобы управлять сценарием игры. В этом уроке мы будем строить простой 
 
rigidbody вертолет, который вручную применяет силы, так будто роторы были бы в действительности посредством простого сценария. Но 
 
прежде,мы должны настроить наш Вертолет rigidbody.
 
Во-первых, мы должны будем создать границы столкновения для нашего вертолета, так, чтобы двигатель Физики знал общую форму о нем. Я 
 
обычно делаю это, создавая пустой Game Object, чтобы пользоваться им как контейнером, и затем заполняя его "Коллайдерами". Это - 
 
довольно простой способ создать хорошую границу столкновения неравной формы с многократными коллайдерами.
 
 
используйте пункт меню GameObject/CreateEmpty, чтобы создать пустой объект игры.
 
Теперь, когда у Вас есть объект игры, переименуйте его , так чтобы Вам было понятно, чтобы Вы знали что это, поместить пустой объект в 
 
координатах (0,0,0). Теперь создадим коллайдеры при помощи форм Сферы, Куба и капсулы,так чтобы описать общую форму вертолета в целом.
 
 
Коллайдеры - границы столкновения в Unity, и определяют, когда объект столкнется с другим. Вы можете найти коллайдеры в "Инспекторе", и 
 
отредактировать их свойства. Вы можете изменить размеры, и позиции коллайдеров, так, чтобы они соответствовали профилю Вашего 
 
вертолета. Они не должны точно соответствовать форме вертолета, но создать грубую форму описывающую вертолет, так, что игрок не будет в 
 
состоянии это заметить. Как только все коллайдеры настроены, главный наш GameObject, который мы используем как контейнер, перемещаем в 
 
Инспекторе, в объект вертолета, так что Вертолет стал родителем,этих всех коллайдеров, и они в свою очередь были зависимы при движение 
 
вертолета. При перетаскивании в объект вертолета, наш контейнер может поменять свои координаты, так как раньше его координаты были 
 
относительны к глобальному миру, а теперь его координаты относительны центра(или пивота) вертолета. Если такое произошло просто 
 
переместите контейнер обратно вручную.
 
 
Теперь, когда границы столкновения настроены, мы можем приложить rigidbody компонент к нашему вертолету. Выберите свою всю вертолетную 
 
установку, и выберите пункт меню component/physics/rigidbody, это добавит rigidbody компонент, и позволит Вам редактировать некоторые 
 
из его основных свойств
 
 
Теперь снова выберите свой вертолет, и щелкните rigidbody в инспекторе. Здесь Вы можете изменить свойства, такие как масса, торможение 
 
и т.д. Мы установим реальную массу вертолета. Все ресурсы для уроки были взяты от реального вертолета, ФИЛИАЛ 105, у которого масса 
 
приблизительно 1276 килограммов. просто напечатайте 1276 в значении свойства "Mass", и это установит массу rigidbody. Теперь мы должны 
 
установить значение торможение(Drag). Установим значение "Drag" приблизительно 0.1, и "Angular Drag" значение приблизительно 1.5, Вы 
 
можете поиграть с этими настройками для лучшего эффекта.
 
 
И так теперь, когда Вы нажимаете Play, Ваш вертолет должен резко упасть вниз и лететь камнем вниз до тех пор пока не столкнется с 
 
плосктью или объектом. Теперь нам нужно написать код, который нам будет помогать управлять вертолетом.
 
Часть 3. Написание Сценария
 
Хорошо, теперь, когда мы настроели вертолет в Unity, мы должны за программировать его, чтобы пользователь смог им управлять. Во-первых, 
 
мы должны будем создать новый файл Javascript. Пройдите в меню, и выберите Assets/Create/Javascript. Это добавит новый javascript файл 
 
в Вашу папку активов.
 
 
Теперь двойной щелчок на файле сценария и откроектся редактор, который у Вас установлен по умолчанию. Мы увидем пустой сценарий. Это - 
 
то, где мы будем писать весь код для вертолетных средств управления. Прежде всего, мы должны будем определить несколько свойств для 
 
нашего вертолета. Мы должны настроить максимальную силу ротора и для главного ротора, и для ротора хвоста, скорости ротора, или 
 
дросселя, который используется, чтобы определить скорость, на которой ротор вращается и количество силы, которую они проявляют, так же 
 
как чувствительность для средств управления игрока, оба отправляют, и боком, так, чтобы мы могли использовать их позже в сценарии.
Переменные в Javascript определяем, используя синтаксис:
 
var Имя перменной : Тип перменной = Значение по умолчанию;
 
 
 
var main_Rotor_GameObject  : GameObject;
var tail_Rotor_GameObject  : GameObject;
var max_Rotor_Force  : float = 22241.1081;
var max_Rotor_Velocity  : float = 7200;
static var         rotor_Velocity  : float = 0.0;
private var  rotor_Rotation  : float = 0.0; 
var  max_tail_Rotor_Force  : float = 15000.0; 
var max_Tail_Rotor_Velocity  : float = 2200.0; 
private var  tail_Rotor_Velocity  : float = 0.0; 
private var  tail_Rotor_Rotation  : float = 0.0;
var  forward_Rotor_Torque_Multiplier  : float = 0.5;
var  sideways_Rotor_Torque_Multiplier : float = 0.5;
static var          main_Rotor_Active : boolean = true;
static var          tail_Rotor_Active : boolean = true;
 
 
 
Большинство этих свойств достаточно просто понять без существенного объяснения.
Теперь, когда мы имеем все переменные, мы можем начать писать основной сценарий. Во-первых, мы напишем, функцию FixedUpdate, чтобы 
 
производить действия с физикой. FixedUpdate - функция, которая автоматически вызывается двигателем Unity интервалом который указан в 
 
timestep. Эта функция  используется, для того чтобы гарантировать последовательность примененных сил или скоростные изменения так, 
 
чтобы независимо от разряда структуры сценарий вел себя независимо от кадров в сцене. Пишем:
 
	function FixedUpdate () { }
 
 
и затем добавьте весь код, который мы желаем использовать в скобках. Во-первых, мы начнем, вычисляя вращающий момент, относился к телу 
 
вертолета, мы напишем...
 
	var torqueValue: Vector3;
 
TorqueValue - вектор с тремя координатами, представляющий чистый вращающий момент на объекте. Теперь мы вычисляем "controlTorque", или 
 
количество вращающего момента относилось к телу вертолета, основанного на входе игрока. Это сделано,для того, чтобы моделировать 
 
переменный угол нападения на вертолетных лопостях.
 
 
var controlTorque : Vector3 = Vector3(Input.GetAxis( "Vertical" ) * forward_Rotor_Torque_Multiplier, 1.0,-Input.GetAxis( "Horizontal2") * sideways_Rotor_Torque_Multiplier);
 
 
В то время как это может казаться запутанным, на самом деле это все очень просто. Причина значения Y установленной на 1.0,то что мы 
 
хотим моделировать вращающий момент на теле, созданном вращением роторов. Это - самый легкий способ применить ту силу, не добавляя 
 
слишком много дополнительного кода.
Теперь, если главный ротор является активным, то мы желаем применить чистый вращающий момент к вертолетному телу так же как с подъемной 
 
силой, созданной вращающимися роторами, таким образом мы просто пишем...
 
 
if ( main_Rotor_Active == true ) {
torqueValue += (controlTorque * max_Rotor_Force * rotor_Velocity);
rigidbody.AddRelativeForce( Vector3.up * max_Rotor_Force * rotor_Velocity );
}
 
 
 
Вы можете также добавить стабилизировавшуюся силу к телу, чтобы заставить его медленно выровняться. Самый легкий способ сделать это при 
 
использовании функции Quaterinion.Slerp(). Эта функция поворочивает тело, за указанное время тем самым, поворот будет плавным
 
 
if ( Vector3.Angle( Vector3.up, transform.up ) < 80 ) {
transform.rotation = Quaternion.Slerp( transform.rotation,
Quaternion.Euler( 0, transform.rotation.eulerAngles.y, 0 ), Time.deltaTime * rotor_Velocity * 2 );
}
 
 
Наконец, мы должны применить силу ротора хвоста к чистому вращающему моменту, и применить вращающий момент к вертолетному телу. Таким 
 
образом мы проверяем, является ли ротор хвоста активным, и затем вычитать максимальную силу ротора, умноженную, на дроссель от чистого 
 
вращающего момента и применять его относительно тела вертолета.
 
 
if ( tail_Rotor_Active == true ) {
torqueValue -= ( Vector3.up * max_tail_Rotor_Force * tail_Rotor_Velocity);
}
 
 
Все на этом функция FixedUpdate закончена.
 
Теперь мы будем использовать стандраную функцию Update(){}
 
	function Update () { }
 
Настраиваем управление пользователем. Во-первых, мы можем контролировать роторы.
 
 
if ( main_Rotor_Active == true ) {
main_Rotor_GameObject.transform.rotation = transform.rotation * Quaternion.Euler( 0,rotor_Rotation,0);
}
if ( tail_Rotor_Active == true ) {
tail_Rotor_GameObject.transform.rotation = transform.rotation * Quaternion.Euler( tail_Rotor_Rotation,0, 0);
}

rotor_Rotation += max_Rotor_Velocity * rotor_Velocity * Time.deltaTime;
tail_Rotor_Rotation += max_Tail_Rotor_Velocity * rotor_Velocity * Time.deltaTime;
 
 
Роторы должны теперь вращаться вдоль их лопастей, на максимальной скорости. 
 
Чтобы вертолет легко взлетел, очень важно, что бы роторы медленно дрейфовали к нейтральному. Мы можем легко вычислить минимальную 
 
необходимую скорость для главного ротора и ротора хвоста, чтобы держать вертолет в воздухе.
Чтобы найти главную скорость минимума ротора, мы просто используем математику, чтобы найти, сколько силы необходимо, чтобы 
 
противодействовать силе силы тяжести, и затем разделить на максимальную силу роторов. Это приведет к значению от 0.0 до 1.0, т.е. 
 
минимальная сила,необходимая для поддержания вертолета.
 
 
var hover_Rotor_Velocity = (rigidbody.mass * Mathf.Abs( Physics.gravity.y )
/ max_Rotor_Force);

var hover_Tail_Rotor_Velocity = (max_Rotor_Force * rotor_Velocity) 
/ max_tail_Rotor_Force;
 
 
Теперь, если игрок нажатием клавиши увеличивает скорость ротора дроссельной заслонки, затем увеличивает скорость
дросселя несущего винта, в противном случае, он медленно интерполирует его обратно на скорость наведения, так что
что вертолет будет парить на месте. И, наконец, набор скорости рулевого винта с минимальной скоростью,
, а затем клавиши увеличить или уменьшить при их нажатии пользователем. Это сделает спин хвостового винта
медленнее или быстрее, когда игрок нажимает на кнопку "Влево" или "Right", что делает применения
несбалансированное крутящего момента и спиннинг вертолета в этом направлении.
Наконец, мы ограничиваем скорость ротора до значения между 0.0 и 1.0, просто чтобы убедиться, что мы
не может применять силу больше.
 
 
if ( Input.GetAxis( "Vertical2" ) != 0.0 ) {
rotor_Velocity += Input.GetAxis( "Vertical2" ) * 0.001;
}else{
rotor_Velocity = Mathf.Lerp( rotor_Velocity, 
hover_Rotor_Velocity, 
Time.deltaTime * Time.deltaTime * 5
);
}
tail_Rotor_Velocity = hover_Tail_Rotor_Velocity - Input.GetAxis( "Horizontal" );
if ( rotor_Velocity > 1.0 ) {
rotor_Velocity = 1.0;
}else if ( rotor_Velocity < 0.0 ) {
rotor_Velocity = 0.0;
}
 
 
Наконец, вертолет должен издавать звук. Это относительно просто, потому что мы
уже имеют значения от 0.0 до 1.0, все, что нам нужно сделать,
является приложить источник звука и регулировать ее высоту. В Unity, вы можете присоединить источник звука так же просто
как вы добавите любой другой компонент. В меню компонент и выберите
Component/Audio/Audio Source. Просто прикрепить 3D-звук, источник
выбранный объект, в данном случае наш вертолет.
 
 
Как и все компоненты, источник звука будет отображаться в инспекторе, и вы
можете отредактировать его свойства. Установите в аудио-клип любой звук, который вы хотите сделать звуком вашего
Вертолета игры, а затем установить возпроизведение на Away, и loop на значение true. Это позволит сделать звук
источника воспроизведения звука вертолетных двигателей постоянным в течение всей игры.
Теперь вернемся в сценарий управления, просто добавьте новую строку в обновление функция, которая говорит: 
 
	audio.pitch = rotor_Velocity;
 
и Ваше аудио должно увеличиться и уменьшиться в подаче в зависимости от скорости, на которой вращаются роторы.
 
Если вы хотите, вы можете сделать другие сценарии для различных частей вертолета,
такие, как простой скрипт, который отключает роторов, если они вступают в контакт с чем-то, например, включены в папку проекта Unity. 
 
Это необязательно, и поэтому я не буду вдаваться глубоко в данном направлении, но это очень полезно, если Вы
делаете игру боевого вертолета, или нечто подобное.
 
 
Часть 3. Создание HUD(эта часть пока что переведена переводчиком)
 
Теперь, если Вы должны были управлять нашим вертолетом прямо сейчас, Вы были бы И что это - относительно различный культ, чтобы 
 
приземлиться, потому что у Вас нет никакого признака Вашей высоты, или дросселя. То, в чем мы нуждаемся, является рядом мер. 
 
Безусловно, самый простой способ сделать это - при использовании построенного в Unity GUI в сценарии. приложенный к вертолету, или к 
 
другому объекту игры. В этом примере у нас будет объект игры определенно посвященным рисунку hud .
Создайте пустой объект игры как прежде, и приложите новый javascript. Это будет служить главным сценарием для нашей hud. Построенный в 
 
Unity3d GUI очень удобен. Вы просто поставляете структуру или последовательность, и прямоугольник, чтобы потянуть это в, и 
 
использование Functions GUI.Label, Вы можете потянуть это где-нибудь onscreen. Это также работает для кнопок, ползунков, 
 
отредактировать области, и что - нибудь еще, о чем Вы можете думать, но для этого применения мы только должны использовать лейблы. 
 
Теперь откройте новый сценарий и начните редактировать. Во-первых, мы должны определить то, что объект игрока так, мы можем читать, это 
 
- ценности дросселя, и ничья onscreen структуры, чтобы представить их. Это достигнуто defning некоторые variables в сценарии. При 
 
простом письме следующего кода наверху Пива мы можем заставить сценарий тянуть все, в чем мы нуждаемся.
player_gameobject : GameObject;
altimeter_texture : Texture;
throttle_texture : Texture[];
 
helicopter_throttle : float;
Эти variables определяют структуры, которые будут использоваться как меры и объект игры, чтобы прочитать ценности от.
Затем мы должны фактически потянуть эти меры. Unity3D GUI требования должен быть сделан в Functions OnGUI, так только написать 
 
следующее вместо Functions обновления по умолчанию.
 
function OnGUI () {
Теперь легко написать необходимый код! В Functions OnGUI мы должны выполнить простой raycast, чтобы определить высоту вертолета. 
 
Создайте собственность Хита Raycast, и затем используйте Физику. Raycast функционируют к fnd расстояние к основанию.
 
var groundHit : RaycastHit;
st( player_gameobject.tr <http://player_gameobject.tr> n - Ve ip,
-Vector3.up, groundHit
);
 
Этот raycast заполнит groundHit Variables со всей информацией столкновения, таким образом мы сможем определить расстояние к самой 
 
близкой вещи под Вами. Затем мы устанавливаем вертолетную ценность дросселя в rotor_velocity Variables вертолетного сценария контроля.
helicopter_throttle = player_gameobject. Г ("Helicopter_Script").rotor_Velocity;
Это просто находит сценарий приложенным к игроку gameobject названный "Helicopter_Script", и затем читает ценность Variables 
 
rotor_Velocity.
 
Теперь все, что этому оставляют сделать, показывают их на экране. Сначала мы тянем фон для высотомера, и меру дросселя, тогда мы тянем 
 
лейблы, выше. Вы, возможно, заметили, что, когда мы определили структуру для использования с мерой дросселя, мы настраиваем множество. 
 
Хорошо, это - то, потому что построенный в Unity3D GUI не поддерживает вращение эльфа, таким образом мы должны сделать многократные 
 
структуры, чтобы щелкнуть между показать различные ценности. В этом примере, есть просто 10, но то число может легко быть изменено.
I.Label( Rect( 0, 0, 128, 128 ), altimeter_texture ); el( F ct( 0, 128, 128, 128 ), throttle_texture[ helicopter_throttle * 10 ] );
 
Поскольку helicopter_throttle - ценность между 0 и 1, мы можем заставить структуру мультипликации меры дросселя быть ценностью 
 
helicopter_throttle * число структур (в этом случае 10).
 
И теперь просто потяните некоторые лейблы, и напечатайте ценность высотомера сверху фона меры.
 
GUI.Label( Rect( 40, 40, 256, 256 ), Mathf.Round( groundHit.distance ) + " m" ) GUI.Label( Rect( 20, 182, 256, 256 ), "ENG" );
И это должно быть этим! Только приложите этот сценарий к любому объекту игры в сцене, и установите variables правильно, и у Вас должна 
 
быть простая, и функциональная КОЖУРА для Вашего вертолета.
Часть, 5 Прилагающее Оружие
Если бы Вы делаете вертолет, это почти несомненно содержит оружие, таким образом я полагал, что я написал бы простой сценарий оружия в 
 
этой обучающей программе, чтобы показать основы raycasts и использование объекта RaycastHit. Для этого сценария мы собираемся нуждаться 
 
в нескольких variables, главным образом один, чтобы сказать задержке между выстрелами, другой подсчитывать к той задержке, другому для 
 
эффекта, который создан, когда кое-что поражено, и одна четверть для оружия непосредственно.
var                                   gun_Emitter_Object                                  GameObject; 
 var                                   weapon_Fire_Delay                                 float = 0.0; 
 var                                              bullet_Impact_Prefab                                          GameObject; 
private var                                 weapon_Fire_Timer                                            float = 0.0;
Теперь, объект эмитента оружия должен быть эмитентом частицы, со звуковым приложенным источником. Это будет служить эффектом, 
 
созданным, когда оружие будет стрелять, так же как источник огнестрельного звука. Чтобы создать основного эмитента частицы, выберите 
 
пункт меню, Gameobject/Create Другая/Частица Система, и это сделает новый объект игры, который испускает частицы. Tweaked (щипнуть) это 
 
- ценности, пока у Вас нет кое-чего, что Вы любите, и прилагаете audiosource компонент.
Теперь, в Functions обновления нового сценария оружия, мы можем написать некоторый простой код. Во-первых, мы будем хотеть выключить 
 
эмитента частицы, затем проверить, снижается ли ключ огня и время, так как последний выстрел больше или равен задержке огня. Если так, 
 
установите таймер огня в 0, скажите звуковому источнику объекта оружия играть, и заставлять это испускать частицы.
function Update () {
gun_Emitter_Object.particleEi it = false;
if ( Ir >n( "Fire1" ) && weapon_Fire_Timer >= weapon_Fire_Delay ) {
 
weapon_Fire_Timer = 0.0;
gun_Emitter_Object.audio.Flay();
gun_Emitter_Object.particleEm it = true;
}
}
 
Кроме того, в пределах этого, если утверждение, напишите код raycast. Мы настраиваем объект Raycast Hit, и затем вызываем Fhysics. 
 
Raycast функционируют, чтобы заполниться во всей информации хита. Если Functions raycast возвращается истинный (если есть кое-что в 
 
линии огня), то мы можем создать prefab хита пули, и сделать то, что Вы можете хотеть сделать, когда кое-что застрелено.
 
var hit : RaycastHit;
 
if ( Fhysics.Raycast( gun_Emitter_Object.transform.position,
gun_Emitter_Object.transform.forward,
hit )
) {
 
Instantiate( bullet_Impact_Prefab, hit.point,
Quaternion.LookRotation( hit.normal )
);
}
 
weapon_Fire_Timer += T e;
 
 
И наконец, увеличьте таймер задержки огня, как мы находимся в линии выше. Вы должны теперь быть в состоянии приложить этот сценарий к 
 
любому объекту игры в сцене, определить, что объект оружия и пуля воздействуют на заранее приготовленный актив, и затем в состоянии 
 
стрелять.
 

 

Вход на сайт

Онлайн

Сейчас 27 гостей онлайн

Понравился сайт?


Счетчики

Rambler's Top100

Облако тэгов

Joomla Extensions



Карта сайта