# Part 1. 기초 필수 수학

## Chapter 1 벡터 대수

그람-슈미트 직교화 : 벡터 집합에서 서로 정사영 벡터 계속 빼고 빼서 정규 직교 집합 만드는 과정

### 1.6 DirectXMath 라이브러리의 벡터

SIMD (Single Instruction, Multiple Data) 명령 : 명령어 한 개로 데이터 여러 개 동시 처리

DirectXMath : Direct3D를 위한 표준 3D 수학 라이브러리

### **1.6.1 벡터 형식들**

`XMVECTOR`

* 32비트 부동소수점 값 네 개. SIMD로 한꺼번에 처리 가능.
* 메모리 저장할 때 주소가 16의 배수여야 함.
* 그래서 지역 변수나 전역 변수가 아니라 클래스 자료 멤버에는 이 형식 대신 `XMFLOAT2`나 `XMFLOAT3` 등을 사용하는게 권장됨.
* `XMFLOAT2` 같은 거 SIMD로 연산하려면 `XMVECTOR` 형식으로 변환해야됨
* 포인터로 선언하면 되는거 아닌가 생각했는데, 매뉴얼피셜로 가능은 하지만 그냥 저장할 땐 `XMFLOATn` 쓰는게 좋다고 함.
* `XMFLOATn`를 `XMVECTOR`로 변환해서 연산 > `XMFLOATn`으로 변환하여 다시 저장

### **1.6.2 적재 및 저장 함수**

적재 함수 : `XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2 *pSource);` 저장 함수 : `void XM_CALLCONV XMStoreFloat2(XMFLOAT2 *pDestination, FXMVECTOR V);` (성분 하나만) 조회 함수 : `float XM_CALLCONV XMVectorGetX(FXMVECTOR V);` (성분 하나만) 설정 함수 : `XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x);`

### **1.6.3 매개변수 전달**

`XMVECTOR` 인스턴스가 함수 인자로 들어갈 때 값이 스택이 아니라 SSE/SSE2 레지스터를 통해 함수에 전달돼야 함. (효율적으로 정렬 보장하기 위해) 일단 플랫폼/컴파일러 의존성 없애려면 `XM_CALLCONV`라는 호출 규약 지시자 붙여야 됨. 몇 번째 매개변수냐에 따라 형식을 다르게 지정. (`GXMVECTOR`, `HXMVECTOR` 등) 생성자면 지시자도 안 붙이고 규칙도 다름.

### **1.6.4 상수 벡터**

상수(const) `XMVECTOR` 인스턴스에는 `XMVECTORF32` 형식을 사용해야 함. {0.0f,0.0f,0.0f,0.0f) 같이 특정한 값으로 초기화하려고 할 땐 `XMVECTOR` 안되고 `XMVECTORF32` 써야 함. `XMVECTOR`는 함수로 초기화해야됨.

### **1.6.5 overloading된 연산자들**

`XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V);`

c++은 operator+ 이런식으로 연산자를 오버로딩해서 커스텀 자료형로도 연산자로 연산할 수 있음.

`XMVector3ComponentsFromNormal(&projW, &perpW, w, n);` : w를 n 기준으로 직교 분해

### **1.6.9 부동 소수점 오차**

정규화같은 거 할 때 부동소수점으로 표현되니까 수치 오차 발생한다. 작은 상수 (Epsilon) 정의해놓고 오차가 그것보다 작은지로 판단. 아니면 `XMVector3NearEqual()`이라는 함수도 있다.

## Chapter 2 행렬 대수

소행렬 : 행이랑 열 제거한 행렬

여인수행렬 : 각 성분 여인수 계산해서 같은 위치에 배치한 행렬 딸림행렬 : 여인수 행렬의 전치 행렬. 행렬식으로 나누면 원본 행렬의 역행렬 나옴.

행렬식 : 그 행렬이 공간을 얼마나 늘리고 뒤집는지 나타내는 값

내적은 전치한 행렬과의 곱으로 표현 가능

### 2.8 DirectXMath의 행렬

`XMMATRIX` : 4x4 행렬 표현 `XMFLOAT4X4` : 행렬 저장할 때 사용

함수 매개변수는 `XMVECTOR`랑 비슷한데, `XMMATRIX`는 매개변수 하나가 `XMVECTOR` 매개변수 네 개에 해당.

호출 규약 : 함수 호출할 때 인자를 레지스터, 스택 어디에 저장할지, 호출자, 피호출자 누가 정리할지, 반환값 어디에 둘지 정의하는 규칙 `XM_CALLCONV` 호출규약을 지정하는 이유 : SIMD 벡터를 레지스터로 직접 전달하고, `XMVECTOR`의 16바이트 정렬도 하기 위해

## Chapter 3 변환

### 3.1 선형 변환

비례 변환 : 각 성분에 곱한거 회전 변환

* 기준축에 평행 성분 수직 성분 나눔 > 수직 성분이랑 평행 선분 외적한 걸로 수직 성분하고 같이 2차원 좌표계 생성 > 평행 성분은 돌릴 필요 없으니까 수직 성분만 2차원 좌표계 생성한 걸로 분해 > 그걸로 평행 성분 수직 성분 나눴던 식 전개 > 스칼라곱이 선형인 건 자명하고, 외적도 선형임. 고로 회전 변환은 선형임.
* 회전행렬 각 행벡터는 단위 길이이고, 서로 직교함. 직교 행렬이므로 역행렬이 자신의 전치행렬과 같음.
* 축 벡터는 정규화하고 넣어야 됨

원점 이동시키지 않으면 선형 변환, 이동시키면 아핀 변환.

### 3.2 아핀 변환

아핀변환

* 선형변환 + 이동변환 (t(u) + b)
* 벡터는 이동에 불변이지만, 동차 좌표 (w 성분 추가한 거) 이용하면 점처럼 다룰 수 있음.
* w = 0이면 벡터, w = 1이면 점. 이동 변환은 w = 0이면 무시할 수 있기 때문.
* 이러면 벡터끼리 빼면 점, 점에 벡터 더하면 점 됨.

항등변환

* 주어진 인수를 그대로 돌려주는 선형 변환. 행렬로 표현하면 단위행렬.
* 이동변환은 아핀변환에서 선형변환 부분을 단위행렬로 바꾼 것과 같음
* 반대로, 선형변환은 아핀변환에서 이동변환을 영벡터로 둔 것

### 3.4 좌표 변경 변환

벡터 : 좌표계 A의 방향 단위벡터를 좌표계 B에 상대적으로 표현하면 변환 완료 점 : 벡터 좌표계 변환에 원점 상대적 좌표도 추가 아핀 변환 행렬처럼 표현 가능. 사실 둘이 동치임. 더 자연스러운 해석으로 설명하는 것.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lazyartisan.gitbook.io/note/main-page/books/directx-12-3d/part-1..md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
