한때 카메라를 공부한적이 있어 유니티의 RayCast를 공부하다 보니 다시 한번 빛의 발사와 반사를 생각해 봤다. 인터넷에 자료가 별로없어 직접 만들어봤는데 학문적인 정도는 아니니 참조만 하시기 바란다. 틀릴수도 있음 ㅎㅎ

우리가 물체가 보이는 이유는 광원이 있어서 이다 물론 일부 자체 발광하는 것도 있지만 .

정확히 말해 우리는 물체를 보는것이 아니라 반사되는 빛을 눈을 통해 보고 뇌로 느낄 뿐이다.

다음은 빛이 물체에 반사되는 경로를 보여준다.

1. 전구와 같은 광원은 사방으로 퍼진다.

2. 이중 물체에 반사되어진 빛은 다시 넓게 퍼진다.

3. 만일 앞에 스크린이나 종이가 있다면 이 퍼진 빛들이 충돌하게 되는데 사방에서 온 빛들이 섞여 구분할 수 없다.

4. 실제 우리가 아무리 종이를 쳐다보고 있어도 거울처럼 아무것도 반사되지 않는 점을 생각해보자.

어릴때 핀홀카메라라고 실험해보신 적이 있을것이다. 물체와 종이사이에 작은 구멍이 뚫린 종이를 놓자.

1. 물체에 반사돼 넓게 퍼져나가던 빛중 구멍을 통과하는 일부 빛만 통과되어 건너편 종이에 맺히게 된다. 

2. 물체에 모든 점에 반사되 빛은 건너편 종이에서 섞이지 않게되어 우리가 하나하나의 점을 구분할수 있게되거 전체적으로 상으로 보인다.

3. 종이에 맺힌 상은 상하좌우가 반대로 되게 된다. 집에서 실험해면 역시 허옇게 아무것도 안보인다 왜냐하면 주변에 빛이 너무 밝기 때문이다. 그래서 검은 종이상자로 주변빛을 차단하면 성공하는거다.

4. 방에 창문을 검정색으로 가리고 쪼그만 구멍을 뚫으면 거짓말 처럼 벽에 밖의 풍경이 찍히게 된다.

핀홀카메라의 개선 

핀홀카메라의 단점은 빛이 한구멍만 통과하다보니 어둡다는 거다. 사람의 눈은 렌즈가 있어 빛을 모아 밝은거다. 이걸 흉내내어 핀홀 구멍을 크게해보자 그러면 문제가 물체의 한점에서 반사된 빛민 건너편 스크린에 맺히는게 아니라 널어진 홀만큼의 사이즈 만큼의 반사된빛이 섞이게 되면서 흐릿하게 된다. ㅠㅠ

렌즈로 초점을 모으자

사람의 눈을 잘 보자. 생물시간에 배우셨겠지만. 렌즈가 들어 있다. 렌즈는 빛을 모아준다. 따라서 구멍을 통과한 빛을 렌즈를 통해 한점으로 스크린위에 모이므로 전체적인 이미지는 또렸하게 된다. 

 

그러나 이 렌즈 시스템도 문제가 있다 왜냐하면 렌즈의 초점거리는 정해져 있기 때문에 일정한 거리의 점들만 잘 보이게 되고 더 멀거나 가까운 물체는 다시 흐릿하게 된다.

인간의 눈의 렌즈는 말랑말랑한 수정체로 실시간으로 초점거리를 변경해 다양한 거리의 물체의 초점을 잡을수 있게 만들었다.

우리가 낮에 사물을 보면 단일평면이 아니 꽤 넓은 범위의 물체를 깨끗히 볼수 있어 위의 설명이 거짓말 같지만 낮에는 빛이 밝아 눈의 조리개가 작아지면서 빛이 통과하는 구멍이 작아져 위의 핀홀카메라와 같이 한점만 통과해서 그렇다. 그걸  피사체 심도가 싶다는 표현을 쓴다. 여러분이 좋와하는 뽀샤시는 조리개를 열어 특정한 범위에만 초점을 맺히게히 배경을 흐리는 효과도 이해하길수 있을거다.

 

종이대신 촬상소자를 놔보자

카메라는 촬상소자라는게 있어 빛을 2차원의 전기신호로 바꿔준다.

아래 오른쪽을 보면 4x3의 센서들이 배열로 배열되어 있다. 이걸 전기신호로 바꾸면 해상도가 수평x수직: 4*3인거다. 아마 촬송소자에 비친 이미지는 해상도가 너무 낮아 알아보기 힘들거다. 

하여간 우리 카메라는 지금 4x3의 센서들이고 잘생각해보면 광원에서 출발해서 센서에 도착한 광선의 수는 4*3=12개이다.

우리는 촬상소자 12개에 도착하는 광량을 12번의 계산으로 시뮬레이션할수 있다..해상도만큼의 계산만 하면되는거다.

반사각이 -90~90도 사이의 광선만  CCD에 도달할 것이고 대략 광원의 밝기 x 물체의 질감및 반사각에 따라는 반사율이 될것이다. 

유니티의 게임뷰

유니티는 월드좌표에 조명과 게임오브젝트, 카메라가 배치되어 있다.  위의 그림과 다를게 없다. 해상도가 좀 높을 뿐이다.

따라서 해상도가 1920x1080이라면 약200만개의 광선이 필요하다. 실제적으로는 RGB 3원색 이므로 600만개일수도 있다.  아직 유니티의 내부 렌더링 구조는 모르지만 CCD까지 시뮬레이션 할 필요는 없을것 같고 필홀부분이 카메라의 Origin좌표가 되어 여기를 기점으로 입사광선의 반사율을 계산하면 월드좌표를 게임뷰로 변환할수 있을것 같다.

여태까지 서론이 길었던건 바로 다음 기능을 생각해보기 위해서다.

  • Ray 변수 : 카메라 원점에서 에서부터 타겟지점까지의 벡터, 스크린해상도에 해당하는 광선중 한개
  • RaycastHit 변수  : 충돌 정보가 담기는 변수
  • Raycast 함수 : 레이저를 Ray정보를 이용해서 쏴준다. 

유니티에서는 Origine에서 레이저를 쏴서 충돌검사를 할수 있는데 위의 카메라의 입사하는 광선이 꺼꾸로  카메라 원점에서 부터 발사된다고 생각하면 간단하다.

카메라 원점에서부터 해상도만큼의 광선이 존재할수 있고. 마우스좌표는 이 광선들 중이 하나를 지나가고 이 광선을 추적하면 월드좌표내의 오브젝트의 충돌을 검출할 수 있다.

내 상상이 맞는지는 모르겠지만. Raycast를 공부하면서 느낀점을 정리 해봤다.

+ Recent posts