Unity C# > 컴포넌트 : Camera 와 프로퍼티/함수 모음

Date:     Updated:

카테고리:

태그:

공부하면서 알게된 것만 정리합니다.😀

👩‍🦰 Camera

🚀 에디터

image

✈ Clear Flags

  • SkyBox
    • 스카이 박스라 불리는 배경으로 빈 공간을 채운다.
  • Solid Color
    • 단색으로 빈 공간을 채운다.
  • Depth Only
    • 빈 공간을 투명 처리한다.
    • 이와 같은 특성 때문에 여러 대의 카메라를 한 화면에 합성할 때 주로 사용한다.
    • 각 여러 카메라들의 영상들을 합성하기 위해선 각각의 카메라가 찍는 화면의 빈 공간은 투명해야 하기 때문이다.
    • 유니티는 여러대의 카메라가 있으면 depth 값이 낮은 카메라부터 먼저 렌더링 하여 차곡 차곡 쌓아서 그린다. 즉, depth 값이 낮은 카메라가 가장 먼저 그려지고 그 위에 depth 값이 높은 카메라가 덮어 씌워져 그려지게 된다.
  • Don’t Clear
    • 화면을 새로 갱신하지 않고 이전의 화면 위에다가 다시 그린다. 때문에 오브젝트가 움직이면 잔상이 화면에 남는다.


✈ Background

  • Solid Color를 선택하여 빈 공간을 배경 색으로 채우기로 했을 때 설정할 배경 색.


✈ Field Of View

카메라 시야 각도. 60도가 디폴트다.


✈ Culling Mask

  • 렌더링 할 레이어들을 다중 선택한다. 오직 체크된 Layer를 가진 오브젝트들만 이 카메라에 렌더링 된다.
    • 예를들어 “A” 레이어만 선택했다면 해당 카메라는 “A” Layer를 가진 그 오브젝트만 렌더링하여 화면에 담는다.
      • Culling Mask 에 체크 되지 않은 레이어를 가진 오브젝트는 그림자조차 렌더링 되지 않는다.
    • Solid Color를 선택했다면 빈공간은 단색, Depth Only를 선택햇다면 빈공간은 투명할 것이다.
  • Clipping Planes
    • 카메라는 모든 공간을 다 렌더링 하지 않는다. Near 평면과 Far 평면 사이에 해당하는 3 차원 공간만 렌더링 하여 카메라 화면에 담는다.
    • Near 값을 최소값인 0.01로 설정하여 최대한 카메라와 가까운 거리도 다 렌더링 될 수 있도록 하였다.
      • 팔을 뻗을 때 팔 아랫부분이 렌더링 되지 않고 잘렸던 이유는 Near 값이 높아 카메라가 렌더링 하는, 즉 찍는 시작점이 카메라로부터 멀었기 때문이다. Near 값을 줄여 카메라 바로 앞 거리도 렌더링 하게 됨으로써 팔 아랫부분이 렌더링 되지 않는 현상을 해결하였다.
      • image
  • Depth 👉 해당 카메라가 그려지는 순서.
  • 유니티니는 카메라 오브젝트가 여러개일 때, Depth 값이 낮은 카메라가 찍는 화면부터 렌더링을 먼저 하고 그 위에 차곡 차곡 쌓아 Depth 순서대로 카메라들의 화면을 렌더링 한다.
  • depth 값이 낮은 카메라일 수록 먼저 렌더링 된다. depth 값이 높은 카메라일 수록 제일 나중에 렌더링 되므로 가장 나중에 덮어 씌우는 격이 된다. 더 우선시 되는 꼴.
    • 메인 카메라는 기본 디폴트 Depth 값이 -1로서 주로 가장 먼저, 동시에 가장 밑에서 렌더링 된다는 것을 의미한다.


✈ Projection

  • Perpective
    • 하얀색 투영 선이 대각선이며 한 점으로 모인다.
    • 멀리 있는건 작게 보이고 가까이 있는건 크게 보인다. 원근감 O
  • Orthographic
    • 하얀색 투영 선들이 평행하다.
    • 멀리 있으나 가까이 있으나 크기가 똑같이 보인다. 원근감 X
      • 2D 에서 많이 사용된다.
      • 3D 에서 사용하면 ‘길건너 친구들’ 게임 처럼 3D면서도 원근감이 없는 독특한 시점이 연출 된다.


