µÎº¤ÅÍ »çÀÌÀÇ °¢µµ ±¸Çϱâ

µÎ º¤ÅÍ°¡ ÀÌ·ç´Â °¢µµ´Â ³»Àû¿¡ ÀÇÇؼ­ ±¸ÇÒ ¼ö ÀÖ´Ù.

³»Àû

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