http://egohim.blog.me/70012169260
vector의 cross product를 사용하면 될 것 같습니다.
먼저 두 벡터 사이의 각도는 사실 0~180밖에 나올수 없지만, 0~360가 나오도록 한다면 기준이 있어야할 것입니다.
기준1. vector a(기준)에서 vector b까지의
기준2. 시계 방향(기준) 혹은 시계 반대방향(기준)
위의 기준은 cross product의 순서로 정할 수 있는 것 같네요.
vector a에서 vector b로의 각도가 [0,180]이면
vector a와 vector b이 cross product의 z값은 0과 같거나 크고
vector a에서 vector b로의 각도가 (180,360) 또는 (-180,0) 이면
vector a와 vector b이 cross product의 z값은 0보다 작을 것입니다.
vector a=(ax, ay, az)
vector b=(bx, by, bz)
일 때 cross product(axb)의 z-component는 -ay bx + ax by이므로
아래와 같이 하면 가능하겠네요.
float cosAng1 = DotProduct(vector1, vector2);
return (vector1.y*vector2.x + vector1.x*vector2.y > 0.0f) ? (float)(acos(cosAng1)) : - (float)(acos(cosAng1));
실제로 곱하기 계산도 한번 줄었네요.(dot product-> 곱하기 3번 ---> 곱하기 2번)
[출처] 두 벡터 사이의 각|작성자 수양버들
'수학 (Mathematics) > 3D수학' 카테고리의 다른 글
베지어 곡선(Bezier Curve) 유도와 설명 (1) | 2012.11.02 |
---|---|
3차 곡선, 에르미트 곡선 도출에서 근사적 좌표프레임까지 얻어내기 (0) | 2012.11.02 |
벡터 미적분, 접선과 가속도 - 공간 곡선 (0) | 2012.11.02 |
두직선의 교점 (0) | 2012.11.02 |
사각형 무게중심 (0) | 2012.11.02 |