본문 바로가기
GameMaker강좌[GMS2]/3D기능강좌

[게임메이커 강좌-3D강좌][GMS2] 3D 멀티뷰

by 타락카얀 2021. 10. 17.
728x90

 

 

 

 

 

이번 강좌에서는 3D 에서의 멀티뷰를 만드는 방법에 대해 알아봅시다.

 

(▲ 멀티뷰)

 

 

 

 

 

◈ 뷰 설정

 

 

먼저 사용할 뷰를 어디에 위치하도록 할지를 정해야 합니다.

 

(▲ 뷰의 위치)

 

강좌에서는 위와 같이 화면 우측 상단에 메인 화면의 절반크기로 현재 방향의 후방을 표시해보겠습니다.

 

현 강좌는 탈출 게임의 강좌를 이어서 합니다.

https://kayanworld.tistory.com/212

 

멀티뷰를 만들기 위해 룸에서 사용할 카메라 뷰를 활성화해야 합니다.

강좌에서는 메인 화면, 그리고 서브화면, 2개의 뷰를 사용할 거에요.

먼저 카메라 메인 뷰의 크기를 설정합니다.

 

(▲ 카메라 메인 뷰)

 

그리고 서브 화면의 카메라 뷰를 활성화하고 뷰의 위치와 크기를 설정합니다.

 

(▲ 서브 화면의 카메라 뷰)

 

뷰 설정은 끝났습니다.

다음은 카메라 설정입니다.

이미 우리는 1인칭 탈출게임 강좌에서 3D 카메라 설정을 해봤죠.

아래와 같이 오브젝트의 카메라 설정(강좌에서 obj_cam 오브젝트 - Draw 이벤트)을 확인합니다.

 


   var projmat = matrix_build_projection_perspective_fov(-45, -view_wport[0]/view_hport[0], 1, 32000);
   camera_set_proj_mat(view_camera[0],projmat);//원근법 설정
   
   var xto,yto,zto;
   xto=x+lengthdir_x(lengthdir_x(cam_dis,cam_yang),cam_zang);
   yto=y+lengthdir_y(lengthdir_x(cam_dis,cam_yang),cam_zang);
   zto=z+eye-lengthdir_y(cam_dis,cam_yang);//카메라를 상하-좌우회전치만큼 좌표를 설정함.
   
   var viewmat = matrix_build_lookat(x,y,z+eye,xto,yto,zto, 0, 0, 1);
   camera_set_view_mat(view_camera[0],viewmat);//카메라 설정
   
   camera_apply(view_camera[0]);//카메라에 적용

 

Draw 이벤트는 활성화된 뷰의 수만큼 갱신됩니다.

따라서 뷰가 2개이므로 카메라 설정도 뷰마다 각각 1개씩 설정해야 합니다.

뷰는 view_current 내장 변수로 현재 활성화중인 뷰를 확인할 수 있습니다.

view_current 값은 뷰 번호 0~7 이며 활성화중인 뷰 번호가 저장됩니다.

 

먼저 뷰1의 설정입니다.

이전 카메라 설정에 view_current 를 사용하여 조건문을 추가합니다.

현재 메인 화면 카메라 뷰는 뷰 번호 0을 사용하므로, 활성화중인 뷰 번호가 0인지 확인합니다.

 


   if view_current==0{ //뷰 번호 확인
   
   var projmat = matrix_build_projection_perspective_fov(-45, -view_wport[0]/view_hport[0], 1, 32000);
   camera_set_proj_mat(view_camera[0],projmat);
   
   var xto,yto,zto;
   xto=x+lengthdir_x(lengthdir_x(cam_dis,cam_yang),cam_zang);
   yto=y+lengthdir_y(lengthdir_x(cam_dis,cam_yang),cam_zang);
   zto=z+eye-lengthdir_y(cam_dis,cam_yang);
   
   var viewmat = matrix_build_lookat(x,y,z+eye,xto,yto,zto, 0, 0, 1);
   camera_set_view_mat(view_camera[0],viewmat);
   
   camera_apply(view_camera[0]);
   
   }


 

이게 끝입니다. 간단하죠?

그냥 이전 카메라 설정에 현재 카메라가 활성중인지만 체크하는 거에요.

 

다음은 서브 화면의 카메라 뷰 설정입니다.

새로운 위치의 서브 화면의 카메라 뷰의 설정을 메인 화면 카메라 뷰의 설정 밑에 추가합니다.

 


   if view_current==1{ //뷰 번호 확인


   var projmat = matrix_build_projection_perspective_fov(-45, -view_wport[1]/view_hport[1], 1, 32000);
   camera_set_proj_mat(view_camera[1],projmat);
   
   var xto,yto,zto;
   xto=x+lengthdir_x(lengthdir_x(cam_dis,cam_yang),cam_zang+180); //카메라의 위치
   yto=y+lengthdir_y(lengthdir_x(cam_dis,cam_yang),cam_zang+180);
   zto=z+eye-lengthdir_y(cam_dis,cam_yang);
   
   var viewmat = matrix_build_lookat(x,y,z+eye,xto,yto,zto, 0, 0, 1);
   camera_set_view_mat(view_camera[1],viewmat);
   
   camera_apply(view_camera[1]); //뷰2에 적용


   }


 

메인 화면 카메라 뷰는 서브 화면 카메라 뷰와 설정이 거의 동일 합니다.

다만 위치가 다를 뿐이지요. 카메라 뷰2로 보이고 싶은 위치를 지정하면 됩니다.

카메라 설정이 끝났네요.

 

 

추가적으로 아래와 같이 화면에 글자나 이미지를 표시하고 싶다면, Draw Gui 이벤트에서 표시하세요.

Draw Gui 이벤트는 카메라 뷰의 영향을 받지 않고, 2D를 표시할 수 있는 이벤트입니다.

일반적으로 2D 사용자 인터페이스를 구성할 수 있는 공간이죠.

 

(▲ 화면의 왼쪽 위에 이미지를 표시)

 

안개기능이 활성화된 경우 2D 이미지는 안개색으로 혼합되기 때문에, 아래와 같이 안개 기능을 비활성화하고

이미지를 표시해야 제대로 표시됩니다.

 


   ★ Draw Gui 이벤트




   gpu_set_fog(0,c_white,0,0);//안개기능이 활성화된 경우 비활성화함.


   draw_sprite_ext(spr_image,0,16,16,1,1,0,c_white,1);//이미지표시


   gpu_set_fog(1,c_black,64,240);//안개기능이 필요한 경우 다시 활성화함.


 

 

 

 

 

 

 

 

300x250

댓글