Расчет фактического угла между двумя векторами в Unity3D

есть ли способ рассчитать фактический угол между двумя 3D-векторами в единстве? Метода Vector3.Угол дает самый короткий угол между двумя векторами. Я хочу знать фактический угол, рассчитанный по часовой стрелке.

3 ответов


это должно быть то, что вам нужно. a и b являются векторами, для которых вы хотите рассчитать угол,n будет нормалью вашей плоскости, чтобы определить, что вы называете "по часовой стрелке / против часовой стрелки"

float SignedAngleBetween(Vector3 a, Vector3 b, Vector3 n){
    // angle in [0,180]
    float angle = Vector3.Angle(a,b);
    float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));

    // angle in [-179,180]
    float signed_angle = angle * sign;

    // angle in [0,360] (not used but included here for completeness)
    //float angle360 =  (signed_angle + 180) % 360;

    return signed_angle;
}

для простоты я использовать Vector3.Angle а затем вычислить знак от величины угла между плоскостью нормальной n и поперечное произведение (перпендикулярный вектор)a и b.


Это легко, если вы просто использовать сложение и вычитание. Посмотрите на это:

/Degrees
  float signedAngleBetween (Vector3 a, Vector3 b, bool clockwise) {
  float angle = Vector3.angle(a, b);

  //clockwise
  if( Mathf.Sign(angle) == -1 && clockwise )
    angle = 360 + angle;

  //counter clockwise
  else if( Mathf.Sign(angle) == 1 && !clockwise)
    angle = - angle;
  return angle;
}

вот что я имею в виду: если мы по часовой стрелке и угол отрицательный, например -170 чтобы сделать его 180, вы используете это уравнение. "180-|угла|+180" вы уже знаете, что угол отрицательный, поэтому используйте "180 - (- angle)+180" и добавьте 180 "360 + angle". Тогда, если по часовой стрелке,дальше но если это против часовой стрелки, сделайте угол отрицательным, это потому, что другая часть угла 360 (это комплимент 360 + угол) - это "360 - (360 + угол)" или "360 - 360 - угол" или "(360 - 360) - угол" и, опять-таки, или "угол". Ну вот и все... ваш законченный угол.


попробуйте использовать Vector3.Angle(targetDir, forward);

Так как вы хотите самый короткий угол между ними, то, если возвращаемое значение больше 180 градусов, просто вычесть 360 градусов с этим значением.

проверить http://answers.unity3d.com/questions/317648/angle-between-two-vectors.html