Самолёт

Программирование на Юнити.

Re: Самолёт

Сообщение Slava 13 июн 2009, 17:40

wild_r писал(а):Как им вообще управлять?
Пробел - тяга! Прикольно получилось))
Добавить slava-1234 в Skype
Slava
UNIт
 
Сообщения: 135
Зарегистрирован: 05 апр 2009, 05:14

Re: Самолёт

Сообщение wild_r 13 июн 2009, 17:57

Где закрылки? Как вы без них летать собираетесь?
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Самолёт

Сообщение Slava 13 июн 2009, 20:46

да, и стабилизаторов - поворот вправо-влево с наклоном фюзеляжа...
Добавить slava-1234 в Skype
Slava
UNIт
 
Сообщения: 135
Зарегистрирован: 05 апр 2009, 05:14

Re: Самолёт

Сообщение DzumoHu4 14 июн 2009, 00:07

SashaRX писал(а):
wild_r писал(а):Насчет угла атаки - у вас же есть углы модели относительно центра мира, нужно узнать угол потока и вычесть.


Ага, так и сделал, пока что вот как вышло http://kubdev.3dn.ru/Unity3d/test.html

Здорово, а можно увидеть сорцы?
Управление немного ТуговатоЕ)
DzumoHu4
UNец
 
Сообщения: 46
Зарегистрирован: 02 июн 2009, 20:02

Re: Самолёт

Сообщение wild_r 14 июн 2009, 00:10

Так еще какие углы остались? могу немного помочь с геометрией/тригонометрией. А для начала приделайте псевдо закрылки - взлет вверх, а также хвостовой руль. А там уже можно и физическую модель обтачивать.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Самолёт

Сообщение SashaRX 14 июн 2009, 11:44

DzumoHu4 писал(а):
SashaRX писал(а):
wild_r писал(а):Насчет угла атаки - у вас же есть углы модели относительно центра мира, нужно узнать угол потока и вычесть.


Ага, так и сделал, пока что вот как вышло http://kubdev.3dn.ru/Unity3d/test.html

Здорово, а можно увидеть сорцы?
Управление немного ТуговатоЕ)

Да, выложу, только они страшные)...
wild_r писал(а):Так еще какие углы остались? могу немного помочь с геометрией/тригонометрией. А для начала приделайте псевдо закрылки - взлет вверх, а также хвостовой руль. А там уже можно и физическую модель обтачивать.

В принципе вроде всё, сейчас выложу версию с правками.
-------------------------------------------------------------------------------------------------------------------------------------------
Управление:

W, S - Наклон фюзеляжа вверх-вниз, тоесть жмём S для того чтобы задрать нос вверх. Тут нужно быть осторожным, при сильном наклоне 20 - 25 градусов, самолёт резко теряет подъёмную силу и тяга становиться меньше.
A, D - Поворот влево в право, или хвостовой руль, при большой скорости (...>60), теряется манёвренность.
Q, E - Наклон влево и в право, при большой скорости (...>60), теряется манёвренность.
Space - Тяга.
Space + LShift - Турбо, самолёт начинает быстро набирать тягу, но при большой скорости самолёт хуже управляться.
-------------------------------------------------------------------------------------------------------------------------------------------
Вот, интересно мнение "Fly" Примерно 980Кб
Последний раз редактировалось SashaRX 14 июн 2009, 17:30, всего редактировалось 1 раз.
SashaRX
UNец
 
Сообщения: 46
Зарегистрирован: 05 июн 2009, 16:47
Откуда: Краснодар( Апшеронск )
  • Сайт
  • ICQ

Re: Самолёт

Сообщение wild_r 14 июн 2009, 15:13

Круто, вот только есть несколько моментов:
1) Управление поагрессивнее
2) Винты? Или турбина? Если турбина, то нужно тягу двигателя сделать почти константной, а то мертвую петлю нереально сделать.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Самолёт

Сообщение DzumoHu4 14 июн 2009, 16:21

Честно говоря создаётся ощущение что летишь на "кукурузнике" :D
А вот с гравитацией какие то чудеса - самолёт падает с высоты с постоянной скоростью - 9.8 м/c. Либо вы неправильно составили формулу либо кривой физический двиг.
В натурале каждую секунду авиалайнер(с отключенными двигателями) должен ускорятся на 9.8 метров, то есть через 100 секунд свободного fallа - скорость падения будет 980 метров.
Правда нельзя ещё недооценивать такие вещи как - сопротивление воздуха при падении, плотность этого воздуха, влажность, направление ветра. скорость ветра, наличие облаков, место где происходит полёт, Широта, высота над уровнем моря, и ещё тысяча и один параметр...
DzumoHu4
UNец
 
