굴절벡터가 무엇일까?

박승우·2024년 6월 4일

자 마흔 번째 키워드인 '굴절벡터'를 알아 볼 것이다.

이 키워드는 이전 키워드와 같이 게임수학 키워드로 같이 알아보았다.

굴절벡터가 뭐에요


굴절벡터는 빛이나 다른 파동이 한 매질에서 다른 매질로 진행할 때, 경계면에서 굴절된 후의 진행 방향을 나타내는 벡터라고 한다.
빛이 매질을 통과할 때 경로가 변하는 현상을 굴절이라고 하며, 이는 파동의 속도가 두 매질에서 다르기 때문에 발생한다.

공식 설명

굴절 법칙은 스넬의 법칙(Snell's Law)으로 설명된다고 한다.
스넬의 법칙에 따르면, 두 매질 사이의 경계면에서 굴절각과 입사각의 관계는 다음과 같다.

𝑛1sin⁡𝜃1 = 𝑛2sin⁡𝜃2

  • 여기서, 𝑛1 과 𝑛2는 각각 첫 번째와 두 번째 매질의 굴절률이다.
  • 𝜃1 은 입사각 (입사 빛의 경로와 경계면의 수직선 사이의 각도)이다.
  • 𝜃2 는 굴절각 (굴절된 빛의 경로와 경계면의 수직선 사이의 각도)이다.
  • 굴절벡터는 입사벡터와 법선벡터를 사용하여 구할 수 있다.
  • 굴절벡터 𝑇는 다음과 같은 과정을 통해 계산된다.

계산 과정

  1. 입사벡터 𝐼와 법선벡터 𝑁을 사용하여 입사각 𝜃1을 계산한다.

  2. 스넬의 법칙을 적용하여 굴절각 𝜃2를 계산한다.

  3. 굴절각을 이용하여 굴절벡터 𝑇를 구한다.

  4. 이를 벡터 형식으로 표현하면 다음과 같다.

𝑇 = 𝑛1/𝑛2𝐼 + (𝑛1/𝑛2cos𝜃1 − cos⁡𝜃2)𝑁

실제 코드 적용

using UnityEngine;

public class RefractionCalculator : MonoBehaviour
{
    public float refractiveIndex1 = 1.0f; // 첫 번째 매질의 굴절률
    public float refractiveIndex2 = 1.5f; // 두 번째 매질의 굴절률

    public Vector3 incidentVector; // 입사 벡터
    public Vector3 normalVector; // 법선 벡터

    void Start()
    {
        // 입사 벡터와 법선 벡터를 정규화
        incidentVector.Normalize();
        normalVector.Normalize();

        // 굴절 벡터 계산
        Vector3 refractedVector = CalculateRefractedVector(incidentVector, normalVector, refractiveIndex1, refractiveIndex2);

        // 굴절 벡터 출력
        Debug.Log("Refracted Vector: " + refractedVector);
    }

    Vector3 CalculateRefractedVector(Vector3 incident, Vector3 normal, float n1, float n2)
    {
        float n = n1 / n2;
        float cosI = -Vector3.Dot(normal, incident);
        float sinT2 = n * n * (1.0f - cosI * cosI);
        
        // 전반사 확인
        if (sinT2 > 1.0f)
        {
            // 전반사 발생, 굴절 벡터를 계산할 수 없음
            return Vector3.zero;
        }

        float cosT = Mathf.Sqrt(1.0f - sinT2);
        Vector3 refracted = n * incident + (n * cosI - cosT) * normal;
        return refracted;
    }
}

이 코드는 유니티에서 적용할 수 있는 코드 이다. 위 수식을 토대로 적용해보았다.

incidentVector : 입사 벡터
normalVector : 경계면의 법선 벡터
refractiveIndex1 : 첫 번째 매질의 굴절률
refractiveIndex2 : 두 번째 매질의 굴절률

코드 설명

  • incidentVector와 normalVector는 Normalize 메서드를 통해 정규화
  • CalculateRefractedVector 함수는 스넬의 법칙을 사용하여 굴절 벡터를 계산
  • 전반사를 확인하고, 전반사가 발생하는 경우 굴절 벡터를 Vector3.zero로 반환
  • 굴절 벡터를 Debug.Log를 통해 출력

결론 - 느낀 점

왜이리 어려울까요 선생님들,, 이 글을 보시면 정말 몇시간을 공부한게 이정도입니다..

profile
게임을 좋아하는 사람 입니다!

0개의 댓글