본문 바로가기
컴퓨터 그래픽스/Ray Tracing

Ray Tracing(12) - 빛의 굴절

by SL123 2024. 7. 17.

 

오늘은 빛의 굴절되는 현상을 알아보도록 하겠습니다.

 

아래에는 참고하기 좋은 예제입니다.

https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-shading/reflection-refraction-fresnel.html

 

Introduction to Shading

Scratchapixel is used by 400,000 people yearly, yet no company supports us, not even with free software licenses. There's a global demand for accessible, high-quality education, and if these profitable companies refuse to help, we'll show them they're wron

www.scratchapixel.com

 

 

구 모양이 있을 때 위아래가 바뀌고 휘어있는 형태로 나타납니다.

빛이 들어가면 표면에서 굴절되고 안 쪽으로 지나가고 
물체에서 나올 때 다시 한번 굴절됩니다.

 


위 그림은 빛이 물체에 충돌하면 안 쪽에 새로운 굴절 Ray를 만듭니다.
그리고 다시 밖으로 나갈 때 충돌을 감지합니다.
밖으로 나갈 때 충돌값을 이용해 빛의 굴절을 구할 것입니다.

굴절 유도 과정

a · (-b) = - a · b
a · b = b · a

unit vector 기준 a · b = cosθ 이며,
코사인 사인 공식을 사용하면
cos^2θ + sin^2θ = 1
sin^2θ = 1 - cos^2θ
sinθ = sqrt(1 - cos^2θ)
sinθ = sqrt(1 - a · b ^ 2)
sinθ를 구할 수 있습니다.


위에 그림에서
-d 와 n의 각도를 θ1 이라고 하고 
-n과 t의 각도를 θ2라고 가정하겠습니다.

물리학자들이 계산한 결과 
sinθ1 / sinθ2 는 일정하다는 것을 알아냈습니다.

η = sinθ1 / sinθ2 = 1.5 -> (공기 -> 유리표면)
η = sinθ1 / sinθ2 = 1 / 1.5 (유리 -> 공기)
η = sinθ1 / sinθ2 = 1.3 -> (공기 - >물)

η 는 공기, 물, 유리 등 상황에 따라 숫자가 
1.3, 1.5, 1 / 1.5 로 알 수 있는 숫자입니다.

-d는 Ray의 방향 n은 노말벡터로 가정하겠습니다.
일단 -d와 n를 내적해서 θ1을 알 수 있습니다.
cosθ1 = -n · d
sinθ1 = sqrt(1 - cos^2θ1) = sqrt(1 - (-n · d) ^ 2)

그럼 sinθ1를 구했으니 sinθ2를 구할 수 있습니다.
sinθ2 = sinθ1 / η
cosθ2 = sqrt(1 - sin^2θ2)

t = -ncosθ2 + msinθ2

이렇게 t의 방향을 계산하고
굴절 광선을 t 방향으로 쏴주면 굴절을 구할 수 있습니다.