momodudu.zip

#3 Model/View/Projection Matrix - MVP Matrix glm이용해서 써보기 본문

Graphics/OpenGL

#3 Model/View/Projection Matrix - MVP Matrix glm이용해서 써보기

ally10 2019. 9. 8. 12:13

이제 glm을 이용해서 어디서 많이 듣던 MVP가 뭔지 알아보자.

이 세가지를 이해하기에는 2D는 부족하다. 그래서 이번에는 정육면체를 들고왔다.

 

 

 

1.Model

Model은 앞서 포스팅한것들에 대한것이라고 보면 되겠다. 즉, Translate, Rotate, Scale에 대한 매트릭스이다.

물체 자체에 대한 Matrix로 보면 된다. 모든 vertex가 원점을 중심으로 매칭된 공간에서, 모든 vertex들이 world좌표계의 중심으로 정의된 공간.

 

2. View

View는 카메라에 대한 매트릭스로 보면 된다. 물체를 어디서 볼것인지? 어디로 볼것인지?

간단한 View matrix는 아래와 같다.

 

	glm::mat4 View = glm::lookAt(glm::vec3(4.0f, 3.0f, 1.0f), glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 1.0f, 0.f));// 월드 공간에서 (4, 3, 3)에 카메라가 위치 glm::vec3(0,0,0), // 원점을 본다 glm::vec3(0,1,0) // 머리가 위로 있다 );

 

glm의 lookAt함수를 사용했고, 첫번째 인자가 카메라가 어디에 위치하는지에 대한 정보다.

두번째는 카메라가 어디를 쳐다보고 있는가? 이다. 마지막 인자는 하늘이 어느축인지에 대한 정보이다.

보통 (0,1,0)을 많이 쓰고 (0,-1,0)이라면 물체가 뒤집어져서 보일것이다.

 

즉 위의 matrix는 카메라는 (4,3,1)에 위치하며 월드좌표계의 원점을 바라보고 있다.

 

 

3. Projection

Projection은 카메라 좌표계에서 homogenus 좌표계로 바꾸어주는 역할을 한다.

Projection matrix 종류는 3가지가 있는데, perspective/ortho/frustum이 있다.

자세한건 지금 시간이 없어서... 추후 보강해야될 것 같다.

	glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)800 / (float)600, 0.1f, 100.0f);

 

첫번째 인자, 수직방향의 시야각을 의미한다.두번째는 화면비. 세번째는 zNear 네번째는 zFar로 보면 된다.

 

무튼, 이 세가지 매트릭스의 누적은 Projection * View * Model 순으로 들어간다.

첫번째 스크린샷에서 들어간 matrix 코드이다.

	glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)800 / (float)600, 0.1f, 100.0f);
	glm::mat4 View = glm::lookAt(glm::vec3(4.0f, 3.0f, 1.0f), glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 1.0f, 0.f));
	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f,0.5f,0.5f));

	glm::mat4 myMatrix = Projection* View* Model;

model은 반씩 줄였고, View와 Projection은 위와 같다.