3D 기본 용어 설명 1

 

 * 버텍스 (Vertex)

버텍스는 일반적으로 점을 말합니다.. 즉, (x, y, z) 의 형식으로 나타내어지는 공간상의 한 정점.

사용자 삽입 이미지

 * 벡터 (Vector)

벡터는 주로 물리나 수학에서 나오는데, 특히 물리에서는 힘의 크기와 방향을 나타내기 위해 사용 합니다. 즉, 벡터는 크기와 방향을 한번에 나타내는 것이죠.

사용자 삽입 이미지

위의 그림을 보면 3개의 벡터가 나와 있습니다.. 여기서 벡터의 길이, 즉 그림에서 화살표의 길이 가 벡터의 크기를 나타냅니다. 벡터의 방향은 물론 화살표의 방향이죠.

그런데 이 3개의 벡터들은 벡터의 크기(= 화살표의 길이)가 모두 같고, 방향도 모두 같습니다. 따라서 3개 벡터 모두 같은 벡터라고 볼 수 있는 것이죠.

즉, 벡터는 시작점의 위치와는 아무런 상관이 없습니다.(매우중요)

사용자 삽입 이미지사용자 삽입 이미지

   

그런데, 벡터들을 보면 모두 시작점과 끝점이 있는데. 그럼 두 점이 주어져 있을 때 벡터를

어떤식으로 나타낼 수 있을까요. 걍 빼주면 됩니다..^^; 긍께 두 점 P1과 P2가 있을 때,

벡터 V1 = P2 - P1이 성립하게 됩니다.. 여기서 빼는 점(능동) P1이 시작점,

빼지는 점(수동) P2가 끝점이 됩니다. 함 좌표를 넣고 해보자면,

먼저 점 P1을 (0,0) 이라고 놓으면, 점 P2는 (2,1) 이 되겠죠..

그럼 P2 - P1 = (2,1) - (0,0) = (2,1) 이 되므로, 벡터 V1은 (2,1)이 됩니다..

또, V1의 크기는 2*2 + 1*1 의 제곱근이므로 루트5 가 되겠네요..

그리고 반대로 P1 - P2를 하면 (0,0) - (2,1) = (-2,-1) 이 되는데, 이는 벡터 V1에 마이너스를

붙인 것과 같죠.. 곧 V1과 크기는 같고 방향은 반대인 벡터가 되는 것입니다..

그리고 벡터는 시작점과 상관이 없다고 했으므로.. 위의 그림에서 빨간 벡터와 회색 벡터

모두 P2 - P1, 즉 V1 과 같은 벡터를 나타내는 것입니다..


 * 내적 (Dot Product)

벡터의 내적에 대해선 고등학교 수학2 교과서에 잘 나와있는데요.. 벡터의 내적이란

벡터끼리의 곱을 의미합니다.. 곱을 할 때는 x좌표는 x좌표끼리, y좌표는 y좌표끼리

곱하고 나중에 모두 더하면 됩니다.. 예를 들어, 벡터 (1,2)와 벡터 (3,4) 가 있을 때 내적을

구하면, 1*3 + 2*4 = 11 즉 내적은 11이 됩니다.. 또한, 이 내적은 다른 방법으로도 구할 수가

있는데, 벡터 (1,2)의 길이 * 벡터(3,4)의 길이 * 두 벡터의 코사인값을 해도 내적11이 나옵

니다..그런데 이 벡터의 내적을 과연 어디에다 쓸 수 있을까요.. 뭐 생각하기에 따라 여러

가지가 있지만,한 가지만 예를 들어보겠습니다.. 우선, 내적값을 화면에 렌더링을 할 필요가

없는 폴리곤들을 검사하는데쓸 수 있습니다.. 뭔 말이냐면, 폴리곤들을 렌더링할 때 모든

면을 렌더링하는 것은 효율적이지못합니다.. 이를 위해, 폴리곤의 앞면만 렌더링하고 뒷면은

렌더링을 하지 않는 방법이 많이 쓰이는데,

그런 폴리곤들을 구별할 때 벡터의 내적을 사용할 수 있습니다..

사용자 삽입 이미지

( 위 그림은 Mr GameMaker 사이트에 있는 강좌에 나와있는 그림을 약간 수정한 것입니다..^^; )

위 그림에 두 개의 폴리곤이 나와 있는데, 화살표로 표시된 n1과 n2는 각각 폴리곤의 법선

벡터를나타냅니다.. 즉, 왼쪽의 꾸리꾸리한 색의 폴리곤은 현재 앞면이 카메라를 향해 있는

것이고,오른쪽의 푸르딩딩한 폴리곤은 앞면이 카메라를 향하고 있지 않은 것입니다.. 따라서

왼쪽의 경우와같은 폴리곤들은 렌더링을 하고 오른쪽 경우와 같은 것은 렌더링을 하지 안

으면 됩니다..이를 구별하는 방법은, 먼저 폴리곤의 아무 점이나 한 점 예를 들어 P1을 잡

습니다.. 그리고 현재 카메라의 위치를 빼면 벡터 V1을 얻을 수 있습니다..

( V1 = P1 - Camera위치 )

이렇게 얻은 벡터와 그 폴리곤의 법선벡터와의 내적을 구하면 이를 이용해 렌더링 할지 말

지를 결정할 수가 있는 것입니다.. 만약 내적이 0보다 작으면 왼쪽 폴리곤처럼 보이는 상

태이므로렌더링을 하면 되고, 내적이 0보다 크다면 오른쪽 폴리곤의 경우이므로 렌더링을

하지 않아도 됩니다..그런데 내적의 부호에 따라 저렇게 나뉘는 이유가 뭘까요..

