Advertisement
Guest User

Unity Drone Stabiliser

a guest
Apr 28th, 2015
2,362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.26 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. [RequireComponent(typeof(Rigidbody))]
  5. public class Drone : MonoBehaviour
  6. {
  7.     const float MAX_FORCE = 50;
  8.     const float MAX_TILT = 60;
  9.     const float STEER_FORCE = .05f;
  10.     const float MAX_SPIN = .5f;
  11.     Vector3 frontLeft, frontRight, rearLeft, rearRight;
  12.  
  13.     Rigidbody body;
  14.     Transform mTransform;
  15.     void Awake()
  16.     {
  17.         body = GetComponent<Rigidbody>();
  18.         mTransform = GetComponent<Transform>();
  19.         frontLeft = new Vector3(-mTransform.localScale.x, 0, mTransform.localScale.x);
  20.         frontRight = new Vector3(mTransform.localScale.x, 0, mTransform.localScale.x);
  21.         rearLeft = new Vector3(-mTransform.localScale.x, 0, -mTransform.localScale.x);
  22.         rearRight = new Vector3(mTransform.localScale.x, 0, -mTransform.localScale.x);
  23.     }
  24.  
  25.     // Update is called once per frame
  26.     void FixedUpdate ()
  27.     {
  28.         float forward = Input.GetAxis("Vertical");
  29.         float right = Input.GetAxis("Horizontal");
  30.         float up = Input.GetAxis("Trigger") * 20;
  31.         float spin = Input.GetAxis("Horizontal2") * 3.5f;
  32.  
  33.         Vector3 orientation = mTransform.localRotation.eulerAngles;
  34.         orientation.y = 0;
  35.         FixRanges(ref orientation);
  36.  
  37.         Vector3 localangularvelocity = mTransform.InverseTransformDirection(body.angularVelocity);
  38.  
  39.         float velY = body.velocity.y;
  40.  
  41.         float desiredForward = forward * MAX_TILT - ( orientation.x + localangularvelocity.x * 15 );
  42.         float desiredRight = -right * MAX_TILT - ( orientation.z + localangularvelocity.z * 15 );
  43.         float desiredSpin = spin - localangularvelocity.y;
  44.  
  45.         ApplyForces( desiredForward / MAX_TILT, desiredRight / MAX_TILT, up - velY, desiredSpin );
  46.     }
  47.  
  48.     void ApplyForces( float forward, float right, float up, float spin )
  49.     {
  50.         //need to maintain this level of upwards thrust to gain/lose altitude at the desired rate
  51.         float totalY = Mathf.Min( (up * 100) + 9.81f, MAX_FORCE );
  52.  
  53.         if (totalY < 0) totalY = 0;
  54.  
  55.         //distribute according to forward/right (which are indices based on max tilt)
  56.         //front left
  57.         body.AddForceAtPosition( mTransform.up * ( totalY * .25f - forward * STEER_FORCE - right * STEER_FORCE ), mTransform.position + mTransform.TransformDirection( frontLeft ) );
  58.  
  59.         //front right
  60.         body.AddForceAtPosition( mTransform.up * ( totalY * .25f - forward * STEER_FORCE + right * STEER_FORCE ), mTransform.position + mTransform.TransformDirection( frontRight ) );
  61.  
  62.         //rear left
  63.         body.AddForceAtPosition( mTransform.up * ( totalY * .25f + forward * STEER_FORCE - right * STEER_FORCE ), mTransform.position + mTransform.TransformDirection( rearLeft ) );
  64.  
  65.         //rear right
  66.         body.AddForceAtPosition( mTransform.up * ( totalY * .25f + forward * STEER_FORCE + right * STEER_FORCE ), mTransform.position + mTransform.TransformDirection( rearRight ) );
  67.    
  68.         spin = Mathf.Min(MAX_SPIN, spin);
  69.  
  70.         //Front
  71.         body.AddForceAtPosition( mTransform.right * spin, mTransform.position + mTransform.forward );
  72.         //Rear
  73.         body.AddForceAtPosition( -mTransform.right * spin, mTransform.position - mTransform.forward );
  74.     }
  75.  
  76.     void FixRanges( ref Vector3 euler )
  77.     {
  78.         if (euler.x < -180)
  79.             euler.x += 360;
  80.         else if (euler.x > 180)
  81.             euler.x -= 360;
  82.  
  83.         if (euler.y < -180)
  84.             euler.y += 360;
  85.         else if (euler.y > 180)
  86.             euler.y -= 360;
  87.  
  88.         if (euler.z < -180)
  89.             euler.z += 360;
  90.         else if (euler.z > 180)
  91.             euler.z -= 360;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement