反射公式

反射是经常用到的一个公式,之前在Phong光照的时候推导过一次,这次再整理一下。反射过程如图所示:

首先需要保证光方向向量AB,法向量N均为单位向量,反射向量AC,光入射方向AD = -AB

θ为入射角,由反射公式我们知道,AC与AB沿y轴对称,AD与AC沿x轴对称

EB = N * |AB|cosθ = N * dot(N,AB)

DC = 2 * EB = -2 * N * dot(N, AB)

AC = AD + DC = -AB + 2 * N * dot(N,AB)

C++代码如下:

 static Vector3 Reflect(const Vector3& vec, const Vector3& normal){return -vec + normal * 2.0f * Vector3::Dot(vec, normal);}

这里面使用的是vec是指向光源方向的Vec(似乎在shader里面使用这种表示方法更多一些),如果vec指的是由光源方向指向入射点的位置(光线追踪使用得更多一些),则反射公式表示为:

 static Vector3 Reflect(const Vector3& vec, const Vector3& normal){return vec - normal * 2.0f * Vector3::Dot(vec, normal);}

折射公式

最近在玩光线追踪,遇到了一个折射光线的代码,看了半天没太理解,后来拿出笔推算了一遍,才算是理解了原来折射公式还是比较复杂的。下面记录一下推导的过程,先来一张图:

其中入射光线L,折射光线T,入射角θ,折射角θ',法线方向N,入射向量分解为L1,L2,折射向量分解为T1,T2。

首先需要的知识点是折射定律(似乎是中学时学过的):

(1)折射光线位于入射光线和界面法线所决定的平面内;

(2)折射线和入射线分别在法线的两侧;

(3)入射角i的正弦和折射角i′的正弦的比值,对折射率一定的两种媒质来说是一个常数。

假设上方介质为1,下方介质为2,则n1 * sinθ1 = n2 * sinθ2,n21 = n2 / n1,表示介质2相对于介质1的折射率。

换成上图公式则为,sinθ' / sinθ  =  n1 / n2 = η。

cosθ = dot(N, -V) = -dot(N,V)。

cosθ' ^2 = 1 - sinθ' ^ 2 = 1 - η * η * sinθ ^2 = 1 - η * η * (1 - cosθ ^ 2)

cosθ' = sqrt(1 - η * η * (1 - dot(N,V) ^ 2))

上图中,将入射光线和出射光线分别拆分成垂直于x轴和垂直于y轴的两条方向上的光线。

T = T1 + T2,L = L1 + L2,T和L以及N均为单位向量|T| = |L|

L = L1 + L2,L = -Ncosθ + L2  => L2 = L + Ncosθ

|T2| = |T|sinθ',|L2| = |L|sinθ,二者相除,且由于|T| = |L|,得到 T2 = L2 * sinθ’ / sinθ = (L + Ncosθ)η

T1与N反方向,故T1 = -N * |T1| = -N * |T|cosθ',由于|T|为单位向量,即 T1 = -N * cosθ'

T = T1 + T2 => T = -N cosθ' + (L + Ncosθ)η

T = -N * sqrt(1 - η * η * (1 - dot(N,V) ^ 2)) + (L - N * dot(N,V)) η

C++代码如下:

 //refractRatio = sinθ' / sinθ static bool Refract(const Vector3& vec, const Vector3& normal, float refractRatio, Vector3& refractDir){Vector3 inVec = vec;inVec.Normalize();float dt = Vector3::Dot(inVec, normal); //cosθfloat s2 = 1.0 - dt * dt; // sinθ ^ 2float st2 = refractRatio * refractRatio * s2;// sinθ’ ^ 2 = refractRato ^ 2 * sinθ ^ 2float cost2 = 1 - st2;if (cost2 > 0){refractDir = (inVec - normal * dt) * refractRatio - normal * sqrt(cost2);return true;}return false;}

