기본 콘텐츠로 건너뛰기

라벨이 Angle between Vectors인 게시물 표시

[D3DBASIC] 두 벡터 사이의 각도 참조 자료 정리

수양버들's | 수양버들 http://blog.naver.com/egohim/70004640696  데브피아 에서 인용한 글입니다. 방식 1-1.  두 벡터의 Radian값을 구하고        1-2.  두 벡터의 외적을 구해 나온 값을 Axis의 x, y, z를 기준으로        1-3.  쿼터니언 공식에 대입 inline void __Quaternion::RotationSetFromVectorAToVectorB(const __Vector3& vA, const __Vector3& vB) { //vA와 vB의 사이각을 구한다. float fRadian = acosf(vA.Dot(vB) / (vA.Magnitude() * vB.Magnitude())); //완전히 정반대벡터이면 외적 축을 구할수 없기때문에 보정한다. __Vector3 vA2(vA); if(D3DX_PI - fRadian < 0.0005f) vA2 += 0.0005f; //vA와 vB에 직교하는 벡터를 구한다.(cross) __Vector3 vCross; vCross.Cross(vA2, vB); vCross.Normalize(); //vCross를 기준으로 fRadian만큼 회전하는 행렬을 만든다. this->RotationAxis(vCross, fRadian); } inline void __Quaternion::RotationAxis(const __Vector3& v, float fRadian) { //D3DXQuaternionRotationAxis(this, &v, fRadian); this->RotationAxis(v.x, v.y, v.z, fRadian); } inline void __Quaternion::RotationAxis...

두 벡터 사이의 각도

두 벡터 사이의 각도는 아래의 식으로 계산이 가능합니다. $$ a = acos(\frac{\vec{A}\cdot\vec{B}} {|\vec{A}||\vec{B}|}) , (0 ≤ a ≤ 180) $$ 각도의 부호 판별 $\vec{A}$를 $\vec{Z}$에 맞추기 위해서는 a 만큼 회전을 시켜야 하고, $\vec{B}$를 $\vec{Z}$에 맞추기 위해서는 -a만큼 회전을 시켜야 합니다. 하지만 위의 공식으로는 둘다 a은 구할 수 있지만. 각도의 부호를 판별하지는 못합니다. 각도의 부호 판별은 $\vec{A}\times\vec{Z}$의 값이 양의 값이면 양의 부호를 음의 값이면 음의 부호를 붙이면 됩니다. 이 공식을 이용해 2D 평면상에서 임의의 벡터의 각도를 구해보면, X축의 각도가 $0^{\circ}$ 이므로 X축과 $\vec{A}$와의 사이각을 구합니다. 부호를 판별하기 위해 X축과 $\vec{A}$와의 외적을 구해 그 값이 음이면 앞에서 구한 사이각에 음의 부호를 붙이면 됩니다. a = acos(<X>·<A> / |X||A|) , (0 <= a <= 180) cross = <X> x <A> if cross < 0 then a = -a endif