지금까지는 공간의 x, y좌표만 활용하여 2D공간처럼 만든 뒤 다양한 도형들을 띄워보는 작업을 했다
이제는 그 도형을 아주 많이 만들어서 Grid를 만들고, z좌표까지 활용하여 기본이 되는 바닥을 Grid 모양으로 짜고
카메라를 만들어 움직여보자
Gird - Wireframe
먼저 이전에도 했던 Wireframe Mode로 한 칸을 만들어보자

Vertex 4개를 잡아주고,
Index는 6개를 잡아준 뒤 삼각형 두개를 그리기 순서에 맞춰 그려주면 된다
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 2;
indices[4] = 1;
indices[5] = 3;
그럼 다음으로 이 한 칸을 3 * 3으로 만들어보자
총 9개의 작은 사각형, 18개의 삼각형을 그려야한다
삼각형 하나당 index 3개가 필요하므로 총 18 * 3 = 54개의 index가 필요하다
여기서 문제는 위처럼 indices배열에 일일이 넣어주면 너무 귀찮아진다
따라서 식을 도출해본다
필요한 index는 width * height * 6 개
그리고 하나의 사각형을 그리기 위한 식을 도출해보면
indices[index + 0] = (width + 1) * y + x;
indices[index + 1] = (width + 1) * (y + 1) + x;
indices[index + 2] = (width + 1) * y + (x + 1);
indices[index + 3] = (width + 1) * y + (x + 1);
indices[index + 4] = (width + 1) * (y + 1) + x;
indices[index + 5] = (width + 1) * (y + 1) + (x + 1);
이렇게 된다
이 index들을 width만큼, height만큼 반복해주면 총 9칸의 grid가 만들어진다

이제 x와 y좌표가 아닌 x와 z좌표를 사용하여 256 * 256 바닥을 깔아보자
vertices[i].Position.z에 지금까지 사용해온 y 좌표를 넣어주면 된다

결과적으로는 이렇게 나오는게 맞는데 처음에 그냥 실행하면
(0,0,0) 에서 시작하고 카메라도 그 위치에 있기 때문에 그리기 순서에 따라 화면에 보여지지 않게 된다
Camera
카메라 클래스에서는 view행렬을 받아와야한다
void Camera::GetMatrix(Matrix* matrix)
{
memcpy(matrix, &matView, sizeof(Matrix));
}
View 행렬을 받아와서 Camera 클래스의 matView (Matrix)에 넣어준다
memcpy 대신에
*matrix = matView;
이렇게 넣어줄 수도 있지만 이거보다 memcpy를 사용하는 방법이 조금 더 빠르다
Matrix X, Y, Z;
D3DXMatrixRotationX(&X, rotation.x);
D3DXMatrixRotationY(&Y, rotation.y);
D3DXMatrixRotationZ(&Z, rotation.z);
matRotation = X * Y * Z;
//out될 벡터, 방향 바꿀 벡터, 바꿀 공간
D3DXVec3TransformNormal(&forward, &Vector3(0, 0, 1), &matRotation);
D3DXVec3TransformNormal(&up, &Vector3(0, 1, 0), &matRotation);
D3DXVec3TransformNormal(&right, &Vector3(1, 0, 0), &matRotation);
matRotation은 회전 행렬 (Matrix matRotation;)
D3DXVec3TransformNormal() 과 D3DXVec3TransformCoord()의 차이점은
Normal의 매개변수에 들어가는 벡터( 두번째 매개변수 ) 는 방향을 나타낸다
Coord에서는 위치를 나타낸다
이 회전 함수들이 끝나면 절대 방향이었던 forward, up, right벡터는 회전 후에 변한 방향을 가르키게 된다

마지막으로 view행렬에 정보들을 세팅해주면 카메라의 위치가 설정된다
D3DXMatrixLookAtLH(&matView, &position, &(position + forward), &up);
//Out Matrix, 카메라 위치(눈 위치), 바라볼 지점(포커스), 수직방향
Camera 클래스를 상속받아 Update부분에서 마우스 입력/ 키보드 입력값에 따라
위치와 회전을 더해주면 카메라 완성
위 Grid에 Cube를 하나 만들어서 움직임까지 구현해봤다
Grid가 맵이고 Cube가 캐릭터라고 생각하면 점점 그럴듯해진다
큐브의 회전
Matrix R, T;
D3DXMatrixRotationYawPitchRoll(&R, rotation.y, rotation.x, -rotation.z);
D3DXMatrixTranslation(&T, position.x, position.y, position.z);
world = R * T;
'> Study > DirectX' 카테고리의 다른 글
| [DirectX] HeightMap, Light (0) | 2024.01.29 |
|---|---|
| [DirectX] Texture (0) | 2024.01.23 |
| [DirectX] World Matrix (2) | 2023.12.21 |
| [DirectX] Triangle, Rectangle (0) | 2023.12.21 |
| [DirectX] Vertex (1) | 2023.12.20 |