8. Instance

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

Cornell Box와 이어지는 이야기...

Cornell box안에 작은 block을 두 개 더 만드는 이야기이다. 살짝 돌아간 블록을 두개 더 만들고 box.h라는 Header file이 추가된다.
우리는 그러면 아래와 같은 결과를 볼 수 있다.

조금 이상한 결과이다...

우리는 이제 2개의 box를 얻었지만 이걸 약간씩 Rotate를 해야 조금 더 진짜 같은 cornell box를 얻을 수 있다고 한다. Ray Tracing안에서는, 이것은 보통 instance 로 이루어진다. instance 라는 것은 어떤 물체가 움직이거나 돌리는 것에 관한 기하학적 primitive이다. 하지만 이것은 Ray Tracing안에서는 매우 쉬운 작업으로 수행할 수 있다. 왜냐하면 아무것도 움직이지 않기 때문이다. 대신에 우리는 Ray를 반대 방향으로 움직인다. 예를 들어서 Translation(움직임)을 예시로 두자. 아래의 그림을 참고하자.


우리는 분홍색 사각형에 대한 Origin을 모두 가지고 올 수 있고 그리고 여기에 x축으로 2만큼 더 할 수 있다. 또는 다른 방법으로는 box를 움직이지 않고 hit routine 안의 x에서 2를 빼는것이다.

hit 루틴안에서 2를 뺀다는 소리는 우리가 hit 함수를 사용할 때 거기에 offset을 추가해서 Ray를 계산할 때 offset에 대한 연산을 추가하는 것을 code에서 확인할 수 있다.

그리고 이제 Rotation에 관한 이야기도 나오고 있다. Rotation은 이해하기 어려울 수도 있다고 한다. 일반적인 그래픽스 기술에서는 회전이 모두 x, y, z축에 적용이 되어야 한다. 이런 rotation들은 어떤 의미로 축에 정렬되어 있다. 먼저 예시로 z축에 대한 회전을 하게 된다면 x, y만 변경이 될 것이고 그리고 z는 변하지 않을 것이다. 아래의 그림은 z축 위에서 바라본 모습을 그래프로 나타낸 것이다.

위의 사진을 봤을 때 우리는 쉽게 x와 y를 삼각함수를 이용하면 구해낼 수 있다는 것을 알 수 있다. 많은 그래픽스 책에서 rotation에 관해서 다루는 이야기가 많다. 그래서 여기서는 간략하게 수식으로만 작성을 하고 넘어가겠다.

x=cos(θ)xsin(θ)yy=sin(θ)x+cos(θ)yx^\prime = \cos(\theta)\cdot x - \sin(\theta) \cdot y \\ y^\prime = \sin(\theta)\cdot x + \cos(\theta) \cdot y

위의 식은 z축을 기준으로 두고 Rotation을 한 것이다. 이렇게 삼각함수를 이용하여 rotation을 구할 수 있고 이것을 matrix로도 나타낼 수 있다. LearnOpenGL 홈페이지에서 표시한 행렬이다.


이처럼 x, y축에서도 대한 회전 Matrix도 구할 수 있다.

증명은 삼각함수의 합성을 사용하면 구해낼 수 있다!!

Traslation 상황과 달리 Rotation을 하게 되면 Normal vector도 달라지기 때문에 변환을 해주어야 한다. 이제 코드를 작성해보자.

결과

오 조금 더 이뻐진 사진을 받을 수 있었던 것 같다!

profile
안녕하세요!

0개의 댓글