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번)

반응형

+ Recent posts