[RT in One Weekend Series 6] Surface Normals and Multiple Objects (번역)

By | 2019-06-02

목차: Series 1: Index and Overview (Link)
이전 글: Series 5: Adding a Sphere (Link)
다음 글: Series 7: Antialiasing (Link)

이번 글에서는 구의 표면 색상값을 Normal Vector 값으로 변경하는 코드를 작성한다.

MK: 그래픽에서 Normal Vector 값은 아주 많이 사용된다. 특히 Light (빛) 색상을 결정하는 단계에서 아주 기본적인 개념이다.

그림 1: 구의 Normal Vector 값을 계산하는 방법

그림1은 구에서 Normal Vector 값을 계산하는 방법이다. 간단하게 구의 표면 위치에서 구의 중심부를 빼는 연산을 수행하면 Normal Vector 계산이 가능하다. 그래픽 연산에서 보통 Normal Vector는 Unit Vector로 변경하여서 사용한다. Unit Vector 계산 방법은 출처2를 참조하면 된다. Normal Vector의 값은 -1에서 1사이에 존재한다. 색상을 표시하기 위해서 Normal Vector 값을 0~1 사이 값으로 변경해야 한다. 이와 더불어 X/Y/Z를 R/G/B로 변경한다. 아래 코드는 구의 Normal Vector값을 계산 후  X/Y/Z값을 색상 값인 R/G/B로 변경하는 코드이다.

그림 2: Normal 값을 Color값으로 변경한 이미지 결과

그림 2는 위 코드를 실행한 결과 이미지이다. 이제 여러 개의 구를 그리는 코드를 추가로 작성할 계획이다. 여러 개의 구를 그리는 가장 좋은 방법은 추상클래스(Abstract Class)를 하나 생성하여 모든 물체(Object)를 추상클래스를 사용(상속)하여서 클래스를 생성하는 방법이다. 해당 추상클래스는 Ray와 Hit 여부를 판단할 수 있는 클래스이다. 아래 코드는 hitable이라는 추상 클래스를 생성하는 코드이다.

위 코드를 보면 Struct 을 사용해서 Ray와 Object가 Hit 한 결과를 저장한다. 추상 클래스에 tMax, tMin 값이 존재한다. 여기서 tMin, tMax값은 Ray가 Travel(이동) 하는 거리를 의미한다. tMax보다 먼 거리는 Ray가 도달하지 않는다고 판단한다. 반대로 tMin의 경우 너무 가까운 Object의 무시하기 위해서 사용한다. Ray가 주어진 거리 안에서 Object와 Hit이 발생하는 경우 Struct(hitRecord) 값을 업데이트한다. 아래 코드는 hitable 추상 클래스를 사용하여 sphere 클래스를 생성한 코드이다.

MK: 뒤에 코드를 작성하다 보면 tMax값은 변경된다. 예를 들어서 카메라에서 멀리 있는 구를 먼저 hitableList 에서 Hit여부를 판단하는 경우 tMax값이 줄어든다. 하지만, tMin의 경우 존재하는 이유를 아직은 잘 모르겠다. 코드를 계속 작성해봐야 하겠지만 이번 장에서는 tMin값은 사용하지 않는 값으로 판단된다.

다음은 hitable 추상클래스를 사용하여 hitableList 클래스를 생성하는 코드이다. 해당 코드는 모든 hitable Object를 순차적으로 확인하여서 Ray와 Hit하는 가장 가까운 Object를 판단한다. hitableList 클래스의 경우 앞에 작성한 Object를 모두 List(리스트) 형태 저장한다.

마지막으로 Main 코드에서  hitableList 의 hit 함수를 호출하도록 수정한 코드이다.

아래 그림 3은 위 코드를 컴파일하여서 실행하면 보여주는 결과 이미지이다. 2개의 구가 그려진 것을 확인할 수 있다. 하나의 구의 경우 사이즈가 큰 관계로 구의 위만 보인다. 아래 구의 색상이 거의 동일한 이유는 구의 Normal Vector 값이 거의 동일하게 위로 향하기 때문이다. 작은 구의 위에 부분을 확대한 결과라고 보면 된다. 작은 구의 윗부분 역시 초록색인 것을 확인할 수 있다.

그림 3: 여러개의 구를 그린 결과

출처

  1. http://www.realtimerendering.com/raytracing/Ray%20Tracing%20in%20a%20Weekend.pdf
  2. https://en.wikipedia.org/wiki/Unit_vector

Leave a Reply

Your email address will not be published. Required fields are marked *