web-dev-qa-db-ja.com

Unity3Dで2つのベクトル間の実際の角度を計算する

Unityで2つの3Dベクトル間の実際の角度を計算する方法はありますか? Vector3.Angleは、2つのベクトル間の最短角度を示します。時計回りに計算された実際の角度を知りたい。

10
shaveenk

これはあなたが必要とするものでなければなりません。 abは、角度を計算するベクトルです。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を再利用し、平面法線nabの外積(垂直ベクトル)の間の角度の大きさから符号を計算します。

18
Jerdak

足し算と引き算を使えば簡単です。これを見てください:

/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にするには、この式を使用します。 「180angle | +180」は角度が負であることをすでに知っているので、「180-(-angle)+180」を使用して、180の「360 + angle」を追加します。次に、時計回りの場合は---([〜#〜] continue [〜#〜]ですが、反時計回りの場合は角度を負にします。これは、360度の他の部分(の補数)によるものです。 360 +角度)は「36060 +角度)」または「360-360-角度」OR "(360-360)-角度"であり、ここでも---([ 〜#〜]または[〜#〜] "-angle"。では、完成した角度で​​す。

1
Kino Bacaltos