法线也被成为法矢量,在上面我们已经看到如何使用变换矩阵来变换一个顶点或一个方向矢量,但法线是需要我们特殊处理的一种方向矢量。
在游戏中,模型的一个顶点往往会携带额外的信息,而顶点法线就是其中一种信息。当我们变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理(如片元着色器)中计算光照等。

一般来说,点和绝大部分方向矢量都可以使用同一个3x3或者4x4的变换矩阵MA→B把其从坐标空间A变换到坐标空间B中。但在变换法线的时候,如果使用同一个变换矩阵,可能就无法确保维持法线的垂直性。我们分析一下出现这种问题的原因:

我们先来了解一下另一种方向矢量——切线,也被称为切矢量。与法线类似,切线往往也是模型顶点携带的信息。它通常与纹理空间对齐,且与法线方向垂直。

由于切线是由两个顶点的差值计算得到的,因此我们可以直接使用变换顶点的变换矩阵来变换切线。假设我们使用3x3的变换矩阵MA→B。可以由下面式子直接得到变换后的切线:
TB = MA→BTA
其中TATB分别表示在坐标空间A和坐标空间B下的切线方向。但如果直接使用MA→B来变换法线,得到新的法线方向可能就不会与表面垂直了:

设我们需要一个矩阵G来变换法线NA,通过推导 (过程忽略) 得出

如果,即使用原变换矩阵的逆转置矩阵来变换法线就可以得到正确的结果。

值得注意的是:
如果变换矩阵MA→B正交矩阵,那么我们可以使用变换顶点的变换矩阵来直接变换法线。(如果变换只包含旋转变换,那么这个变换矩阵就是正交矩阵)
如果变换只包含旋转和统一缩放,我们可以利用统一缩放的系数k来得到变换矩阵的逆转置矩阵。这样可以避免计算逆矩阵的过程。
如果变换中包含了非统一变换,那么我们就必须要求解逆矩阵来得到变换法线的矩阵。

3D数学——法线变换相关推荐

  1. 法线变换详解 和 3D 变换中法向量变换矩阵的推导

    两篇文章 法线变换详解(Normal Transform) 在图形学中,同样的一个模型视图变换矩阵可以用来变换点.线.多边形以及其它几何体,也可以变换多边形表面的切向量.比如: posEyeSpace ...

  2. Unity3D for VR 学习(6): 再次温故知新-3D数学

    一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...

  3. 3D数学读书笔记——矩阵基础番外篇之线性变换

    本系列文章由birdlove1987编写.转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25102425 前面有一篇文章 ...

  4. Unity 3D数学\图形学基础-游戏开发(向量)

    Unity 3D数学\图形学基础-游戏开发(向量) 向量运算的几何意义 标量与向量的计算 向量的模长 标准化向量 normalize 0向量 向量与向量的加减法 两点间距离公式(向量间距离) 点积,点 ...

  5. 3D数学-裁剪空间与透视投影矩阵的推导

    3D数学-裁剪空间与透视投影矩阵的推导 透视投影矩阵的变换本质,是将视锥体变换到裁剪空间中 视锥体的具有六个面,近裁剪面,远裁剪面,左裁剪面,右裁剪面,上裁剪面,下裁剪面 所有超出视锥体的都会被舍弃, ...

  6. 高斯旋转热源与双椭球热源_【干货】论焊接,3D打印模拟的热源模型——焊缝、3D打印高度变换模拟...

    原标题:[干货]论焊接,3D打印模拟的热源模型--焊缝.3D打印高度变换模拟 焊接.3D打印是难度相对较高的数值模拟过程,在模拟温度场及应力场过程中,至关重要的是如何进行热源函数的建立和加载,同时配以 ...

  7. 3D数学系列之——从“蒙的挺准”到“蒙的真准”解密蒙特卡洛积分!

    目录 1.前言 2.积分概念简单回顾 3.积分在程序计算上的困难 4.蒙特卡洛积分 5.一些扩展应用 1.前言   在学习3D数学的过程中,或者说在学习游戏开发.引擎开发.渲染器开发.Shader开发 ...

  8. 3D点云变换(平移、旋转、缩放)C++实现

    在前一篇文章3D点云变换(平移.旋转.缩放)以及python实现中详细介绍了点云的一些基础变换原理,也用python做了实现,这次我们用C++来做点云的平移.缩放.旋转变换. #include < ...

  9. 3D数学读书笔记——笛卡尔坐标系统

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学 ...

最新文章

  1. hexo博客更新主题后上传Git操作
  2. python中xrange函数_python中xrange和range的区别
  3. latex下的表格处理
  4. 使用牛刀云开发微信小程序(问题集锦)
  5. 战略支援部队信息工程大学的计算机类,中国顶尖的两大“信息工程”高校翻新,南信大、军信大要崛起?...
  6. 用计算机打出圣诞树,手机计算器圣诞树的祝福输入方式,手机计算器圣诞树获得方法...
  7. SpringBoot入门 (一) HelloWorld
  8. php代码时间控制,PHP 网页过期时间的控制代码
  9. 多标签分类_多标签分类文献阅读(8)
  10. TorchSeg—基于PyTorch的快速模块化语义分割开源库
  11. 开启Cisco交换机DHCP Snooping功能
  12. 三七互娱李逸飞:未来将关注元宇宙等新业态 创新构建核心优势
  13. 只让类访问, 而不让类的实例来访问某个成员变量
  14. 女生学UI合适吗?橙色优学告诉你女生UI设计优势
  15. 【机器学习7】决策树
  16. 深圳市威视爱普手术示教系统
  17. 紫光联合大基金等成立长江存储 注资189亿元
  18. natapp 配置微信小程序开发需要的网络环境
  19. 生成token和验证token机制
  20. 科普一下IP路由基础

热门文章

  1. 银行智能风险防控系统(第二版)
  2. ZoteroCNKI抓取不到学位论文的解决办法
  3. 具有对称性的信道的信道容量计算方法
  4. 协作通信-af df的matlab仿真,协作通信三种协作方式(AF+DF+CC)的matlab仿真程序
  5. MIC(最大信息系数)
  6. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?
  7. 实现财务自由的重要工具
  8. 3d虚拟VR实训教学软件制作
  9. 名编辑电子杂志大师教程 | 如何直接输出安卓apk格式?
  10. 什么是matlab的幅值域,基于LabVIEW的虚拟频谱分析仪