DOTY

2. DirectXMath - Vector 본문

DirectX

2. DirectXMath - Vector

증식세포 2023. 4. 21. 17:44
728x90
반응형

DirectXMath 라이브러리를 활용한 벡터

  • XMVECTOR
    • XMVECTOR은 128비트의 32비트의 부동소수점 값 네 개로 구성된다.
    • 벡터를 한번에 처리할 수 있다. (x, y, z, w - 4차원)
    • 이 대신 XMFLOAT2, XMFLOAT3, XMFLOAT4를 사용하도록 권장하지만 계산을 직접 한다면 SIMD의 장점을 가질 수 없다. 따라서 XMVECTOR 형식으로 변환한다.
  • 벡터 적재, 저장 함수
// 적재하는 함수
XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2 *pSource);
XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3 *pSource);
XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4 *pSource);

// 저장하는 함수 ( *pSource에 V를 복사해서 저장 )
XMVECTOR XM_CALLCONV XMStoreFloat2(const XMFLOAT2 *pSource, FXMVECTOR V);
XMVECTOR XM_CALLCONV XMStoreFloat3(const XMFLOAT3 *pSource, FXMVECTOR V);
XMVECTOR XM_CALLCONV XMStoreFloat4(const XMFLOAT4 *pSource, FXMVECTOR V);

// 특정 부분만 가져오는 함수
float XM_CALLCONV XMVectroGetX(FXMVECTOR V);
float XM_CALLCONV XMVectroGetY(FXMVECTOR V);
float XM_CALLCONV XMVectroGetZ(FXMVECTOR V);
float XM_CALLCONV XMVectroGetW(FXMVECTOR V);

// 특정 부분만 변경하는 함수
float XM_CALLCONV XMVectroSetX(FXMVECTOR V, float x);
float XM_CALLCONV XMVectroSetY(FXMVECTOR V, float y);
float XM_CALLCONV XMVectroSetZ(FXMVECTOR V, float z);
float XM_CALLCONV XMVectroSetW(FXMVECTOR V, float w);

 

  • 계산을 위해 오버로딩 된 연산자들
// 양수, 음수
XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V);
XMVECTOR XM_CALLCONV operator- (FXMVECTOR V);

// V1 [op] V2
XMVECTOR& XM_CALLCONV operator+= (XMVECTOR& V1, FXMVECTOR V2);
XMVECTOR& XM_CALLCONV operator-= (XMVECTOR& V1, FXMVECTOR V2);
XMVECTOR& XM_CALLCONV operator*= (XMVECTOR& V1, FXMVECTOR V2);
XMVECTOR& XM_CALLCONV operator/= (XMVECTOR& V1, FXMVECTOR V2);

// V [op] S
XMVECTOR operator*= (XMVECTOR& V, float S);
XMVECTOR operator/= (XMVECTOR& V, float S);

// temp = V1 [op] V2
XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XM_CALLCONV operator- (FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XM_CALLCONV operator* (FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XM_CALLCONV operator/ (FXMVECTOR V1, FXMVECTOR V2);

// temp = V [op] S || temp = S [op] V
XMVECTOR XM_CALLCONV operator* (FXMVECTOR V, float S);
XMVECTOR XM_CALLCONV operator* (float S, FXMVECTOR V);
XMVECTOR XM_CALLCONV operator/ (FXMVECTOR V, float S);

 

  • 벡터 관련 상수 
// π (파이 관련 상수 정의)
const float XM_PI = 3.141592654f;
const float XM_2PI = 2 * XM_PI;
const float XM_1DIVPI = 1 / XM_PI;
const float XM_1DIV2PI = 1 / XM_2PI;
const float XM_PIDIV2 = XM_PI / 2;
const float XM_PIDIV4 = XM_PI / 4;

// 도(˚)를 라디안으로 변환
inline float XMConvertToRadians(float fDegrees)
	return fDegrees * (XM_PI / 180.0f);

// 라디안 을 도(˚)로 변환
inline float XMConvertToDegrees(float fRadians)
	return fRadians * (180.0f / XM_PI);

// 크기 비교
template<class T> inline T XMMin(T a, T b)
	return (a < b) ? a : b;
template<class T> inline T XMMax(T a, T b)
	return (a > b) ? a : b;

 

  • 설정 함수
// return 0벡터
XMVECTOR XM_CALLCONV XMVectorZero();

// return (1, 1, 1, 1)
XMVECTOR XM_CALLCONV XMVectorSplatOne();

// return (x, y, z, w);
XMVECTOR XM_CALLCONV XMVectroSet(flaot x, float y, float z, float w);

// reutrn (Value, Value, Value, Value)
XMVECTOR XM_CALLCONV XMVectorReplicate(float Value);

// return (x, x, x, x)
XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECOTR V);

// return (y, y, y, y)
XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECOTR V);

