【3D数学基础】三维空间折射向量计算

问题:在三维空间中,已知折射率 e 、入射角 L 和法线 N。html

要求:计算出折射向量 T。函数

其中 L、 N 和 T 都为单位向量。spa

如图片所示,下面全部的公式都看着这张图片来求解的:3d

image

首先,咱们必须了解折射定律:htm

image

由于 N、T、L都是单位向量,因此:blog

image

那么能够从图中看出:图片

image

接着,如图中所示,作出辅助向量 t1 、t二、l一、l2,他们知足于:get

image

注意这里的 l2 、 t2 都是平行于 N 且反向的。l1 、 t1 都是垂直于 N 的。it

接着有:pdf

image

可得

image

那么:

image

而 l1 和 t1 是同向的,因此能够直接去掉绝对值:

image

另外,还有:(再强调一次,这里的 l2 、 t2 都是平行于 N 且反向的。l1 、 t1 都是垂直于 N 的。)

image

那么:

image

那么:

image

还须要求解 t2 ,又是利用 N 与 t2 方向相反且 N 为单位向量的条件:

image

那么如今能够写出答案了:

image

整理一下:

image

为何要这样写呢?这是由于,我是按照 Nvidia 公司的 CG 手册给出的公式来整理的:

image

能够发现 cg 函数中的 refract 的 i 对应于咱们的 L,n 对应于咱们的 N , eta 份量是对应于的咱们这里的 1 / e。

为了对应于 cg 函数,咱们这里用 w 代替  1/e,写出新的公式:

image

而对于 cg 函数中最后一句 return 语句的写法,是用来处理全反射现象的。

简而言之,cosθ2 <= 0 的时候就发生了全反射现象。

 

其余解释能够看下面的黑体字,来自http://www.cnblogs.com/starfallen/archive/2012/11/05/2754992.html 我稍微作了调整:

因为在不一样的状况下 e 的值是不一样的,再配合上入射角θ1取值,彻底可让1-(1/e²)(1-cos²θ1)的值小于0,这样上面等式中的cosθ2岂不是就无心义了?

而事实上,这正是全反射现象。当光线从光密介质进入光疏介质的时候,若是入射角大于某个临界角时,会发生全反射现象。这个临界角就是是折射角为90度时对应的入射角,也就是cosθ2恰好等于0的时候。

 

参考资料:

1. http://www.cnblogs.com/starfallen/archive/2012/11/05/2754992.html

2. cg-3.1 参考手册 《Cg-3.1_April2012_ReferenceManual》,747 页,

http://developer.download.nvidia.com/cg/Cg_3.1/Cg-3.1_April2012_ReferenceManual.pdf