根据折射定律,入射角θ1,出射角θ2满足如下关系。n1sinθ1 = n2sinθ2
n1 是介质1的折射率,n2是介质2的折射率。
假设介质1是空气,所以n1=1
如同如下Unity程序可以预览效果
public class RayLineRefaract : MonoBehaviour
{
public Transform A;
public Transform B;
void Start()
{
}
void Update()
{
Vector2 a = A.position;
Vector2 b = B.position;
Vector2 p1;
// 入射向量 b-a 法线 (0,1) 折射率 1.5
bool can = myrefract(b - a, new Vector2(0, 1), 1.5f, out p1);
#if UNITY_EDITOR
if (can)
Debug.DrawLine(a, b, Color.red); // 存在折射光线时红色
else
Debug.DrawLine(a, b, Color.green); // 全反射时为绿色
Debug.DrawLine(b, b+p1, Color.white); //显示出射光线
#endif
}
bool myrefract(Vector2 v, Vector2 n, float nt, out Vector2 refracted)
{
Vector2 uv = v.normalized;
float dt = Vector2.Dot(uv, n);
float d = 1.0f - nt * nt * (1 - dt * dt);
if (d > 0)
{
refracted = nt * (uv - n * dt) - n * Mathf.Sqrt(d);
return true;
}
else
{
refracted = Vector2.zero;
return false;
}
}
}