✈ Target Texture

카메라가 찍는 화면을 텍스처로서 만들 수 있다. 예를 들어 게임 내에서 CCTV를 사용한다면 그 CCTV 화면 텍스처를 실제로 뭐 다른 카메라 오브젝트가 촬영하는 화면으로 담을 수도 있고 캐릭터 선택 화면 등등 다양한 곳에서 사용할 수 있다. 미니맵 또한 이 기능으로 만들 수 있다! 맵 전체를 촬영하는 카메라를 두고 이 카메라가 찍는 화면을 텍스처로 만들면 될 듯 하다.

카메라에 기본으로 붙는 Audio Listener 컴포넌트는 마이크 같은 기능을 수행한다. 게임 주변의 소리를 녹음하고 플레이어의 스피커를 통해 재생한다. 이 AudioListener은 한 Scene에 한개만 존재해야 한다. 따라서 카메라를 여러개 생성하는 경우에는 일일이 다 이 Audio Listener 컴포넌트를 삭제해주자.


🚀 변수/프로퍼티

✈ Camera.main

“Main Camera” 태그가 붙은 현재 활성화 되어 있는 카메라.


✈ nearClipPlane

  • 해당 카메라의 위치부터 렌더링을 시작할 최소 위치까지의 거리
    • 카메라 컴포넌트에서 near 값 리턴


🚀 함수

화면 상의 좌표는 ScreenViewport 가 있다. 이 둘을 구분해야 함.

✈ ViewportToWorldPoint

public Vector3 ViewportToWorldPoint(Vector3 position);

뷰포트상 좌표를 월드 좌표계로 변환하여 리턴한다.

  • 호출한 카메라가 찍고 있는 Viewport 상에서의 위치(x, y)와 카메라로부터의 거리(z)를 Vector3로 묶어 넘기면 그 위치를 실제 게임 월드의 위치로 리턴해준다.
    • 화면 좌표계
      • Screen 👉 좌하단(0, 0) ~ 우하단(1280, 960) 같이 해상도 픽셀 단위의 화면 좌표계.
        • (0, 0) ~ (Screen.width, Screen.height) 의 범위를 가짐
      • Viewport 👉 좌하단(0, 0) ~ 우하단(1, 1) 같이 해상도를 0 ~ 1 사이의 비율 단위로 나타낸 화면 좌표계
  • 인수로 넘기는 Vector3의 z 값은 카메라 오브젝트로부터 실제 카메라가 찍고 있는 화면까지의 실제 게임 월드 거리, 즉 카메라의 깊이를 의미한다. 카메라로부터의 거리.
    • (0.5f, 0.5f, 0.0f)를 넘겨준다는 것은 카메라 화면의 정중앙을 월드 좌표로 변환하되 z 값은 카메라의 위치와 일치. (카메라로부터 거리 0 이므로)


✈ ViewportPointToRay

public Ray ViewportPointToRay(Vector3 position);

  • 카메라가 찍고 있는 화면 Viewport 상의 위치를 Vector3로 넘기면 그 화면 상 위치를 가로지르는 Ray를 리턴한다.
    • 과정
      • 카메라 위치로부터, Viewport 상에서의 위치(인수의 x, y)를 카메라와의 거리(인수의 z)를 고려하여 월드 기준의 좌표로 변환한 좌표를 향하는 Ray 광선을 리턴한다.


✈ ScreenPointToRay

public Ray ScreenPointToRay(Vector3 pos);

public Ray ScreenPointToRay(Vector3 pos, Camera.MonoOrStereoscopicEye eye);

  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
  • 호출한 카메라 위치로부터 픽셀 단위의 화면상 좌표의 실제 월드 좌표로 향하는 방향의 Ray (광선)을 리턴한다.
    • 아래 과정은 위 함수 한 줄과 비슷하다. 아래 과정에다가 추가로 해당 dir로 향하는 Ray를 직접 리턴한다.
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
            Vector3 dir = mousePos - Camera.main.transform.position;
            dir = dir.normalized;
      
  • 마찬가지로 화면상 좌표(X, Y)와 함께 월드 좌표의 Z 값을 계산할 때 고려할 카메라와의 거리 또한 Z 로 함께 Vector3로 묶어 넘겨 준다.
  • Raycast 에 시작 위치와 방향을 넘기는 대신 광선 자체인 ray를 넘겨준다.


