【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
本文作者:endlesstravel
本文链接:https://www.cnblogs.com/night-ride-depart/p/7429618.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~