NGUI <-> World 좌표계 상호 변환

1. World 좌표계 -> NGUI 좌표계

  • 사용 예시 : RPG 에서 캐릭터 머리 위에 따라다니는 HP Bar 등
  • 참고 : World 좌표계에서 Viewport 좌표계로 중간 변환하고 나서 다시 NGUI 좌표계로 변환한다.

UICamera.mainCamera.ViewportToWorldPoint (Camera.main.WorldToViewportPoint (worldPosition));

2. NGUI 좌표계 -> World 좌표계  

  • 사용 예시 : 캐릭터 아이콘 UI 에서 실제 월드상의 캐릭터 3D 모델에게 선을 긋는다.
  • 참고 : 위와 같이 Viewport 좌표계 변환이 한 번 있어야 한다.
  • 가장 중요한 포인트!
  • NGUI 좌표계에서 z값이 0 인데 특정 값을 꼭 넣어야 한다.
  • 그렇지 않으면 항상 카메라 위치가 나오게 되므로 2D->3D 가 애초에 안되니 Ray 를 쏘거나 복잡해지는데
  • z값에 값을 넣게 되면 간단히 해결!
public static Vector3 NGUIToWorld(Vector3 nguiPosition)
{
    nguiPosition.z += 5f;
    Vector3 worldPosition = Camera.main.ViewportToWorldPoint(UICamera.mainCamera.WorldToViewportPoint(nguiPosition));
    return worldPosition;
}

마우스의 현재 위치를 가져오기 위해 사용하는 Input.mousePosition은 스크린 좌표계를 사용한다.따라서 이 좌표를 월드 좌표로 변환해주기 위해 사용하는 것이 Camera.ScreenToWorldPoint()인데, 한가지 주의해야할 점이 있다.Input.mousePosition의 z값이 항상 0이라는 것이다.따라서 Camera.main.ScreenToWorldPoint(Input.mousePosition)을 하게 되면 그 결과는 카메라의 월드 좌표값이 나오게 된다.그래서 Input.mousePosition을 그대로 사용하면 안되고, z값을 변경해준 뒤에 사용해야 한다.예를들어 아래와 같이 사용할 수 있다.

Vector3 screenMouse = Input.mousePosition;screenMouse.z = Camera.main.WorldToScreenPoint(Vector3.zero).z;Vector3 worldMouse = Camera.main.ScreenToWorldPoint(screenMouse);

screenMouse의 z 값에 대입한 값의 정체를 생각해보자.월드 좌표계의 원점(0, 0, 0)을 스크린 좌표계로 변환한 값이다. 이는 카메라의 위치에 따라 다른 값이 될 수 있겠다.어쨌든 이렇게 하면 마우스 클릭이 월드 좌표계의 z값 0인 위치에서의 클릭 지점이 되겠다. 

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다