Расчет фактического угла между двумя векторами в 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