DirectX

[DirectX] 벡터 3

FORHAPPy 2021. 12. 19. 22:35

벡터의 덧셈 연산을 하려면 

  1. 벡터의 합을 해주는 함수를 이용 : D3DXVECTOR# * D#DXVec3Add(_inout D3DXVECTOR3 *pOut, _in const D3DXVECTOR# * pV1, _in const D3DXVECTOR# *pV2); ->헤더 D3dx9math.h 라이브러리 : D3dx9.lib 포함
  2. 벡터의 연산자 오버로딩을 이용

벡터의 뺄셈을 하려면 

벡터에서의 부호는 방향은 반대고 크기는 같은 벡터를 의미 한다. 

  1. 벡터의 뺼셈을 해주는 함수를 이용 : D3DXVec3Subtract(_inout D3DXVECTOR3 *pOut, _in const D3DXVECTOR# * pV1, _in const D3DXVECTOR# *pV2);

벡터는 공간상의 한 점을 나타낸다. 점을 옮기고 싶을때는 ? 

정점을 이동시키기 위해서는 벡터의 합을 이용해야한다. a에서 b를 이동하려면 ① 벡터를 더해주면 된다. 

a에 ①을 더해주면 b의 정점이 나온다. (벡터의 합) 벡터의 이동을 위해 수학적인 도구를 사용하는 것


벡터의 크기 

시작점에서 끝점까지의 길이를 구하는것이 벡터의 크기이다. 

스칼라 값이 나온다. 구하는 이유 :  얼마만큼 원점에서 떨어져 있는가를 측정하기 위해서 

 

벡터의 크기를 구하는 함수 : FLOAT D3DXVec3Length(_in const D3DXVECTOR3 * pV); 

넣으면 벡터의 좌표를 넣으면 float형으로 값이 리턴된다. 


값과 벡터의 곱셈(값은 스칼라)

D3DXVECTOR3 * D3DXVec3Scale( _inout D3DXVECTOR3 * pOut, _in const D3DXVECTOR3 *pV, _in FLOAT s);

벡터를 곱해진 만큼의 정점으로 이동시킨다. 


역벡터 : 크기는 같으나 서로 반대인 벡터


단위벡터 (노멀라이즈, 정규화벡터) 

벡터의 크기가 1인 벡터이다. 단위벡터는 방향을 가진다. 방향 * 스칼라값을 하면 원하는 크기긔 벡터가 나온다. 

크기가 절반인 벡터를 구할때도 쓴다.  단위벡터로 만든후 크기의 절반을 곱해주면 된다. 

 

제공해주는 함수가 잇다

D3DXVECTOR3 * D3DXVec3Normalize(_inout D3DXVECTOR# *pOut, _in const D3DXVECTOR3 *pV);


벡터의 내적 (반드시 이해해야할 내용)

 

하나의 약속이며 정의다. 

①은 두벡터의 각과 크기를 알고 있을때 사용

②은 두벡터의 각은 모르고 성분을 알때 사용

 


벡터 내적의 활용

1. 두벡터의 사이각을 알기 위해 사용

2. 투영길이를 구할때 사용

3. 두벡터가 같은 방향인지를 알고자 할때 사용된다. (cos세타 를 알게되면 알수 잇다. )

 

벡터 내적 함수가 존재 한다. 

 

FLOAT D3DXVec3Dot( _in const D3DXVECTOR3 *pV1, _in const D3DXVECTOR3 *pV2)

결과값이 스칼라 값으로서 나온다. 

 

내적을 구하고 두벡터의 길이의 곱을 이용하여 사이각을 구할 수 있다. 


외적의 개념

두 벡터가 이루는 평면의 수직 벡터 

 

 

두벡터는 하나의 평면을 이룬다. 이 평면의 수직벡터가 되는것이 외적에 해당이 된다.  그래서 결과값은 벡터가 나온다. 

 

외적의 활용

 

1. 두 벡터로 이루어진 한 평면이 앞면인지 뒷면인지를 알려고 할때 사용한다.  두벡터로 이루어진 면이 뒷면일 경우 컬링의 대상이 된다. 화면에서 출력을 하지 않는다. 앞면을 바라보는 면만을 출력한다. 

2. 빛의 방향과 평면의 법선사이의 각도를 이용하여 평면에 적용될 빛의 영향을 결정할 때-> 빛의 방향에 따라서 얼마만큼 그 면에 빛을 비춰야 되는지 빛에 따라 색상이나 반사되는게 달라진다. 수직벡터랑 빝의 각도에 따라서 그 면에 얼마만큼의 색상을 줄것인가. 

3. 컬링을 할때

 

외적의 교환법칙이 성립하지 않는다. 

교환법칙을 하게 되면 반대방향이 될 수 있기 때문이다. 

외적에 관련된 함수 

D3DXVECTOR3 * D3DXVec3Cross( _inout D3DXVECTOR3 *pOut, _in const D3DXVECTOR3 *pV1, _in const D3DXVECTOR3 *pV2);