아까 내적은 '벡터1의 길이 * 벡터2의 길이 * 두 벡터의 코사인값' 이라고 했습니다.. 여기서 벡터들의

각각의 길이는 모두 양수값만 가지지만 두 벡터의 코사인값은 사잇각에 따라 양수도 되고

음수도 될 수 있죠.. 즉, 벡터 V1과 폴리곤의 법선벡터의 사잇각에 따라 나뉜다는 말입니다..

사용자 삽입 이미지

( 위 그림은 Mr GameMaker 사이트에 있는 강좌에 나와있는 그림 일부를 그대로 짤라온 것입니다..^^; )

 왼쪽 꾸리꾸리한 폴리곤의 법선벡터를 움직여서 시작점을 카메라 갖다 대봅시다.. 벡터는

시작점과 아무 상관이 없다고 했으므로 어디로든 옮길 수 있습니다.. 이렇게 옮기고 보면..

바로 위 그림의 왼쪽과 비슷한 상태가 되죠.. 즉, 검은선은 법선벡터, 빨간선은 벡터V1입

니다..그런데 이 두 벡터의 사잇각이 90도 보다 크죠.. 그러므로 내적의 값이 (-)값이 되는

겁니다..

왜냐구요??.. 코사인은 1,2,3,4 사분면에서 각각 (+), (-), (-), (+) 값을 가지잖아요.. (얼싸

안코..^^:)근데 사잇각이 90도 보다 크므로 1사분면이 아니죠.. 따라서 내적이 (-)값이 되는

겁니다..

사용자 삽입 이미지

( 다시 그림보러 올라가는 구적거림을 없애기 위해 한번 더 삽입..!! )

이번엔 오른쪽 푸르딩딩한 폴리곤을 봅시다..

마찬가지로 폴리곤위의 점 P2에서 카메라 위치를 빼면 벡터 V2를 얻습니다..

또 마찬가지로 법선벡터 n2를 살짝 옮겨서 카메라 위치에 갖다 대면.. 위에 위에 그림에서

오른쪽과비슷하게 되죠.. 두 벡터의 사잇각이 90도 보다 작으므로 1사분면.. 따라서 코사

인값은 (+) 값을가지게 되고, 내적값 또한 (+) 값을 가지는 것입니다..

괜히 장황하게 설명 했지만 이해하시는 데는 별 무리가 없을거라 생각됩니다..

 

 * 외적 (Cross Product)

어떤 벡터 2개가 있을 때 그 두 벡터에 대해 수직인 제3의 벡터를 외적이라고 합니다..

예를 들면, 공간상의 Z축은.. X축, Y축에 외적인 벡터라고 생각하셔도 됩니다..

수식으로 나타내자면, 벡터 v1, v2 의 외적벡터를 V라고 하면

V.x  = v1.y * v2.z - v1.z * v2.y

V.y  = v1.z * v2.x - v1.x * v2.z

V.z  = v1.x * v2.y - v1.y * v2.x

이와 같이 나타낼 수 있습니다.. 그럼 이 벡터의 외적을 어디에 쓸 수 있을까요..

대표적으로 폴리곤의 법선벡터를 구하는 데에 쓸 수 있습니다..

사용자 삽입 이미지

( 폴리곤의 법선 벡터 (푸르딩딩한 화살표..) )

폴리곤의 법선벡터가 뭔지는 다 아시죠?? ^^; 폴리곤의 법선벡터란 그 폴리곤이 속해 있는

평면에 수직인벡터를 말합니다.. 그러니까 폴리곤이 쳐다보고 있는 방향이라고 생각하시면

되죠.. 이 법선벡터를 구하기 위해서는 폴리곤에 속해 있는 세 점만 알고 있으면 됩니다..

 그 점들을 P1, P2, P3라고 합시다..위 그림엔 삼각형으로 나와있는데..꼭 삼각형이 아니어도

괜찮습니다..사각형이든 오각형이든.. 세 점만 알면 똑같이 써먹을 수 있죠..어차피 모두

같은 평면상의 점이므로..아무튼 세 점을 안 후에 벡터 2개를 만들 수 있습니다..

그 벡터들을 V1, V2라고 하면..

V1 = P2 - P1

V2 = P3 - P1

어떤 벡터들인지 아시겠죠??..

V1은 시작점이 P1, 끝점이 P2인 벡터고..(P1에서 P2로 화살표..)

V2는 시작점이 P1, 끝점이 P3인 벡터입니다..(P1에서 P3로 화살표..)

이제 벡터 V1, V2의 외적벡터를 구하면 그것이 바로 폴리곤의 법선벡터가 되는 것입니다..

소스로 나타내보면..(편의상 DirectX 소스로..)

D3DXVECTOR3 v1 = p2 - p1;

D3DXVECTOR3 v2 = p3 - p1;

D3DXVECTOR3 vNormal = D3DXVec3Cross( v1, v2 );

이렇게 됩니다..vNormal 이 법선벡터가 되는 것이죠..

D3DXVec3Cross 함수는 실제 DirectX에 있는 외적벡터를 구하는 함수인데..

저기 쓴거랑은 약간 틀립니다..(파라미터가 하나 빠짐..)

실제로.. 법선벡터를 구하는 것은 3D 플밍을 할 때 많은 곳에서 쓰이므로

꼭 알아두셔야 할겁니다..

신고

'Computer_Graphics' 카테고리의 다른 글

벡터 외적  (0) 2007.03.14
벡터(외적,내적,법선)  (2) 2007.03.14
법선 벡터 구하기  (0) 2007.03.14
시어핀스키 삼각형  (0) 2007.03.14
Posted by Real_G