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

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

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

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

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

因为 N、T、L都是单位向量,所以:

那么可以从图中看出:

接着,如图中所示,做出辅助向量 t1 、t2、l1、l2,他们满足于:

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

接着有:

可得

那么:

而 l1 和 t1 是同向的,所以可以直接去掉绝对值:

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

那么:

那么:

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

那么现在可以写出答案了:

整理一下:

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

可以发现 cg 函数中的 refract 的 i 对应于我们的 L,n 对应于我们的 N , eta 分量是对应于的我们这里的 1 / e。

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

而对于 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

最新文章

  1. oracle打补丁
  2. Linux下搭建个人网站
  3. oracle[insert 时报错: 单行子查询返回多行]
  4. java中&ldquo;/0&rdquo;含义
  5. sql索引的填充因子多少最好,填充因子的作用?
  6. hibernate的Criteria条件查询
  7. PostgreSQL中使用枚举类型
  8. DevExpress中,添加Winform窗体到DockPanel z
  9. linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏
  10. install OwnCloud9 on CentOS7
  11. ensp实战之防火墙安全转发策略
  12. GitBash学习1
  13. js内置函数大全及基本使用方法(一)
  14. 接口测试返回的json文件中字符串是乱序
  15. BGP:所有邻居都启动了BGP,则无须建立首尾逻辑邻居,否则就需要首尾建立逻辑邻居。
  16. 非旋 treap 结构体数组版(无指针)详解,有图有真相
  17. python3列表(list)
  18. 【SoftwareTesting】Homework3
  19. Pycharm 在Windows下出现闪退问题(即是在运行一段时间后,自己就退出崩掉了)的解决方法
  20. 【转】[Network] 计算机网络基础知识总结

热门文章

  1. Postmessage运用-往飞信添加信息
  2. request.setcharacterencoding()和request.setcontenttype
  3. 初学angular
  4. PHP+NGINX
  5. If I were you
  6. FreeRTOS源代码的编程标准与命名约定
  7. eclipse maven构建
  8. 整理的 matplotlib 绘图笔记
  9. Objective-C MapKit的使用-LBS简单的租车主界面demo
  10. 【HTML】html5新属性-datalist