세점의 방향 판단

점 A, B, C 가 있을 때, 좌표에 따라서 CW( 시계방향 ), CCW(  반시계 방향 )이 될 수있다.
방향을 판단 할려면, 벡터의 외적을 이용하면 된다.

오른손 법칙에 의해 세 점의 방향이 시계방향이면 벡터의 외적은 음수(-)가 되고 시계 반대 방향이면 양수(+)가 된다.
 

벡터 v1 = ( 점B - 점A ) = (Bx - Ax,  By - Ay, 0 )
벡터 v2 = ( 점C - 점A ) = (Cx - Ax, Cy - Ay, 0 )

결과)   벡터 v1과 v2의 외적  = v1 X v2 = ( 0, 0, BxCy - AyBx - AxCy - ByCx + AxBy + AyCx )

결과 식에 의해 Z 성분이 양수(+)이면 반시계 방향, 음수(-)이면 시계 방향이 된다.

 

다이렉트 X 함수를 이용해 세점의 노멀 값을 구해 보자.

void ComputeNormal( D3DXVECTOR3* out, D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2 )

{

    D3DXVECTOR3 u = *p1 - *p0; 

    D3DXVECTOR3 v = *p2 - *p0;

 

      D3DXVec3Cross(out, &u, &v);

      D3DXVec3Normalize(out, out);

}

 

    // 여기서 테스트 한다.

    D3DXVECTOR3 out;

    D3DXVECTOR3 p0 = D3DXVECTOR3( -1, -1, 0 );

    D3DXVECTOR3 p1 = D3DXVECTOR3( -1,  1, 0 );

    D3DXVECTOR3 p2 = D3DXVECTOR3(  1,  0, 0 );

 

    ComputeNormal( &out, &p0, &p1, &p2 ); //0, 0, -1 왼손 좌표계에서는 시계방향으로 구한다.

    ComputeNormal( &out, &p0, &p2, &p1 ); //0, 0, 1 오른손 좌표계에서는 반시계방향으로 구한다.

똑 같은 점이지만 시계 방향으로 구하면 z 값이 음수가 나오지만, 오른손 좌표계인 반시계 방향으로 계산하면 z값은 양수가 나온다.

왼손과 오른손 좌표계에 따라 노멀 값을 구할떄는 회전 방향이 다르다.