【3D数学基础】三维空间折射向量计算
问题:在三维空间中,已知折射率 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
【3D数学基础】三维空间折射向量计算的更多相关文章
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 3D数学基础 KeyNote 1
[计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...
- 3D数学基础(一)Unity坐标系
Unity引擎时非常成熟的,引擎内部运用了很多的数学知识,他对开发者来说是不可见的,而且他已经封装好的算法也不是很全面.此外,要是使用引擎封装好的算法也要明白其实现的原理. 写过一些代码,也参考了一些 ...
- 折射向量计算(Refraction Vector Calculation)
上个月学习Peter Shirley-Ray Tracing in One Weekend的系列三本书,收获真的很多.这个系列的书真的是手把手教你如何从零开始构建一个光线跟踪渲染器,对新手(像我)非常 ...
- 3D数学基础_图形与游戏开发
https://blog.csdn.net/popy007/article/list/2?t=1& //向量计算相关文章 https://www.baidu.com/link?url=48C ...
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- 3D数学基础:3D游戏动画中欧拉角与万向锁的理解
首先来看一下什么是欧拉角(Euler angles)?构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角.章动角和自旋角,这三个转角统称为欧拉角.——引自百度百科莱昂哈德·欧拉用欧拉角来描 ...
- 3D数学基础(四)四元数和欧拉角
一.四元数 四元数本质上是个高阶复数,可视为复数的扩展,表达式为y=a+bi+cj+dk.在说矩阵旋转的时候提到了它,当然四元数在Unity里面主要作用也在于此.在Unity编辑器中的Transfor ...
- 3D数学基础(三)矩阵
3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...
随机推荐
- string.trim().length()的用法
public class Test{ public static void main(String args[]){ String data = " a bc "; //调用str ...
- linux中日志介绍
linux日志 linux日志大多是以明文存储,一般存储在/var/log目录中,linux系统中主要有三个日志子系统:连接时间日志,进程统计日志,错误日志. 连接时间日志 连接时间日志是有多个程序执 ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
- H5微信通过百度地图API实现导航方式一
根据业务需求修改百度API,实现微信中的导航功能.因为源码中SearchInfoWindow_min.js有点小问题(部分小城市公交线路少,查不到路线时没有提示),所以这里在源码的基础上改了一点点.可 ...
- vue错误和解决方法
1.Error in render function: "TypeError: Cannot read property 'matched' of undefined 原因:之前不知道,在引 ...
- git中使用命令将远程仓库拉取项目在本地文件夹
在有些时候,我们往往从github或者gitlab或者coding上面直接下载项目下来运行,但是这种情况往往没有使用git远程拉取来的安全(或者叫装逼), 所以这里我以gitLab为例子,说一下如何将 ...
- This Adroid SDK r…
有时候开启eclipse时会出现如下提示框: This Adroid SDK requires Android Developer
- mybatis example使用 and和or联合查询(转)
这两天项目用到ibatis,碰到and or的联合查询,语句像这样的 select * from table where xxx = "xxx" and (xx1="xx ...
- 带着SMART原则重新出发
很久以来,对分布式系统都比较感兴趣,但工作中却接触不到,“虽不能至,心向往之”,于是打算自己学.分布式系统领域概念很多,错综复杂,一些理论也比较难以理解,要想学习的话还是得下一番功夫.于是在来两个月前 ...
- 使用Visual Studio Code调试基于ActionScript的LayaAir HTML5游戏
使用Visual Studio Code(VS Code)调试的优势 使用VS Code我们可以极大地提高LayaAir Html5游戏项目的调试效率,VS Code的优势有以下几点: 在发生Java ...