[c#] directX 연동 및 툴 만들기 - 2
: 뷰스페이스 행렬과 투영행렬 설정하기
1. 일단 저번과 달라진 점이 있다면 각 클래스별 기능으로 나누기 위해
디바이스를 시스템매니저라는 싱글톤 클래스를 만들어 설정했다는 것입니다.
Main_Load에서 SystemMgr을 Init해줍니다.
생략하지 말고 제대로 설명해!!!!!
2. 일단은 싱글톤 클래스를 만들건데요.
해당 프로젝트 - 마우스오른쪽버튼 - 추가 - 클래스를 눌러줘서 Singleton.cs를 만들어줍니다.
3. c#에서 싱글톤을 만듭니다.
| Singleton<T> where T : class, new()
이건 뭘까 해서 찾아봤는데
where T : class, new() |
where 뒤에 나오는 class와 new()는 T가 만들어질 때 조건들이라고 합니다.
즉,
조건 1 : class 이여야 됨.
조건 2 : new() 가 되야 함.
이 되어야만 T가 만들어집니다.
음..... class인 것은 알겠는데 new()는 뭘까?
T를 구현할 때 new를 호출하기 때문에 new()도 where에 써주는 것이라고 나와있습니다.
instance = new T();
이렇게 말이죠.
또 위 사이트에서 안 사실 하나는
where절이 생략되면 T에 대한 불신(T가 new연산자를 갖고 있다는 보장 없음)으로
컴파일러가 에러를 뱉어낸다고 하네요.
| object _instancelock = new object();
C#에서는 어떻게 상속싱글톤을 만들지? 해서 찾은 사이트였고
멀티스레드를 혹시 나중에 쓸 수도 있어서 해당 코드를 적용하게 되었습니다.
싱글톤 패턴은 비교적 자주 사용되는 패턴이고,
멀티 스레드 프로그램을 작성할 경우 서로 상성이 안좋기 때문에 크리티컬 섹션에 대해서 뮤텍스(C#에서는 락)을 잡아줘야 한다.
문제는 이러한 패턴은 매번 반복이 되기 때문에 부모 클래스로서 작성을 해놓고,
상속받아서 기능을 구현하는 것이 여러모로 편리하다고 생각이 들기 때문에 찾아보니 해당 패턴이 있었다.
그래서 메모겸 샘플 코드를 남긴다.
출처: http://karl27.tistory.com/54 [불확정한 세상]
4. SystemMgr 클래스를 만들고 아래와 같이 싱글톤을 상속해주면 시스템매니저도 싱글톤이 됩니다.
저는 이곳에 디바이스를 멤버변수로 넣어주고 생성과 초기화를 했습니다.
5. 잉? 저 CDevice 클래스는 뭐지?라고 할 수 있는데 관리하기 편하게 클래스로 만들어주었습니다.
CDevice 클래스로 가서 초기화를 해주고 뷰스페이스와 투영행렬을 설정해줍니다.
아래와 같이 설정해주면 됩니다.
대체 뷰와 스페이스가 무엇이냐?하면 3D를 처음 배울 때 랜더링파이프라인을 배웁니다.
바로 3D공간을 2D로 표현해주는 과정을 랜더링 파이프라인이라고 하는데요.
랜더링파이프라인을 크게 나누자면 로컬->월드->뷰스페이스(카메라)->투영->뷰포트로 나눌 수 있는데요.
(랜더링파이프라인과 뷰, 투영행렬에 대해서는 따로 자세히 포스팅하도록하겠습니다.)
이 중 위의 코드는 뷰스페이스(카메라변환) 와 투영(원근) 을 설정해주는 것입니다.
| 뷰스페이스(카메라변환)
뷰스페이스(카메라 행렬)로 변환시키는 것이 무엇이냐 하면
카메라를 배치해 월드의 원점으로 변경하고 +z축(directx기준)으로 회전시키는 걸 말하는데요.
이 때 해당 물체들도 회전하게 됩니다.
위 코드에서 뷰스페이스 해당 부분 코드 입니다.
LookAtLH(인자값 1, 인자값2, 인자값3)
인자값 1 : 카메라의 위치를 말합니다. 만약 위에서 보고 싶다면 y값을 높이면 카메라의 위치가 이동합니다.
인자값 2 : 카메라가 바라보는 방향입니다.
인자값 3 : 카메라의 업 벡터입니다. 보통은 y축을 1로 두고 설정합니다.
위와 같이 카메라가 설정이 되는데 카메라의 위치를 eye벡터, 카메라가 보고 있는 지점을 look벡터라 합니다.
출처 : http://3dapi.com/ <- 최고의 사이트 완전 추천!
| 투영(원근)
투영이란 원근법이라고 미술에서 가까이 있는 물체는 크게, 멀리 있는 물체는 작게 그려서
소실점을 통해 비율대로 크기를 나타냄으로 원근감있게 표현하는 것을 말하는데요.
컴퓨터에서도 투영을 통해 물체의 위치(z)값 등을 통해 크고 작게 그려서
3D처럼 보이게 만드는 과정을 나타냅니다.
인자값 1 : 얼만큼 카메라가 담아내는지 각도
인자값 2 : 화면의 종횡비
인자값 3 : 가까운 z값
인자값 4 : 먼 z값
여튼 위와 같이 디바이스 - 트랜스폼 - view, projection을 각각 설정해 3D설정이 되었구요.
근데 보이는 물체나 맵이 없으니 확인이 잘 되지 않습니다.
다음 포스팅에는 버텍스를 생성해 랜더링 하는 걸 하도록 하겠습니다.
감사합니다.
'Programming > DirectX' 카테고리의 다른 글
[c#] directX 연동 및 툴 만들기 - 3 (3) | 2018.01.02 |
---|---|
[c#] directX 연동 및 툴 만들기 - 1 (3) | 2017.12.15 |
DirectX7 Blt함수 (0) | 2016.11.09 |
게임 벡터, 벡터 덧셈, 뺄셈, 크기, 단위 벡터 (0) | 2016.11.02 |
랜더링파이프라인의 정의 (0) | 2016.10.31 |