Сообщения: 46
Зарегистрирован: 02 июн 2009, 20:02

Re: Самолёт

Сообщение SashaRX 14 июн 2009, 17:33

DzumoHu4 писал(а):Честно говоря создаётся ощущение что летишь на "кукурузнике" :D
А вот с гравитацией какие то чудеса - самолёт падает с высоты с постоянной скоростью - 9.8 м/c. Либо вы неправильно составили формулу либо кривой физический двиг.
В натурале каждую секунду авиалайнер(с отключенными двигателями) должен ускорятся на 9.8 метров, то есть через 100 секунд свободного fallа - скорость падения будет 980 метров.
Правда нельзя ещё недооценивать такие вещи как - сопротивление воздуха при падении, плотность этого воздуха, влажность, направление ветра. скорость ветра, наличие облаков, место где происходит полёт, Широта, высота над уровнем моря, и ещё тысяча и один параметр...
wild_r писал(а):Круто, вот только есть несколько моментов:
1) Управление поагрессивнее
2) Винты? Или турбина? Если турбина, то нужно тягу двигателя сделать почти константной, а то мертвую петлю нереально сделать.


В принципе мне не нужна реальная физика самолёта, а лишь подобие, так как это не совсем самолёт, а малолитражный кукурузник, да и формула не правильная, скорее уже куча if. Пока что мне не нравиться, что нет определённого центра тяжести, как бы самолёт должно нести вперёд, в общем как почищу сорец выложу, он конечно страшный и не правильный, но может люди помогут довести это до ума.Обновил дему.
SashaRX
UNец
 
Сообщения: 46
Зарегистрирован: 05 июн 2009, 16:47
Откуда: Краснодар( Апшеронск )
  • Сайт
  • ICQ

Re: Самолёт

Сообщение wild_r 14 июн 2009, 18:59

Да, понял, не хватает закона сохранения импульса.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Самолёт

Сообщение DzumoHu4 15 июн 2009, 15:28

wild_r писал(а):Да, понял, не хватает закона сохранения импульса.

А каким ты макаром прибабахал к Кукурузнику Закон сохранения количества движения?
Речь идёт не о Реактивном движении, а о Винтовом.
Говоря по русски В Реактивном самолёте реактивная струя толкает самолёт - (Вспомнилось - "Гоблин птица гордая - пока не пнёшь не полетит" :D )
В Самолёте где движущей силой является пропеллер, этот самый пропеллер тянет самолёт за собой.
Вот некоторые вещи которые возможны в реактивном самолёте
Особенно обратите внимания на моменты 1.96 - 2.40 минут.(Вроде остановки, зависания, прокручиваний и прочих финтов.
DzumoHu4
UNец
 
Сообщения: 46
Зарегистрирован: 02 июн 2009, 20:02

Re: Самолёт

Сообщение wild_r 15 июн 2009, 16:52

DzumoHu4 писал(а):
wild_r писал(а):Да, понял, не хватает закона сохранения импульса.

А каким ты макаром прибабахал к Кукурузнику Закон сохранения количества движения?
Речь идёт не о Реактивном движении, а о Винтовом.
Говоря по русски В Реактивном самолёте реактивная струя толкает самолёт - (Вспомнилось - "Гоблин птица гордая - пока не пнёшь не полетит" :D )
В Самолёте где движущей силой является пропеллер, этот самый пропеллер тянет самолёт за собой.
Вот некоторые вещи которые возможны в реактивном самолёте
Особенно обратите внимания на моменты 1.96 - 2.40 минут.(Вроде остановки, зависания, прокручиваний и прочих финтов.


А вы про закон сохранения энергии знаете? Причем тут реактивный двигатель? Вы что, думаете что самолет летит пока двигатель крутит пропеллер? А вы про планеры знаете? А почему в автобусе за поручни держаться? Если у самолета есть энергия, а также вектор движения, то он будет двигаться, пока эта энергия не израсходуется на преодоление трения воздуха, на разогрев, на раздвигание слоев воздуха...

З.Ы. Зачем мне все это рассказывать?
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Самолёт

Сообщение SashaRX 15 июн 2009, 17:36

Вот скрипт, для его работы нужно создать ГО добавить Rigidbody и что нить собрать из примитивов типо самолёта, прошу не смеяться над формулами
Код: Выделить всё

/* Класс описывающий упровление самолётом. */
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (Rigidbody))]

public class FlyControls : MonoBehaviour
{   
   //PRIVATE
   private float thrust      = 0.0F; //Тяга двигателя
    private float lforce      = 0.0F; //Подёмная сила
   private float clift         = 0.0F; //Коэффициент подъемной силы
   private float ax           = 0.0F;
   private float ay           = 0.0F;
   private float az           = 0.0F;
   private float anglesx         = 0.0F;
    private float anglesz         = 0.0F;
   
   
   void Start()
    {
      rigidbody.angularDrag = 3.0F;
      rigidbody.drag           = 0.45F;
    }
   
