7. Rectangles and Lights

이현기·2022년 8월 14일
0

RayTracing:The-Next-Week

목록 보기
7/9
  • 주의 사항
  1. 이 글은 RayTracing:The Next week을 공부하며 작성한 글이다.
  2. 모든 사진, 글은 RayTracing:The Next week에서 가지고 왔다.
  3. 영어 해석, 이론적으로 틀린 내용이 존재할 경우가 매우 크다. (지적해주시면 감사합니다.)
  4. 글을 쓰는 능력이 매우 안좋으니 이해해주세요. 연습 중 입니다.

자 이제 RayTracing에서 내가 중요하게 생각하는 light에 대해서 다루는 시간이 될 것 같다. 마지막에 새로운 형태로 rendering하는 것 까지 있으니 포기하지말고 끝까지 해보자.

Lighting이라는 것은 Ray Tracing에서 매우 중요한 요소 중 하나이다. 우리는 simple raytracres에서 공간의 점처럼 추상적인 light 자원을 사용했다. 현대적인 접근법에서는 위치와 size같은, 더 많은 물리 기반인 light들로 접근한다. light 자원을 만들기 위해서는 우리는 사각형 object를 만들어야 하고 그리고 그것을 빛을 방출하는 Object로 만들어 본다고 한다.

재밌겠다.

앞의 새로운 class를 생성해보고 그리고 사각형 object를 만들어 보자. 사각형은 종종 인공환경을 모델링 하기 엄청 편리하다. 왜냐하면 사각형은 축에 정렬하기 매우 쉽기 때문이다. 이제 진짜 만들어 보자. 아래의 사진을 참고하길.


위의 사진을 보면 xy 사각형 평면이 존재한다. 이 평면은 z의 값으로 ex: (z=n)(z=n)으로 이루어 진 것이다. 그러면 우리는 축에 정렬된 사각형을 x=x0,x=x1,y=y0,y=y1x = x_0, x = x_1, y = y_0, y = y_1로 정의 할 수 있다. 그리고 우리는 생각해야할 것이 우리는 Ray가 우리가 만든 사각형에 어디에 hit될 지를 결정해야 한다. Ray P(t)=A+tbP(t) = A + tb가 호출 되었을 때 z는 Pz(t)=Az+tbzP_z(t) = A_z + tb_z로 정의 되어진다. 그래서 아래의 식처럼 우리는 t를 재배치하여 구해내야 한다.

t=kAzbzt = \frac{k - A_z}{b_z}

위의 식으로 우리가 t를 구해낸다면 x와 y 또한 같은 형식으로 구할 수 있다.

x=Ax+tbxx = A_x + tb_x
y=Ay+tbyy = A_y + tb_y

여기에서 hit는 x0<x<x1x_0 < x < x_1이고 y0<y<y1y_0 < y < y_1으로 결정된다.
왜냐하면 우리의 사각형은 축에 정렬이 되어있기 때문이다. 그것들의 bounding box들은 무한히 얇은 면을 가지고 있을 것이다. 이것은 우리의 BVH(앞서 배운 내용!)를 나눌 때 문제가 될 수 있다.

bounding box를 구할 때 우리는 포함관계를 따지며 Tree를 구성한다고 했다. 그러면 만약 무한한 bounding box가 존재를 한다면 Tree를 구성하지 못하게 되고 모든 것에 대해 overlap이 되기 때문에 연산에 오류가 발생한다!! (맞나? 내 생각이다.)

이것을 해결하기 위해서, 모든 hit 가능한 object는 모든 차원을 따라 width가 유한한 bounding box를 얻어야 한다. 우리의 직사각형의 경우, 우리는 상자를 무한히 얇은 면의 방향으로 살짝 padding시켜 bounding box를 정의 하는 것이다.

이론적인 내용이 끝났다. 한번 코드로 구현을 해보자.

결과

좀 이쁘다. ㅎㅎ

예시 사진을 하나 더 주기 때문에 그것도 해보자!

원이 조금 올라갔지만 그래도 아까보다 밝아졌다.

이제 "Cornell BOX"를 만들어 보자.

드디어 논문에서 많이 보이던 모양을 얻게 되었다. 아주 좋다. 이제 이론적인 chapter는 2개 정도 남았다!

profile
안녕하세요!

0개의 댓글