图形学相关数学(反射,折射公式)相关推荐

  1. (图形学相关数学知识)-2.对基本概念的理解(一)

    总览 总结一些在图形学中经常用到的线性代数基本概念. 主要涉及: 标量, 向量, 位置, 方向, 坐标, 矩阵, 线性变换, 线性相关, 平移, 旋转, 缩放, 仿射变换, 齐次坐标等. 标量(数字) ...

  2. php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...

    34个小学数学重难点公式 1.和差倍问题 2.年龄问题的三个基本特征 ①两个人的年龄差是不变的: ②两个人的年龄是同时增加或者同时减少的: ③两个人的年龄的倍数是发生变化的: 3.归一问题的基本特点 ...

  3. 转载 --史上最全数学符号、公式的英文读法,干货满满!

    在学习数学符号读法时,搜到这篇文章,非常全面,也很风趣,忍不住转载过来,若有不妥, 请联系我. [收藏]史上最全数学符号.公式的英文读法,干货满满! 2018-01-04 11:00 英语 说起英语和 ...

  4. 与计算机图形学相关的研究论文,计算机图形学相关论文范文数据库,与计算机图形学的相关技术与相关专科毕业论文范文...

    计算机图形学相关论文范文数据库,与计算机图形学的相关技术与相关专科毕业论文范文 关于计算机图形学及计算机及计算机动画方面的免费优秀学术论文范文,计算机图形学相关本科毕业论文,关于计算机图形学的相关技术 ...

  5. 线性回归之数学:求导公式

    线性回归之数学:求导公式 1 常见函数的导数 2 导数的四则运算 3 练习 4 矩阵(向量)求导 参考链接:https://en.wikipedia.org/wiki/Matrix_calculus# ...

  6. mysql日期加一天的公式_2020国考行测冲刺指导:数学运算常用公式大盘点

    2020国考行测冲刺指导:数学运算常用公式大盘点 (2020国家公务员考试尚未开始,参考2019国考) 1.奇偶性 加减规律:同奇同偶则为偶,一奇一偶则为奇. 偶数 +奇数=奇数 奇数+奇数=偶数 偶 ...

  7. 利用公式画图_【高中数学】重要公式大汇总!

    公式口诀 一.集合与函数 内容子交并补集,还有幂指对函数. 性质奇偶与增减,观察图象最明显. 复合函数式出现,性质乘法法则辨, 若要详细证明它,还须将那定义抓. 指数与对数函数,两者互为反函数. 底数 ...

  8. 常用傅里叶变换公式大全_高二数学常用导数公式大全

    在学习数学的时候公式是一定要牢牢记住的,下面为大家带来了高二数学常用导数公式大全,一起来回顾一下吧! 导数(Derivative)是微积分中的重要基础概念.当函数y=f(x)的自变量X在一点x0上产生 ...

  9. 【复习必备】高中数学必修四公式汇总, 精华版赶快收藏

    本文作者:vxbomath 今天,我为大家带来了高中数学必修四公式汇总,你们掌握了吗?还没有掌握的记得要收藏哦! 1.高中数学--三角函数 2.高中数学--平面向量 3.高中数学--三角恒等变换 好了 ...

最新文章

  1. 物联网网关市场预计到2026年将增长21.5亿美元
  2. mysql之mysqldump备份恢复
  3. CISCO ACL的匹配数问题
  4. C和C++的关键字区别
  5. 《SpringBoot实战》笔记2
  6. DNS在什么情况下才能动态更新|活动目录集成的dns区域
  7. paip.java 架构师之路以及java高级技术
  8. 计算机科学技术编程基础教程
  9. Unity 工具 之 XChart UGUI 表格工具,轻松简单的帮你实现需要的数据图表形式,建议 Mark 一下
  10. 2019深圳杯数学建模比赛--初步思路
  11. 【论文阅读】Speicher: Securing LSM-based Key-Value Stores using Shielded Execution
  12. macOS如何修改Hosts文件
  13. win8计算机无法安装打印机驱动程序,win8系统安装打印机驱动失败怎么办|win8系统安装打印机驱动失败的解决方法...
  14. 为什么不同文化中都会发现圆形房屋
  15. vs添加监视快捷键_询问操作方法:监视Android移动设备使用情况,Windows键盘快捷键和修复损坏的照片...
  16. 网络聊天室(Java)
  17. spring boot的启动与配置
  18. linux上nagios安装完整版
  19. 邻菲罗啉二酰胺功能化/吡啶基改性纤维状介孔二氧化硅微球的应用
  20. 刘慈欣,王晋康,何夕著《星际远征》

热门文章

  1. 运维网关系列4:Qin Admin
  2. Java项目:JSP的电影院售票系统(含论文、任务书、中期检查表)
  3. 如何选购你自己的蓝牙适配器
  4. UE4虚幻引擎,编辑器基础应用,使用技巧(一)
  5. 2021年上海插班生考试招生简章
  6. vscode中git无法提交,提示设置用户名和邮箱
  7. 第十八篇,Simulink with Git
  8. Mac 动态壁纸软件
  9. Vj程序设计作业H7
  10. Rope:理论与实践