✈ WorldToScreenPoint

public Vector3 WorldToScreenPoint(Vector3 position);

  • 월드 좌표계 위치(Vector3)를 인수로 받아서 이를 카메라 화면 상의(Screen) 위치로 변환하여 Vector2 를 리턴한다.
    • Screen 👉 좌하단(0, 0) ~ 우하단(1280, 960) 같이 해상도 픽셀 단위의 화면 좌표계
    • Viewport 👉 좌하단(0, 0) ~ 우하단(1, 1) 같이 해상도를 0 ~ 1 사이의 비율 단위로 나타낸 화면 좌표계
  • 카메라가 투영 되면 z 값은 무시된채 (x, y) 월드 좌표가 Screen 화면 좌표계로 변환될 것이다.


✈ ScreenToWorldPoint

public Vector3 ScreenToWorldPoint(Vector3 position);

  • 픽셀 단위의 화면 좌표계 위치(x, y)와 월드 좌표 z 를 구하는데 사용할 카메라로부터의 원하는 거리(z) 를 Vector3로 묶어 넘기면 월드 좌표계로 변환해주고 이를 리턴해준다.
 Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane)); 
  • ScreenToWorldPoint 함수 👉 화면 좌표계를 월드 좌표계로 변환하고 리턴함
    • ScreenToWorldPoint 에다가
      • 마우스를 클릭한 화면상의 좌표(X, Y)와
        • (0, 0) ~ (Screen.width, Screen.height) 범위를 가진다.
      • 화면 상 좌표는 Z 값이 없다. 따라서 월드 좌표로서의 Z 값을 정할 때 고려할 카메라와의 거리 를 함께 Vector3로 묶어 넘겨 주어야 한다.
        • 현재 카메라의 위치인 camera.main.transform.position.z값으로부터 Vector3로 함께 묶어서 넘긴 z 값(카메라부터의 거리)을 더해준 값을 화면 좌표계를 월드 좌표계로 변환했을 때의 z값으로 삼는다.
          • 단지 인수로 넘겨주는 Vector3 의 z값은 이 값으로 월드 z 좌표로 삼겠다는게 아니라 이걸 카메라와의 거리로 받아들이고 이걸 고려해서 월드 좌표계 기준 z로 만들겠다는 것이다. 착각 노노!
          • z값 없이 화면 좌표계(X, Y)를 가지던 마우스 클릭한 곳을 월드 기준으로 전환한 좌표의 z값은 위의 예로는 camera.main.transform.position.z + Camera.main.nearClipPlane 가 된다.
            • 카메라의 nearClipPlane 은 카메라 컴포넌트의 near. 카메라가 카메라로부터 렌더링을 시작하는 곳 까지의 z 축 기준의 거리
    • 이렇게 세 가지 요소를 Vector3 로 묶어서 인수로 넘겨주면 적절한 월드 좌표계로 변환해준다.

image

예를 들어 게임 화면 상에서 화면상 픽셀 좌표 기준으로 (160, 180)에 해당하는 픽셀에 마우스 클릭을 했다고 가정해보자. 이 좌표는 Vector3 로 보면 (160, 180, 0) 상태일 것이다. 화면상 좌표는 z 값 없이 2D 니까.. 클릭했던 이 (160, 180) 픽셀 좌표를 게임 월드 기준으로 변환하고자 ScreenToWorldPoint(Vector3(160, 180, 3)) 로 실행시켰다고 가정해보자. z값으로 넘긴 3 을 카메라와의 ‘거리’를 3 이라고 고려하여 화면상 좌표인 (160, 180)를 월드 기준 좌표로 변환했더니 (3.7, 4.8, -0.6)이 되었다. 현재 카메라 위치의 z 값 + 3 👉 - 0.6.


✈ ScreenToViewportPoint

public Vector3 ScreenToViewportPoint(Vector3 position);

  • (0, 0) ~ (Screen.width, Screen.height)로 나타낼 수 있는 픽셀 좌표(Screen)를 (0, 0) ~ (1, 1)로 나타내는 Viewport, 즉 비율 좌표로 변환하여 리턴한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

UnityDocs 카테고리 내 다른 글 보러가기

댓글 남기기