Пробел - тяга! Прикольно получилось))wild_r писал(а):Как им вообще управлять?
SashaRX писал(а):wild_r писал(а):Насчет угла атаки - у вас же есть углы модели относительно центра мира, нужно узнать угол потока и вычесть.
Ага, так и сделал, пока что вот как вышло http://kubdev.3dn.ru/Unity3d/test.html
DzumoHu4 писал(а):SashaRX писал(а):wild_r писал(а):Насчет угла атаки - у вас же есть углы модели относительно центра мира, нужно узнать угол потока и вычесть.
Ага, так и сделал, пока что вот как вышло http://kubdev.3dn.ru/Unity3d/test.html
Здорово, а можно увидеть сорцы?
Управление немного ТуговатоЕ)
wild_r писал(а):Так еще какие углы остались? могу немного помочь с геометрией/тригонометрией. А для начала приделайте псевдо закрылки - взлет вверх, а также хвостовой руль. А там уже можно и физическую модель обтачивать.
DzumoHu4 писал(а):Честно говоря создаётся ощущение что летишь на "кукурузнике"
А вот с гравитацией какие то чудеса - самолёт падает с высоты с постоянной скоростью - 9.8 м/c. Либо вы неправильно составили формулу либо кривой физический двиг.
В натурале каждую секунду авиалайнер(с отключенными двигателями) должен ускорятся на 9.8 метров, то есть через 100 секунд свободного fallа - скорость падения будет 980 метров.
Правда нельзя ещё недооценивать такие вещи как - сопротивление воздуха при падении, плотность этого воздуха, влажность, направление ветра. скорость ветра, наличие облаков, место где происходит полёт, Широта, высота над уровнем моря, и ещё тысяча и один параметр...
wild_r писал(а):Круто, вот только есть несколько моментов:
1) Управление поагрессивнее
2) Винты? Или турбина? Если турбина, то нужно тягу двигателя сделать почти константной, а то мертвую петлю нереально сделать.
wild_r писал(а):Да, понял, не хватает закона сохранения импульса.
DzumoHu4 писал(а):wild_r писал(а):Да, понял, не хватает закона сохранения импульса.
А каким ты макаром прибабахал к Кукурузнику Закон сохранения количества движения?
Речь идёт не о Реактивном движении, а о Винтовом.
Говоря по русски В Реактивном самолёте реактивная струя толкает самолёт - (Вспомнилось - "Гоблин птица гордая - пока не пнёшь не полетит" )
В Самолёте где движущей силой является пропеллер, этот самый пропеллер тянет самолёт за собой.
Вот некоторые вещи которые возможны в реактивном самолёте
Особенно обратите внимания на моменты 1.96 - 2.40 минут.(Вроде остановки, зависания, прокручиваний и прочих финтов.
/* Класс описывающий упровление самолётом. */
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());
}
}
/* Класс описывающий упровление самолётом. */
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"));
}
}
Сейчас этот форум просматривают: Yandex [Bot] и гости: 18