자 마흔 번째 키워드인 '굴절벡터'를 알아 볼 것이다.
이 키워드는 이전 키워드와 같이 게임수학 키워드로 같이 알아보았다.

굴절벡터는 빛이나 다른 파동이 한 매질에서 다른 매질로 진행할 때, 경계면에서 굴절된 후의 진행 방향을 나타내는 벡터라고 한다.
빛이 매질을 통과할 때 경로가 변하는 현상을 굴절이라고 하며, 이는 파동의 속도가 두 매질에서 다르기 때문에 발생한다.
굴절 법칙은 스넬의 법칙(Snell's Law)으로 설명된다고 한다.
스넬의 법칙에 따르면, 두 매질 사이의 경계면에서 굴절각과 입사각의 관계는 다음과 같다.
𝑛1sin𝜃1 = 𝑛2sin𝜃2
입사벡터 𝐼와 법선벡터 𝑁을 사용하여 입사각 𝜃1을 계산한다.
스넬의 법칙을 적용하여 굴절각 𝜃2를 계산한다.
굴절각을 이용하여 굴절벡터 𝑇를 구한다.
이를 벡터 형식으로 표현하면 다음과 같다.
𝑇 = 𝑛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 : 두 번째 매질의 굴절률
코드 설명
왜이리 어려울까요 선생님들,, 이 글을 보시면 정말 몇시간을 공부한게 이정도입니다..