// return (z, z, z, z)
XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECOTR V);

 

  • 벡터 함수들
XMVECTOR XM_CALLCONV XMVector3Length( 				// return |v|
	FXMVECTOR V);					  	// V 입력

XMVECTOR XM_CALLCONV XMVector3LengthSq(				// return |v|^2
	FXMVECTOR V);					  	// V 입력

XMVECTOR XM_CALLCONV XMVector3Dot(				// return v1·v2
	FXMVECTOR V1,					  	// v1 입력
    	FXMVECTOR V2);					  	// v2 입력

XMVECTOR XM_CALLCONV XMVector3Cross(				// return v1×v2
	FXMVECTOR V1,					  	// v1 입력
    	FXMVECTOR V2);					  	// v2 입력

XMVECTOR XM_CALLCONV XMVector3Normalize(			// retrun v / |v|
	FXMVECTOR V);					  	// v 입력

XMVECTOR XM_CALLCONV XMVector3Orthogonal(			// return [v에 수직인 벡터]
	FXMVECTOR V);					  	// v 입력

XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors(		// return [v1과 v2 사이의 각도]
	FXMVECTOR V1,					  	// v1 입력
    	FXMVECTOR V2);					  	// v2 입력

XMVECTOR XM_CALLCONV XMVector3ComponentsFromNormal(
	XMVECTOR* pParallel,					// retrun proj_n(v)
    	XMVECTOR* pPerendicular,				// return perp_n(v)
    	FXMVECTOR V,					  	// v 입력
    	FXMVECTOR Normal);					// n 입력

XMVECTOR XM_CALLCONV XMVector3XMVector3Equal(			// return bool v1 == v2?
	FXMVECTOR V1,					  	// v1 입력
    	FXMVECTOR V2);					  	// v2 입력

XMVECTOR XM_CALLCONV XMVector3XMVector3NotEqual(		// return bool v1 != v2?
	FXMVECTOR V1,					  	// v1 입력
    	FXMVECTOR V2);					  	// v2 입력

※ XMVector3AngleBetweenvectors 사용 방법 ( + XMVECTOR를 return 하는 함수들에 대해서)

  • XMVector3AngleBetweenvectors 함수와 같이 스칼라 값을 return해야하는데 return 이 벡터인 함수일 경우 XMVECTOR의 모든 성분에 스칼라 값이 입력된다. 
FXMVECTOR v1 = FXMVECTORSet(1.0f, 2.0f, 3.0f, 0.0f);
FXMVECTOR v2 = FXMVECTORSet(1.0f, 1.0f, 1.0f, 0.0f);
XMVECTOR temp = XMVector3AngleBetweenVectors(v1, v2);

result :
temp = (0.387597, 0.387597, 0.387597, 0.387597) // 결과 값의 단위 : 라디안(rad.)
  • 위와 같은 결과는스칼라 값과 SIMD의 연산을 최소화 하기위함. 

1. 지역 변수나 전역 변수에는 XMVECTOR를 사용한다.

2. 클래스 자료 멤버에는 XMFLOATn를 사용한다.

3. 계산하기 전에는 반드시 XMFLOATn을 XMVECTOR로 변환한다.

4. 저장할 때는 XMVECTOR에서 XMFLOATn으로 변환한다.

728x90
반응형

'DirectX' 카테고리의 다른 글

DirectX11. 2) D3D11 Initialize  (1) 2023.06.09
DirectX11. 1) 창 띄우기  (0) 2023.06.07
4. DirectXMath - Transform  (1) 2023.05.02
3. DirectXMath - Matrix  (0) 2023.04.24
1. DirectX12 - Win32 프로젝트 ( &에 l-value가 있어야 합니다 )  (0) 2023.04.17
Comments