   void FixedUpdate ()
   {
      az = 0.0F;
      if (Input.GetButton( "Jump" )) //Жмём пробел
      {
         if( thrust < 25.0F)
         {
            thrust += 3.5F * Time.deltaTime;//Прибовляем тягу пока она меньше 25
         }
      }
      else
      {
         if( thrust > 0.0F)//Если клавиша не нажата и скорость больше нуля то
         {
            thrust -= 6.5F * Time.deltaTime; //уменьшаем тягу
         }
      }
      
        anglesx = ( rigidbody.rotation.eulerAngles.x * 2.0F - 360.0F ) * 0.5F;   //А это смешная формула, хотел перевести 0...180...360 -> -180...0...180
       anglesz = ( rigidbody.rotation.eulerAngles.z * 2.0F - 360.0F ) * 0.5F;   //Аналогично
      if( anglesz < 0.0F )//Это часть верхних формул, просьба не смеяться
      {
         anglesz = 180.0F + anglesz;
      }
      else
      {
         anglesz = 180.0F - anglesz;
      }
      if( anglesx > 0.005F )//Ниже код для того, чтобы отследить угол атакии обрезать его от 0 до 30 градусов
      {
         anglesx = Mathf.Clamp ( 360.0F - rigidbody.rotation.eulerAngles.x, 0.005F, 30.0F );
         clift =1.0F - ( 0.035F * ( 25.0F - anglesx ));
      }
      else
      {
         anglesx = 0.0F;
      }
      if( anglesx > 22.0F && anglesz < 45.0F )// а тут код для того, чтобы при сильном угле атаки падала тяга и подёмная сила
      {
         thrust =  15.0F;
         if( anglesx > 26.0F )
         {
            clift -= 10.0F;
            thrust -= 5.0F;
         }
      }            
      if( rigidbody.velocity.magnitude >= 60.5F )// А это для изменения упровления при большых чкоростях
      {
         ax = Input.GetAxisRaw( "Vertical" ) * 1.05F;
          ay = Input.GetAxisRaw( "Horizontal" ) * 1.05F;
         rigidbody.angularDrag = 5.75F;
         rigidbody.drag           = 0.525F;
         if (Input.GetKey( "q" ))
         {
            az = 3.0F;
         }
         if ( Input.GetKey( "e" ))
         {
            az = -3.0F;
         }
      }
      else
      {
         ax = Input.GetAxisRaw ( "Vertical" ) * 1.175F;
          ay = Input.GetAxisRaw ( "Horizontal" ) * 1.175F;
         rigidbody.angularDrag = 2.75F;
         rigidbody.drag           = 0.435F;
         if (Input.GetKey( "q" ))
         {
            az = 4.5F;
         }
         if ( Input.GetKey( "e" ))
         {
            az = -4.5F;
         }
      }
      if( Input.GetKey( KeyCode.LeftShift ) && Input.GetButton( "Jump" ))//Ускорение
      {
         if( thrust < 75.0F )
         {
            thrust += 45.0F * Time.deltaTime;
         }
      }
      else
      {
         if( thrust > 25.0F )
         {
            thrust -= 75.0F * Time.deltaTime;
         }
      }
      lforce = ( rigidbody.velocity.magnitude * 0.225F ) + ( rigidbody.velocity.magnitude * 0.05F * clift );//тут расчёт подъёмной силы
      rigidbody.AddRelativeTorque ( new Vector3 ( ax,  ay, az ) * Time.deltaTime, ForceMode.VelocityChange);
      rigidbody.AddRelativeForce ( new Vector3( az, lforce - az, thrust) * Time.deltaTime, ForceMode.VelocityChange );
   }
   void OnGUI()
   {
      GUILayout.Label("    Height: " + transform.position.ToString());
      GUILayout.Label("    Speed: " + rigidbody.velocity.magnitude.ToString());
      GUILayout.Label("    Lifting force: " + lforce.ToString());
      GUILayout.Label("    Thrust: " + thrust.ToString());
      GUILayout.Label("    AnglesX: " + anglesx.ToString());
      GUILayout.Label("    AnglesZ: " + anglesz.ToString());
      GUILayout.Label("    Clift: " + clift.ToString());
   }
}

SashaRX
UNец
 
Сообщения: 46
Зарегистрирован: 05 июн 2009, 16:47
Откуда: Краснодар( Апшеронск )
  • Сайт
  • ICQ

