2014-10-25 6 views
0

Я пытаюсь вычислить правильный угол, который должен использовать мой пушка, чтобы попасть в целевую точку. В приведенном ниже коде всегда устанавливается угол 90 градусов. Я использую C# и Unity. Любые предложения о том, что я делаю неправильно?Точка удара с помощью снаряда

 double x = -(source.x - position.x); 
     double y = (source.y - position.y); 
     double v = 500; //m/s 
     double g = Physics2D.gravity.y; 
     double sqrt = (v * v * v * v) - (g * (g * (x * x) + 2 * y * (v * v))); 
     sqrt = Math.Sqrt(sqrt); 
     double angleInRadians = Math.Atan2(((v * v) + sqrt), (g * x)); 

     double degrees = angleInRadians * Mathf.Rad2Deg; //This is always 90 
     Vector3 angle = new Vector3(0,180,(float)degrees); 

     _cannon.transform.localEulerAngles = angle; 
+0

Там действительно нет необходимости использовать двойники здесь, вы можете придерживаться с поплавком только для простоты (и использовать 'Mathf.Sqrt() '). Какая ценность 'g'? –

+0

g - -9,81. Благодарю. – user1841016

ответ

0

Для тех, кто ищет решение этой проблемы, вот решение:

private float _power = 0.5f; 
    private float _mass = 0.5f; 
    private float _powerMultiplier = 2000f; //Adjust this to lower or raise max reach 

    public void Update() 
    { 
     Vector2 target = Global.Player1.CastlePosition; 
     Vector2 source = transform.position; 

     if (!CanHitCoordinate(source, target)) 
     { 
      _power += 0.01f; 
      return; 
     } 

     float angle = CalculateAngleToHitCoordinate(source, target); 
     Vector3 newAngle = new Vector3(0, 0, angle); 
     _cannon.transform.localEulerAngles = newAngle; 
    } 

    private float CalculateAngleToHitCoordinate(Vector2 source, Vector2 target) 
    { 
     float power = _power * _powerMultiplier; 
     float x = -(source.x - target.x); 
     float y = -(source.y - target.y); 


     float v = (power/mass) * Time.fixedDeltaTime; 
     float g = -Physics2D.gravity.y; //Needs to be positive 

     float sqrt = (v * v * v * v) - (g * (g * (x * x) + 2 * y * (v * v))); 
     sqrt = Mathf.Sqrt(sqrt); 

     double angleInRadians = Math.Atan((v * v + sqrt)/(g * x)); 
     return (float)angleInRadians * Mathf.Rad2Deg; 
    } 

    private float CalculateDelta(Vector2 source, Vector2 target) 
    { 
     float power = _power * _powerMultiplier; 
     float x = (source.x - target.x); 
     float y = -(source.y - target.y); 


     float v = (power/0.5f) * Time.fixedDeltaTime; 
     float g = -Physics2D.gravity.y; 
     return (v * v * v * v) - (g * (g * (x * x) + 2 * y * (v * v))); 
    } 

    public bool CanHitCoordinate(Vector2 source, Vector2 target) 
    { 
     return CalculateDelta(source, target) >= 0; 
    } 

Это для источника стрельбы к цели справа от него. Для того, чтобы стрелять в направлении цели на левой просто сделать эти два изменения в коде выше:

float x = (source.x - target.x); //Remove "-" 
Vector3 newAngle = new Vector3(0, 180, angle); //Point towards the left 
0

Согласно определению Mathf.Atan2:

Если у положительна и х равно 0, θ = π/2.

x является вторым параметром, так что ваши g * x результаты в 0. Базовая математика говорит нам, что это может быть, если любой или все операнды равны 0.

Так, в сущности, либо:

  • -(source.x - position.x) или
  • Physics2D.gravity.y

равно 0. Я предполагаю, что значение гравитации y здесь является преступником.

+0

'- (source.x - position.x) = -20.999755859375' и' Physics2D.gravity.y = -9.8100004196167' Проверено прямо перед моим уравнением. y часто может быть отрицательным, это важно? – user1841016

Смежные вопросы