Graphics/DirectX

Direct 3D - 벡터

MOLOKINI 2014. 6. 19. 15:37
벡터의 길이와 단위벡터
벡터에는 크기와 방향이 있다.
크기가 1인 벡터를 단위벡터라고한다.
임의의 벡터를 크기가 1인 단위벡터로 만드는 것을 정규화 한다고 한다.

임의의 벡터를 단위벡터로 정규화 하는 수식은 다음과 같다.
원점 o(0,0,0)에서 점 p(x,y,z)로 향하는 벡터 op혹은 P(x,y,z)에 대해 길이 L = |op| = 루트(x^2 + y^2 + z^2)로 정의하고 단위벡터 v=(x/L, y/L, z/L)로 표시한다
 




두 점으로 정의한 벡터
점Q에서 점P로의 벡터 v는 q-p로 표시한다.
그림을보자

 이거는 3차원에서도 똑같이 적용됩니다. 자주나오죠?



벡터연산

2개의 벡터 p(Xp, Yp, Zp), q(Xq, Yq, Zq)와 상수 c가 있다고 할 때 다음과 같은 연산을 정의할 수 있다.

1. 덧셈

  - p + q = (Xp, Yp, Zp) + (Xq, Yq, Zq) = (Xp + Xq, Yp + Yq, Zp + Zq)

2. 스칼라 곱셈

  - c ⓧ p = (CXp, CYp, CZp)

3. 내적

  - pㆍq = XpXq + YpYq + ZpZq = |p||q|cos세타

4. 외적

  - p×q = (PyQz - PzQy, PzQx - PxQz, PxQy - PyQx)

5. 뺄셈 : 덧셈과 스칼라 곱셈의 조합

  - p - q = p +(-1)ⓧq


사실상 중요한건 내적과 외적이다!

내적은 일반적으로 두 벡터 사이의 각이 90도 이상인가를 판단하는 중요한 값이다.

cos 그래프를 생각하면 알기 쉽겠지만, 

cos는 0과 90사이, 270과 360사이에서만 양의 값을 갖는다.

이런 성질을 이용하여 인간의 눈에 해당하는 시선벡터와 물체의 면과 직교하는 법선벡터와의 내적값을 구하여 그 값이 양수일 경우에만 화면에 표시하는 은면제거에 사용된다.


내적 연산은 3D그래픽 전반에 걸쳐 가장 빈번하게 사용되는 유용한 연산이므로 수식 자체를 통째로 암기해두자!

외적 연산은 수식을 외울 필요 없이 필요할 때 함수 호출만 사용해도 되지만, 내적은 결코 그렇지 않아, HLSL이나 Cg를 사용해 정점 셰이더와 픽셀 셰이더를 프로그램할 때 필수적으로 내적 연산이 필요하게 된다. 내적은 연산 자체의 정의도 유용할 뿐만 아니라, 연산의 결과 또한 중요하다는걸 잊지말자.


외적연산의 가장 큰 특징은 연산 결과가 2개의 벡터와 직교하는 벡터값으로 나온다는 사실이다.

 

 이렇게

3차원 공간에서는 세개의 점 혹은 2개의 벡터에 의해 면이 생성되는데, 이 때 2개의 벡터를 외적연산하면 면의 법선벡터를 구할 수 있다.

벡터 op, oq (o : 원점)가 면(삼각형 opq)을 생성하고, 이 면 opq의 법선 벡터가 P x Q인 것이다. 이 법선벡터와 시선벡터를 내적연산하여 나온 결과값으로 화면 출력 여부를 결정하게 된다..

 


내적 연산의 유용한 성질

내적연산은 3D 그래픽 전반에 걸쳐 사용되는데, 그 중 특히 좌표계 변환과 조명 계산에 많이 사용된다.

조명 계산에서는 광원과 메시 표면의 법선 벡터간의 내적 연산만으로도 상당히 그럴듯한 조명이 만들어져

어떠한 벡터를 새로운 좌표계로 변환하고자 한다면 새로운 좌표계의 축 벡터를 원하는 벡터에 내적 연산해주면 새로운 좌표계의 벡터로 변환된다는 것이다.


문제 : 벡터 V = (Vx, Vy, Vz)를 새로운 좌표계 P = (Px, Py, Pz), Q = (Qx, Qy, Qz), R = (Rx, Ry, Rz)에 맞추어 변환하라. PQR은 기저벡터(basis vector)이다.

답 : 변환된 벡터를 V' = (V'x, V'y, V'z)라고 하면 연산과정은 다음과 같다.

  V'p = PㆍV = (PxVx + PyVy + PzVz)

  V'q = QㆍV = (QxVx + QyVy + QzVz)

  V'r = RㆍV = (RxVx + RyVy + RzVz)

'Graphics > DirectX' 카테고리의 다른 글

Direct 3D - 행렬  (0) 2014.06.19
Direct 3D - 행렬기초  (0) 2014.06.19
Direct 3D - 프레임워크  (0) 2014.06.19
Direct 3D - *인덱스 버퍼  (0) 2014.06.19
Direct 3D - *메시  (0) 2014.06.19