µÎ º¤ÅÍ°¡ ÀÌ·ç´Â °¢µµ´Â ³»Àû¿¡ ÀÇÇؼ ±¸ÇÒ ¼ö ÀÖ´Ù.
³»Àû
1.
U dot V =
|U| * |V| * cos ¥È
2.
U dot V =
(Ux * Vx) + (Uy * Vy) + (Uz * Vz)
|
( U dot V = 0 )°á°ú°¡ 0ÀÌ¸é µÎº¤ÅÍ°£ÀÇ
µÎº¤ÅÍ°£ÀÇ °¢µµ´Â 90µµÀÌ´Ù.
( U dot V < 0 ) °á°ú°¡ 0º¸´Ù ÀÛÀ¸¸é µÎº¤ÅÍ°£ÀÇ °¢µµ´Â 90µµº¸´Ù
Å©´Ù.
( U dot V > 0 ) °á°ú°¡ 0º¸´Ù Å©´Ù¸é µÎº¤ÅÍ°£ÀÇ °¢µµ´Â 90º¸´Ù
ÀÛ´Ù.
U, V º¤Å͸¦ ´ÜÀ§ º¤ÅÍ·Î ¸¸µé¸é |U|, |V| °ªÀº 1ÀÌ µÇ¹Ç·Î ³»ÀûÀÇ °ø½ÄÀº ´Ü¼øÈ
µÈ´Ù.
Áö±Ý ºÎÅÍÀÇ U, V º¤ÅÍ´Â ´ÜÀ§ º¤ÅÍ¶ó °¡Á¤ÇÑ´Ù.
U dot V = cos ¥È =
(Ux * Vx) + (Uy * Vy) + (Uz * Vz)
cos ¥È = (Ux * Vx) + (Uy * Vy) + (Uz * Vz)
theta =
acos [ (Ux * Vx) + (Uy * Vy) + (Uz * Vz) ]
|
theta¸¦ ¶óµð¾È¿¡¼ µµ ´ÜÀ§·Î ¹Ù²Ü·Á¸é theta = theta
* 180 / 3.141592654
U , V º¤ÅÍ°¡ ´ÜÀ§ º¤ÅÍ°¡ ¾Æ´Ï¶ó¸é ³»ÀûÀÇ °ø½Ä¿¡ ÀÇÇØ °è»êÇÏ¸é µÈ´Ù.
acos(-1) ~ acos(1)À» ¶óµð¾ÈÀ¸·Î Ç¥½ÃÇϸé 0 ~ ÆÄÀ̸¦ ÀǹÌÇÑ´Ù.
acos(-1) = 0 ---> 0µµ
acos(0) = ÆÄÀÌ / 2 ---> 90µµ
acos(1) = ÆÄÀÌ ---> 180µµ
ÀÌ·¸°Ô ÇÏ¸é °¢µµ´Â ±¸ÇÒ ¼ö ÀÖÁö¸¸ °¢µµ´Â 0~180µµ¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â´Ù. 0~360µµ ¹üÀ§¸¦ ±¸ÇÒ·Á¸é ¿ÜÀûÀÇ
Z¼ººÐÀ» ÀÌ¿ëÇÑ´Ù. µÎº¤ÅÍÀÇ °¢µµ°¡ 180~360 ¶Ç´Â -180~0ÀÌ¸é ¿ÜÀûÀÇ Z°ªÀº 0º¸´Ù ÀÛ´Ù.
¿ÜÀûÀº Z¼ººÐÀº (ax*by) - (ay*bx) ·Î ±¸ÇÒ ¼ö ÀÖ´Ù.
#include
"stdafx.h"
#include
<d3dx9.h>
#include
<iostream>
using
namespace std;
float
GetAngle( const D3DXVECTOR3& a, const D3DXVECTOR3& b )
{
float cosAngle = acosf(
D3DXVec3Dot(&a, &b) / (D3DXVec3Length(&a) *
D3DXVec3Length(&b)) );
cosAngle =
D3DXToDegree( cosAngle );
//¿ÜÀûÀÇ z¼ººÐÀ¸·Î ¹æÇâÀÌ °áÁ¤µÈ´Ù.
float angle = (a.x * b.y - a.y * b.x
> 0.0f) ? cosAngle : -cosAngle;
return angle;
}
int
_tmain(
int argc, _TCHAR*
argv[])
{
D3DXVECTOR3
a(1.0f, 1.0f, 0.0f);
D3DXVECTOR3
b(1.0f, 0.0f, 0.0f);
float angle = GetAngle( a, b );
cout <<
angle << endl; //°á°ú°ªÀº -45°¡ ³ª¿Â´Ù.
return 0;
}
|
¾Æ·¡ ÄÚµå´Â À¯´ÏƼ¿ë ÄÚµåÀÌ´Ù.
public float ContAngle(Vector3 fwd, Vector3 targetDir)
{
float angle = Vector3.Angle(fwd, targetDir);
if (AngleDir(fwd, targetDir, Vector3.up) == -1)
{
angle = 360.0f - angle;
if (angle > 359.9999f)
angle -= 360.0f;
return angle;
}
else
return angle;
}
public int AngleDir(Vector3 fwd, Vector3 targetDir, Vector3 up)
{
Vector3 perp = Vector3.Cross(fwd, targetDir);
float dir = Vector3.Dot(perp, up);
if (dir > 0.0)
return 1;
else if (dir < 0.0)
return -1;
else
return 0;
}
//Å×½ºÆ®
Vector3[] A = new Vector3[5];
Vector3[] B = new Vector3[5];
A[0] = new Vector3(3, 0, 0); B[0] = new Vector3(5, 5, 0); //45
A[1] = new Vector3(3, 4, 0); B[1] = new Vector3(-8, 6, 0); //90
A[2] = new Vector3(5, 6, 0); B[2] = new Vector3(-1, 4, 0); //53
A[3] = new Vector3(5, 6, 0); B[3] = new Vector3(-1, 4, 0); //53
A[4] = new Vector3(3, 5, 0); B[4] = new Vector3(-1, 6, 0); //40
for (int n = 0; n < A.Length; ++n)
{
float a = ContAngle(A[n], B[n]);
Debug.Log("Angle " + a + " VectorA: " + A + "
VectorB: " + B);
}
|
ÂüÁ¶ :
http://djmilk.nazoa.net/
http://beeswing.net/
http://sekainonaka.tistory.com/164
|