问题描述
已知入射向量v1和法向量n(OB),求反射向量v2,上述向量均为单位向量。
问题解决
- v2 = v1 + 2n’
由v1在n上的投影可得 - |n’| = -v1 * n / |n|
- n’ = -(v1 * n) / |n| * (n / |n|)
- n’ = -(v1 * n) * n / (|n| * |n|)
由于n是单位向量 - n’ = -(v1 * n) * n
最后得出 - v2 = v1 - 2 * (v1 * n) * n
代码实现
/// <summary>
/// 求入射方向的反射方向(入射方向和方向量都要求是单位向量)
/// </summary>
/// <param name="v1">入射方向</param>
/// <param name="n">法向量</param>
/// <returns>反射方向</returns>
public static Vector3 GetReflectedDir(Vector3 v1, Vector3 n)
{
return v1 - 2 * Vector3.Dot(v1, n) * n;
}
效果演示
红色线为入射方向,绿色线为法向量,蓝色线为反射方向