본문 바로가기

Game/Unity & C#

5장 카메라, 렌더링, 씬 (2)

6. 프로스텀 검사: 점

- 가시성을 확인하기 위해 항상 렌더러를 검사하는 것을 원하지 않을 수 있다. 대신에 간단히 점을 검사하는 방법이 있다. 두 가지 상황 때 이럴 수 있는데 첫 번째로, 파티클이나 권총 표정 위치와 같은 오브젝트가 실제로 보이는지 알고 싶을 수 있다. 두 번째로, 화면 공간(카메라에 의해 렌더링되는)에 보이는지 알기를 원할 때 이 방법을 사용할 수 있다.
다음 예제 코드에서는 이러한 검사를 한다. 이 코드는 점이 카메라 프러스텀 안에 있는지를 검사하고, 프러스텀 안에 있는 경우 더 나아가 정규화된 뷰포트 공간 안에 존재하는 화면상의 어느 곳에 점이 렌더링될지 위치를 반환한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    // 씬 안의 점이 지정된 카메라의 프러스텀 안에 위치하는지를 검사하는 함수
    // 점이 프러스텀 내에 있으면 true, 아니면 false를 반환한다
    // 출력 파라미터인 ViewPortLoc는 함수가 true를 반환할 때 화면상의 점 위치를 알려준다
    public static bool IsPointInFrustum(Vector3 fPoint, Camera fCamera, out Vector3 fViewPortLoc)
    {
        // 크기가 없는 경계를 생성한다
        Bounds B = new Bounds(fPoint, Vector3.zero);
 
        // 카메라에서 프러스텀 평면을 생성한다
        // 각 평면은 프러스텀의 벽 한 면을 나타내는 것이다
        Plane[] planes = GeometryUtility.CalculateFrustumPlanes(fCamera);
 
        // 프러스텀 평면 안에 점이 있는지 검사한다
        bool IsVisible = GeometryUtility.TestPlanesAABB(planes, B);
 
        // 뷰포트 위치 변수에 값을 할당한다
        fViewPortLoc = Vector3.zero;
 
        // 점이 보이는 상태이면 점의 뷰포트상 위치를 구한다
        if (IsVisible)
        {
            fViewPortLoc = fCamera.WorldToViewportPoint(fPoint);
        }
 
        return IsVisible;
    }

 

 

 

7. 프러스텀 검사: 오클루전

8. 카메라 시야: 앞뒤 판별

 

 

9. 직교 카메라

- 직교 카메라를 이용할 때 주된 고민은 월드의 크기(씬 안에서의 크기) 단위와 픽셀 크기(화면상의 크기)를 어떻게 1:1로 맞출 것인지에 대한 것이다. 2D 게임과 GUI에 이 문제가 대두되는데, 화면상의 텍스처 파일에 정의된 대로 정확한 기본 크기를 보여줄 필요가 있기 때문이다. 실질적으로 이렇게 하려면 구체적으로 접근해야 한다. 1월드 단위를 1픽셀에 대응하게 하려면 Camera 탭의 Size 필드를 게임의 수직 해상도의 절반으로 설정해야 한다. 예를 들어, 게임이 1024x768 해상도로 돌아가고 있다면 Size 필드는 768/2=364가 되어야한다.

 

에디터에서 Size 필드를 직접 설정할 수 있지만, 겡미 해상도가 일정하게 변경되지 않을 때에만 올바르게 작동할 것이다. 사용자가 게임 창의 크기나 게임 해상도를 변경할 수 있따면, 다음 스크립트처럼 카메라 크기를 업데이트해야한다.

 

1
2
3
4
5
6
7
8
9
10
11
// 카메라 컴포넌트에 대한 참조 변수
    public Camera gCam;
 
    // 픽셀당 월드 단위 크기에 대한 변수\
    public float PixelsToWorldUnits;
 
    public void UpdateCameraSize()
    {
        // 직교 좌표계의 크기를 업데이트한다
        gCam.orthographicSize = Screen.height / 2.0f / PixelsToWorldUnits;
    }
 

위 코드에 있는 PixelsToWroldUnit을 추가해 스프라이트 텍스처의 Pixels To Units에 해당하는 직교 좌표계 크기를 조정할 수 있께 한 것에 주목하자. 이렇게 하면 스프라이트가 화면상에 정확한 픽셀 크기로 보이도록 하는 데 도움이 된다. 모든 스프라이트가 이 값만큼의 텍스처 픽셀 수와 월드 단위 크기의 비율에 의해 무조건 스케일링되기 때문이다.

 

10. 카메라 렌더링과 후처리 - 프로 버전 전용

11. 카메라 진동

 

 

12. 카메라와 애니메이션

1) 추적 카메라

- 가장 일반적인 카메라 요구 조건 중 하나는 추적 카메라일 것이다. 추적 카메라란 씬에서 특정 오브젝트를 추적하고 따라가는 카메라다. 단순히 따라가는 동작을 만드는 것이 목적이었다면 간단히 오브젝트를 카메라의 부모로 만들어두면 된다. 하지만 일반적으로는 카메라가 갑자기 멈추는 대신 목표에 도달하는 동안 속도와 무관하게 점차적으로 느려지면서 멈추기 위해 속도가 감소하는 방식이 원하는 카메라의 원하는 모습일 것이다. 이렇게 구현하기 위해 Quaternion.Slerp와 Vector3.SmoothDamp 함수를 이용할 수 있다. 

 

2) 카메라와 곡선

- 컷씬이나 메뉴 배경, 단순한 카메라 비행과 같은 것을 만들려면 일단 대략 직선을 따라 카메라를 이동시킬 수 있어야 한다. 카메라가 부드럽게 점차 커지거나 작아지는 움직임으로 이동할 수 있도록 곡률이나 속도에 변화를 줄 수도 있어야한다. 카메라가 시작 지점에서 가지는 속도가 경로의 끝에 도달할수록 천천히 떨어지게 된다는 말이다. 유니티의 애니메이션 에디터에서 미리 정의된 애니메이션을 이용하거나 애니메이션 커브를 사용하면 된다. 

 

3) 카메라 경로: iTween

- 이 기능은 카메라처럼 게임오브젝트를 가지는 개체에 주어지며, 구형 보간을 이용해 일련의 연결된 게임오브젝트로 정의된 궤도나 스플라인을 따라 부드럽게 움직이는 기능이다. 유니티에서 이 기능을 구현하는 방법은 많지만, 쉽고 빠르게 무료로 쓸 수 있는 애드온인 'iTween'을 이용하는 방법이 있다. (http://www.pixelplacement.com/itween/index.php)