Ещё вариант

Сообщение SashaRX 18 июн 2009, 20:03

Вот такой ещё вариант:
Код: Выделить всё

/* Класс описывающий упровление самолётом. */
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (Rigidbody))]

public class FlyControls : MonoBehaviour
{
   //PUBLIC
   public float maxthrust          = 40.0F; //Максемальная тяга двигателя
   public float maxspeed          = 200.0F; //Максемальная скорость
   public float maneuverability   = 1.0F; //Манёвренность или упровляемость
   public float racing               = 50.0F; //Скорость набора скорости
   public float maxangleX         = 30.0F;// Нудевой угол атаки
   
   //PRIVATE
    private float lforce       = 0.0F; //Подёмная сила
   private float clift         = 0.0F; //Коэффициент подъемной силы
   private float thrust      = 0.0F; //Тяга двигателя
   
   private float ax           = 0.0F;
   private float ay           = 0.0F;
   private float az           = 0.0F;
   private float anglesx    = 0.0F;
    private float anglesz    = 0.0F;
   
   
   void Start()
    {
    }
   
   void FixedUpdate ()
   {
      az = 0.0F;
      
      if (Input.GetButton( "Jump" )) //Жмём пробел
      {
         if( thrust < maxthrust)
         {
            thrust += racing * Time.deltaTime;//Прибовляем тягу пока она меньше 25
         }
      }
      else
      {
         if( thrust > 0.0F)//Если клавиша не нажата и скорость больше нуля то
         {
            thrust = rigidbody.velocity.magnitude * 0.35F;
         }
      }
      
      if( rigidbody.rotation.eulerAngles.x < 180.0F )
      {
          anglesx = -rigidbody.rotation.eulerAngles.x;
      }
      else
      {
         anglesx = 360.0F-rigidbody.rotation.eulerAngles.x;
      }
      
      if( rigidbody.rotation.eulerAngles.z < 180.0F )
      {
          anglesz = -rigidbody.rotation.eulerAngles.z;
      }
      else
      {
         anglesz = 360.0F-rigidbody.rotation.eulerAngles.z;
      }
      
      anglesx = Mathf.Clamp ( anglesx, -maxangleX, maxangleX + 5.0F );
      clift        =1.0F - ( 0.035F * ( maxangleX - anglesx ));

      if( anglesx > maxangleX - 5.0F && anglesz < 45.0F  && anglesz > -45.0F)// а тут код для того, чтобы при сильном угле атаки падала тяга и подёмная сила
      {
         clift = -thrust * 0.15F;
      }            
      ax = Input.GetAxisRaw( "Vertical" ) * maneuverability;
      ay = Input.GetAxisRaw( "Horizontal" ) * maneuverability;
      rigidbody.angularDrag = 6.0F - maneuverability;
      rigidbody.drag           = 1.5F - maneuverability;
      if (Input.GetKey( "q" ))
      {
         az = 3.0F * maneuverability;
      }
      if ( Input.GetKey( "e" ))
      {
         az = -3.0F * maneuverability;
      }
      
      lforce = ( rigidbody.velocity.magnitude * 0.175F ) + ( rigidbody.velocity.magnitude * 0.04F * clift );//тут расчёт подъёмной силы
      rigidbody.AddRelativeTorque ( new Vector3 ( ax,  ay, az ) * Time.deltaTime, ForceMode.VelocityChange);
      rigidbody.AddRelativeForce ( new Vector3( az * az, lforce , thrust) * Time.deltaTime, ForceMode.VelocityChange );
   }
   void OnGUI()
   {
      GUILayout.Label("    Height: " + transform.position.y.ToString("f2"));
      GUILayout.Label("    Speed: " + rigidbody.velocity.magnitude.ToString("f2"));
      GUILayout.Label("    Lifting force: " + lforce.ToString("f2"));
      GUILayout.Label("    Thrust: " + thrust.ToString("f2"));
      GUILayout.Label("    AnglesX: " + anglesx.ToString("f2"));
      GUILayout.Label("    Temp: " + anglesz.ToString("f2"));
      GUILayout.Label("    Clift: " + clift.ToString("f2"));
   }
}



P.S. Помогите довести формулу до нормального состояния...
SashaRX
UNец
 
Сообщения: 46
Зарегистрирован: 05 июн 2009, 16:47
Откуда: Краснодар( Апшеронск )
  • Сайт
  • ICQ

Re: Самолёт

Сообщение Slava 18 июн 2009, 22:18

SashaRX писал(а):упровление
пишется через а!)))
Добавить slava-1234 в Skype
Slava
UNIт
 
Сообщения: 135
Зарегистрирован: 05 апр 2009, 05:14

Пред.След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 18