DuckingRacoon

[DX11 3D 게프입] CH1-1. 벡터와 XNA math 라이브러리 본문

공부/DirectX11을 이용한 3D 게임 프로그래밍 입문

[DX11 3D 게프입] CH1-1. 벡터와 XNA math 라이브러리

따킹라쿤 2024. 2. 7. 15:16

“DirectX 11을 이용한 3D 게임 프로그래밍 입문”을 정리한 포스트이다.

 


🔍 벡터?

크기(스칼라)와 방향을 모두 가진 수량

  • 벡터값 수량(Vector-valued quantity): 힘, 속도와 같이 크기와 방향을 모두 가진 수량

기하학적으로 나타낸 벡터 🖼️

https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Vector_from_A_to_B.svg/1200px-Vector_from_A_to_B.svg.png

 

지향 선분(directed line segment)로 표시

  • 방향 = 화살표
  • 크기 = 선분의 길이

https://upload.wikimedia.org/wikipedia/commons/e/ef/Equal_vector.jpg

 

! 위치는 중요하지 않다.

  • 만약 ( 길이가 같고 ) && ( 방향이 같으면 ), 상등이다.
  • 병진 이동( translation )해도 의미 변화가 없다.

 

벡터의 수치적 표현과 좌표계 🔢

컴퓨터는 기하적으로 벡터를 다루지 못하기 때문에, 벡터를 수치적으로 표현할 방법이 필요하다.

 

https://docs.godotengine.org/en/stable/_images/vector_xy2.png

 

좌표계를 도입하고 → 벡터의 꼬리와 원점O이 일치하도록 이동시켜

⇒ 벡터의 화살표 끝을 좌표로 백터를 수치적으로 표현할 수 있다.

 

좌표계에 상대적인 좌표 🔀

같은 벡터라도 좌표계가 다르면, 좌표 표현이 다르다.

https://lh3.googleusercontent.com/proxy/n5nzTfISDO89_IGRJxx16H7Iwi3wYjGTx5THRjXSg1n3j6F5T0zvOXTIdk03EURfci14nzt1KXS3BONYQfkBk3wNkI5Hu6Dgw5VYXzKjc_2OzFGGbA

 

  • 3D 컴퓨터 그래픽에서는 여러 개의 좌표계를 사용하기 때문에, 주어진 벡터 좌표가 어떤 기준계로 설정되었는지 기억할 필요가 있다.

 

오른손잡이/왼손잡이 좌표계 👐🏻

 

https://learn.microsoft.com/en-us/previous-versions/windows/desktop/images/bb324490.leftrght(en-us,vs.85).gif

 

  • Direct3D는 왼손 좌표계를 사용한다.

👷🏻‍♂️실습: 벡터 설정- XNA Math 라이브러리

프로젝트 설정 🔧

CH1에서의 프로젝트 설정은 빈 프로젝트 + 포함 디렉터리 (Include Directory)만 설정해주면 된다.

  1. 프로젝트 properties에 들어간다.

 

2. Configuration Properties > VC++ Directories에 들어가 include Directories(포함 디렉토리)에 DirectX SDK의 include파일의 path를 설정해준다.

  • 일반적으로 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include 에 있다.

 

코드 💻

#include<Windows.h>
#include<xnamath.h> // 사용 라이브러리
#include<iostream>
using namespace std;

// cout을 사용하여 XMVECTOR 객체를 출력할 수 있도록 << 연산자 오버로딩
ostream& operator<<(ostream& os, FXMVECTOR v)
{
	XMFLOAT3 dest;
	XMStoreFloat3(&dest, v);

	os << "(" << dest.x << ", " << dest.y << ", " << dest.z << ")";
	return os;
}

int main()
{
	cout.setf(ios_base::boolalpha);

	// SSE2 지원 여부 확인
	if (!XMVerifyCPUSupport())
	{
		cout << "xna math not supported" << endl;
		return 0;
	}

	// XMVectorZero(): 영벡터 생성
	XMVECTOR p = XMVectorZero();						// (0, 0, 0, 0)

	// XMVectorSplatOne(): (1, 1, 1, 1) 벡터 생성
	XMVECTOR q = XMVectorSplatOne();					// (1, 1, 1, 1)

	// XMVectorSet(x, y, z, w) : (x, y, z, w) 벡터 생성
	XMVECTOR u = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);	// (1, 2, 3, 0)

	// XMVectorReplicate(s): (s, s, s, s) 벡터 생성
	XMVECTOR v = XMVectorReplicate(-2.0f);				// (-2, -2, -2, -2)

	// XMVectorSplatZ(v): (z, z, z, z) 벡터 생성
	XMVECTOR w = XMVectorSplatZ(u);						// (3, 3, 3, 3)	

	cout << "p = " << p << endl;
	cout << "q = " << q << endl;
	cout << "u = " << u << endl;
	cout << "v = " << v << endl;
	cout << "w = " << w << endl;

	return 0;
}