일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 |
- HTML
- 데브런 #노코드게임제작 #데브런와디즈 #AI게임제작
- 스팀 도과 Reset
- 연산자
- 테이블 생성
- 스팀 도전과제 Reset
- JavaScript
- Achievement unity
- Steam Achievement Reset
- header
- #데브런 #노코드 #노코드게임제작 #데브런와디즈 #ai게임제작
- 회원가입
- error
- sqlite3
- 장고
- 슬라이싱
- 인덱싱
- 도전과제 unity
- 파이썬
- django
- Python
- 상속
- 파이썬 웹 개발
- 오프라인 환경
- Unity
- 튜플 단일 요소
- 도과 테스트
- 모듈
- 파이썬 패키지 설치
- nodejs
- Today
- Total
개발성문
Unity 터치 포인트 좌표에 바운스 볼 생성 (3) - Camera.ScreenPointToRay, Screen, Viewport, World 본문
Unity 터치 포인트 좌표에 바운스 볼 생성 (3) - Camera.ScreenPointToRay, Screen, Viewport, World
개발성문 2018. 4. 5. 12:59내용을 본격적으로 나가기에 앞어서 자주 언급 되어질 용어에 대해 먼저 설명을 해두겠습니다.
- Screen 좌표 :
스크린은 우리가 보는 게임 화면 입니다. Unity에서 는 Game 이라는 Tab이 있고,
거기에서 자신이 원하는 사이즈를 설정 할 수 있죠. 그 크기가 x 축과 y 축을 기준으로 좌표를 나타낼 수 있습니다.
그림에서 처럼 width 800, height 1280의 사이즈인 스크린이 정했졌는데, 참고로 스크린 좌표는 픽셀단위로 정의됩니다.
좌표를 보면 (0, 0), (800, 0), (800, 1280), (0, 1280) 이와 같이 표현 됩니다.
- Viewport 좌표 :
viewport는 가상의 화면으로, 하나의 카메라에 하나만 가질 수 있습니다. 기본 값은 항상 현제 화면의 전체 크기인데요.
카메라로 부터 네개의 직선이 나와 있는데 선의 끝점을 이으면 직사각형의 모양이 됩니다.
카메라에서 끝의 직사각형까지 이어지는 직선 어느곳에서 점을 찍어 이으면 마찬가지로 직사각형이 만들어지죠.
이 직사각형을 viewport 라고 보면 될것 같습니다. 임의로 다른 위치에서 점을 이어 viewport 를 그려 보았는데,
각각 네개의 점을 Viewport Rect 라고 합니다. 이것이 viewport의 좌표이기도 하죠.
화면의 왼쪽 하단이 (0, 0), 오른쪽 상단은 (1, 1)이 됩니다.
구성은,
X : 카메라 뷰가 그려질 수평 포지션 시작점.
Y : 카메라 뷰가 그려질 수직 포지션 시작점.
W(width) : 화면상 카메라의 출력 너비.
H(height) : 화면상 카메라의 출력 높이.
이와 같습니다.
여기서 screen 좌표와 차이가 생기죠. 픽셀단위로 정의 되는 screen 좌표와는 다르게 viewport는 백분율로 정의되어
0부터 1까지만 허용됩니다.
추가적으로 그림에서 가깝고 먼 것에 대해 표현 했는데, 랜더링을 시작 또는 중지하기 위한 카메라로 부터의 거리
를 Clipping Planes 이라고 하며, 상대적으로 가장 가까운 포인트를 Near, 가장 먼 포인트를 Far이라고 합니다.
- World 좌표 :
world 좌표는 Unity를 배우는데 있어서 가장 기초이죠.
세개의 축으로 이루어 져있습니다.
기본적인 용어에 대한 설명을 여기서 마치고 본 내용을 들어가 보도록 하죠.
touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began) { Vector3 pos1 = Camera.main.ScreenToViewportPoint(touch.position); Debug.Log("pos1 : " + pos1); Vector3 pos2 = Camera.main.ScreenToWorldPoint(touch.position); Debug.Log("pos2 : " + pos2); Vector3 pos3 = Camera.main.ViewportToScreenPoint(touch.position); Debug.Log("pos3 : " + pos3); Vector3 pos4 = Camera.main.ViewportToWorldPoint(touch.position); Debug.Log("pos4 : " + pos4); Vector3 pos5 = Camera.main.WorldToScreenPoint(touch.position); Debug.Log("pos5 : " + pos5); Vector3 pos6 = Camera.main.WorldToViewportPoint(touch.position); Debug.Log("pos6 : " + pos6); ray = Camera.main.ScreenPointToRay(touch.position); Debug.Log("ray : " + ray); if (Physics.Raycast(ray, out hit, MAX_DISTANCE)) { Debug.DrawLine(ray.origin, hit.point, Color.blue); Debug.Log("오브젝트 : " + hit.transform.name); } else { Debug.DrawLine(ray.origin, ray.direction * 100, Color.red); } GameObject shpere = Instantiate(sphere); shpere.transform.position = ray.origin + ray.direction * 10f; }
본 내용이라고는 하지만 변환된 값이 어떻게 다른지에 대해서만 다루는 정도만 되겠습니다.
모든 테스트는 화면의 왼쪽 하단을 터치 또는 마우스 클릭으로 얻어낸 값입니다.
소스와 결과 값은 같이 보도록 하죠.
1. pos1 은 ScreenToViewportPoint 함수를 사용했습니다.
Transform > position 의 화면 좌표(x, y)에서 viewport 좌표로 변환하는 역할을 합니다.
2. pos2 는 ScreenToWorldPoint 함수를 사용했습니다.
Transform > position 의 화면 좌표(x, y)에서 world 좌표로 변환하는 역할을 합니다.
3. pos3 은 ViewportToScreenPoint 함수를 사용했습니다.
viewport 좌표를 Transform > position 의 화면 좌표(x, y)로 변환하는 역할을 합니다.
4. pos4 는 ViewportToWorldPoint 함수를 사용했습니다.
viewport 좌표를 world 좌표로 변환하는 역할을 합니다. 여기에서는 x, y로만 표현 되는 좌표가 3D의 x, y, z 좌표로 표현된
다는 것에 주의가 필요합니다.
5. pos5 는 WorldToScreenPoint 함수를 사용했습니다.
world 좌표를 Transform > position 의 화면 좌표(x, y)로 변환하는 역할을 합니다.
6. pos6 은 WorldToViewportPoint 함수를 사용했습니다.
world 좌표를 viewport 좌표로 변환하는 역할을 합니다.
어떻게 사용하는지는 알았지만 어떻게 활용하는지는 아직 모르겠네요.
위의 내용은 새로운 내용이 정리되는데로 다시 글을 써 보겠습니다.
지금 볼 내용은 지난 포스팅 중에 Raycast에 대해 정리 한 글이 있었는데요. 그와 관련 한 내용입니다.
Ray 는 시작점과 방향을 가지고 가상의 광선을 쏜다고 했습니다.
Camera 에는 Ray 와 관련하여 2가지 기능이 있습니다.
1. ViewportPointToRay
viewport 좌표를 통해 카메라에서 Ray를 반환합니다. viewport 좌표이므로 0 부터 1까지의 값에 제한됩니다.
2. ScreenPointToRay
카메라로부터 스크린의 점을 통해 Ray를 반환합니다.
저는 ScreenPointToRay를 사용했는데요. 여기서 반환받은 Ray를 가지고 원하는 위치에 오브젝트를 생성하도록 했습니다.
그리고 RaycastHit 변수에 할당 받은 값으로 내가 클릭한 위치 선상에 어떤 오브젝트가 있는지 알수도 있었습니다.
소스의 제일 하단에 생성한 오브젝트의 position 을 변경하는데
ray.direction * 10f
10f 라는 값을 주었는데, 이것은 제가 원하는 위치에 생성하기 위함입니다.
제가 원하는 위치라는 것은 x, y 좌표 위치는 아닙니다. 이미 터치나 클릭을 통해 원하는 값으로 position 을 셋팅 했기 때문이죠.
문제는 여기에 Z 축은 무시되어 있다는 겁니다.
정확하지는 않지만 Ray 선 상의 Z축 방향으로 오브젝트 위치가 변경이 되는 것을 확인 했기때문에 제가 사용해본 느낌으로
는 Ray 선 상의 Z 축 방향의 위치를 조절하기 위한 것이 아닐지 생각하고 있습니다.
여전히 부족함이 많은 글이었지만 이번 포스팅은 3번으로 마무리 짓도록 하겠습니다.
다음의 주소에서 도움을 얻었습니다.
유니티 - 카메라 컴포넌트 설명 - http://twinbraid.blogspot.kr/2015/02/blog-post_26.html
에메랄드 타블릿 - 유니티 3D 좌표에서 2D 좌표 뽑기http://theemeraldtablet.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-3D-%EC%A2%8C%ED%91%9C%EC%97%90%EC%84%9C-2D-%EC%A2%8C%ED%91%9C%EB%BD%91%EA%B8%B0
Unity
https://docs.unity3d.com/kr/530/ScriptReference/Camera.html
'공부 좀 하자 > Unity' 카테고리의 다른 글
Steamworks Build Upload-SteamPipe(스팀웍스 업로드 - 스팀파이) (1) | 2022.06.02 |
---|---|
Camera.main.ScreenPointToRay() 사용시 에러 (1) | 2018.12.18 |
Unity 터치 포인트 좌표에 바운스 볼 생성 (2) - Touch (0) | 2018.04.04 |
탱크(Tank)로 실험한 회전, euler, Mathf.Clamp (0) | 2018.04.03 |
Unity 또 하나의 충돌체크 Debug.DrawRay, Physics.Raycast 에 대해 (0) | 2018.04.02 |