Unity Shader学习三:坐标空间的变换
(注意,由于格式问题,文中如p-c、c-p、c、p这类的为矢量的下标,-1、T为矩阵的上标)
假设现在有一个父坐标空间以及一个子坐标空间,已知父级坐标空间中子级坐标空间的原点位置以及3个单位坐标轴,此时一般由两种需求:一种是将子坐标空间下表示的点或矢量Ac转换到父坐标空间下的表示Ap;另一种需求是反过来,即把父坐标空间下表示的点或矢量Bp转换到子坐标空间下的表示Bc。可以使用下面的两个公式来表示这两种需求:
Ap = Mc-p Ac
Bc = Mp-c Bp
其中Mc-p表示从子坐标空间变换到父坐标空间的变换矩阵,而Mp-c是其逆矩阵(即反向变换)。此时,只需求解出其中一个矩阵,另一个通过求逆矩阵的方法来得到。
当给定一个坐标空间以及其中的一点(a, b, c)时,可以通过4个步骤来确定它的位置:
1.从坐标轴的原点开始;
2.向x轴方向移动a个单位;
3.向y轴方向移动b个单位;
4.向z轴方向移动c个单位。
此时已知子坐标空间C的3个坐标轴在父坐标空间P下的表示Xc,Yc,Zc,以及其原点位置Oc。当给定一个子坐标空间中的一个点Ac = (a,b,c),使用上述的4步来确定点Ac在父坐标空间下的位置Ap:
1.从坐标空间的原点开始:
已知子坐标空间的原点位置Oc;
2.向x轴方向移动a个单位
Oc + aXc
3.向y轴方向移动b个单位
Oc + aXc + bYc
4.向z轴方向移动c个单位
Oc + aXc + bYc + cZc
此时得到公式:
Ap = Oc + aXc + bYc + cZc (将所有矢量展开)
其中“|”符号表示按列展开,最后还可以加上加法表达式即平移变换,此时需要将上面公式中的3x3矩阵扩展到齐次坐标空间中,得到
此时,可得Mc-p 矩阵为
一旦求出Mc-p矩阵后,Mp-c矩阵可以通过求逆矩阵的方法得到。
由矩阵结果可以看出,变换矩阵Mc-p实际上可以通过坐标空间C在坐标空间P中的原点和坐标轴的矢量表示来构建的:把3个坐标轴一次放入矩阵的前3列,把原点矢量放到最后一列,再用0和1填充最后一行即可。
需要注意的是,并不需要要求3个坐标轴Xc,Yc,Zc是单位矢量,实际上如果存在缩放的话,这3个矢量很可能不是单位矢量。
使用反向思维,可以从这个变换矩阵反推来获得子坐标空间的原点与坐标轴方向。例如,已知从模型空间到世界空间的一个4x4的变换矩阵,可以提取它的第一列再进行归一化后(为了消除缩放的影响)来得到模型空间的x轴再世界空间下的单位矢量表示。同样的方法可以提取y轴和z轴。
从另一个角度来理解这个提取过程,因为矩阵Mc-p可以把一个方向矢量从坐标空间C变换到坐标空间P中,那么只需要用这个矩阵来变换坐标空间C的x轴(1,0,0,0),即使用矩阵乘法 Mc-p[1,0,0,0]T,得到的结果正是Mc-p矩阵的第一列。
由于对方向矢量进行的坐标空间变换是可以忽略位置变换(平移)的,所以对方向矢量的坐标空间变换可以使用3x3矩阵,即
Mc-p =
再Shader中,常常截取变换矩阵的前3行与前3列来对法线方向、光照方向进行空间变换。
前面提过Mc-p表示从子坐标空间变换到父坐标空间的变换矩阵,而Mp-c是其逆矩阵(即反向变换由父坐标空间变换到子坐标空间),但是当Mc-p为正交矩阵时,矩阵的逆矩阵等于它的转置矩阵,即Mc-p-1 = Mc-pT,所以
此时,不仅可以通过变换矩阵Mc-p反推出子坐标空间的坐标轴方向再父坐标空间中的表示Xc,Yc,Zc,还可以反推出父坐标空间的坐标轴方向再子坐标空间中的表示Xp,Yp,Zp,这些坐标轴对应的就是变换矩阵Mc-p的每一行。
也就是说,若坐标空间变换矩阵Ma-b是一个正交矩阵,那么就可以提取其第一列来得到坐标空间a的x轴在坐标空间b下的表示,还可以提取其第一行来得到坐标空间b的x轴在坐标空间a下的表示。反过来,如果知道坐标空间b的x,y,z轴(必须是单位矢量,否则构建出来的就不是正交矩阵了)在坐标空间a下的表示,就可以将它们依次放在矩阵的每一行来得到坐标空间a到坐标空间b的变换矩阵了。
Unity Shader学习三:坐标空间的变换相关推荐
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅
本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- Unity Shader学习:素描效果
Unity Shader学习:素描效果 这是乐乐大佬书里的非真实渲染,其中的算法还是挺有意思的,感兴趣的小伙伴可以试一试. 素描效果基本原理:先将物体进行描边画出轮廓,计算物体的漫反射部分,漫反射越暗 ...
- Unity Shader学习:动态雾
Unity Shader学习:动态雾 先将相机近裁面四个角向量传给shader,再通过观察空间下的深度值和相机位置算出像素在世界坐标系的位置,通过世界空间高度值来设定雾的范围和浓度,然后通过噪声和uv ...
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
- Unity Shader学习:SSAO屏幕环境光遮蔽
Unity Shader学习:SSAO屏幕环境光遮蔽 主要思路:1.随机采样像素法线半球周围的像素,平均对比与该像素深度是否处在暗处.2.双边滤波去噪点.3.后期AO图与原图混合. 原文链接:http ...
- Unity Shader学习:动态模糊(shutter angle方式)
Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...
- Unity Shader学习:水墨效果
Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...
最新文章
- 面包好吃却五毒俱全,吃前请三思!
- Python脱产8期 Day09 2019/4/23
- 远程连接CentOS的MySQL报错:Can't connect to MySQL server on 'XXX' (13)
- python 什么是先验概率?
- 好的软件人员必看的书
- 车顶维权女子被行拘五日!“特斯拉不可能妥协”,高管硬气回应却被狂批......
- 就数据平台建设,80%的500强企业都有一个共性
- Java项目导入eclipse后项目出现JRE System Library [JavaSE-1.8](unbound)
- 兄弟打印机内存已满清零方法_打印机是如何清零的?兄弟打印机清零方法
- 财务内部收益率用计算机怎么算,使用EXCEL计算财务内部收益率
- 外联式 vue+element ui 表格导出e'xcel
- 路由器的两种工作模式
- 2019UNCTF-竞技赛 部分WP
- 《网格交易法数学+传统智慧战胜华尔街》内容介绍及PDF下载
- 小鼠心肌细胞培养方法
- 四大主流浏览器内核(Trident、Gecko、Presto、Webkit)
- base64转图片的两种方式
- Windows Server 2022 安装Intel I219V 服务器网卡
- floyed 算法计算最短路径
- 【2023美国大学生数学建模(美赛)资料及思路】
热门文章
- 智慧教室系统服务器参数,台湾智慧教室整体解决方案_服务器产业-中关村在线...
- 【问题与方法】联想拯救者双系统重启卡死机解决方案
- 小县城,大市场,县城悄然出现的创业项目。
- 人生哲学-经典68个故事
- javascript俄罗斯方块 面向对象编程(jQuery)(附带百度网盘链接)
- 【Spark报错】CDH的spark无法读取字段中含有特殊字符“-“的orc表mismatched input ‘-‘ expecting ‘:‘
- HashMap为啥初始化大小是16
- linux设置网卡速度,linux系统下网卡通信速率修改方法
- python 读取csv文件绘图
- 【Java SE】第三话·数据类型与变量