Unity中Shader观察空间推导

文章目录


前言

在上一篇文章中,我们推演了矩阵几何计算。

在这篇文章中,我们来推导一下 观察空间(摄像机空间)。


一、本地空间怎么转化到观察空间

可以根据上篇文章的推导得出:

  • 在两个不同角度坐标系下的坐标信息转化可以由如下公式算出。

Pview = [Wview] * Pworld

W~view~\] = \[V~world~\]^-1^ = \[V~world~\]^T^ P~view~ = \[V~world~\]^T^ \* P~world~ * P~view~顶点在观察空间下的坐标 * P~world~顶点在世界空间下的坐标 * W~view~世界空间的基向量 在 观察空间下的矩阵 * V~world~观察空间的基向量 在 世界空间下的矩阵 *** ** * ** *** ## 二、怎么得到观察空间的基向量 * 我们的观察空间使用的是右手坐标系 ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/6f3ee3c5642fd49515e3c0c5a1c63f9e.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/a0aa77f35e063c00db00e2c339974f99.webp) ### 1、Z轴向量 * Z轴正方向是从 模型顶点 指向 摄像机 方向 * Z = ViewPos - ViewTarget ![请添加图片描述](https://file.jishuzhan.net/article/1738926294348861442/b3f67f34201c7feb108568ab21f3d223.webp) `现在只知道 Z轴,还需要求 X Y轴。` ### 2、假设 观察空间的 Y~假设~ = (0,1,0) * X = Y 与 Z 的叉积 * Y = X 与 Z 的叉积 ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/4d03d52a598f8afa51a150d38125e1d4.webp) ### 3、X = Y 与 Z 的叉积 ![请添加图片描述](https://file.jishuzhan.net/article/1738926294348861442/7c589fb95c13c6402cef2edeae0ef242.webp) ### 4、Y = X 与 Z 的叉积 ![请添加图片描述](https://file.jishuzhan.net/article/1738926294348861442/3cc3b0a72fb199dfeea9d444abfe22f6.webp) `最后,得到的就是 视图空间坐标轴方向上的向量,归一化后即可作为基向量使用` *** ** * ** *** ## 三、求 \[V~world~\]^T^ ### 1、求V~world~ * 把基向量一列一列的写来排列得到 V~world~ V w o r l d X x V w o r l d Y x V w o r l d Z x V w o r l d X y V w o r l d Y y V w o r l d Z y V w o r l d X z V w o r l d Y z V w o r l d Z z \\begin{matrix} V\~worldXx\~\&V\~worldYx\~\&V\~worldZx\~\\\\ V\~worldXy\~\&V\~worldYy\~\&V\~worldZy\~\\\\ V\~worldXz\~\&V\~worldYz\~\&V\~worldZz\~\\\\ \\end{matrix} V worldXx V worldXy V worldXz V worldYx V worldYy V worldYz V worldZx V worldZy V worldZz ### 2、求\[V~world~\]^T^ `这里原本是求逆矩阵,但是基向量矩阵是正交矩阵,所以逆矩阵 = 转置矩阵` V w o r l d X x V w o r l d X y V w o r l d X z V w o r l d Y x V w o r l d Y y V w o r l d Y z V w o r l d Z x V w o r l d Z y V w o r l d Z z \\begin{matrix} V\~worldXx\~\&V\~worldXy\~\&V\~worldXz\~\\\\ V\~worldYx\~\&V\~worldYy\~\&V\~worldYz\~\\\\ V\~worldZx\~\&V\~worldZy\~\&V\~worldZz\~\\\\ \\end{matrix} V worldXx V worldYx V worldZx V worldXy V worldYy V worldZy V worldXz V worldYz V worldZz *** ** * ** *** ## 四、求出最后在Unity中使用的公式 * P~view~ = \[V~world~\]^T^ \* P~world~ ### 1、偏移坐标轴 `在之前的步骤中,我们只完成坐标系的旋转转化。` `但是,我们的 观察空间 和 世界空间 的原点不在同一地方。` `所以,需要进行平移变换` ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/8fcaef50abea3069ddd74e95a2644609.webp) ### 2、把 平移的坐标 构建成之前文章中使用的 平移矩阵 1 0 0 − T x 0 1 0 − T y 0 0 1 − T z 0 0 0 1 \\begin{matrix} 1\&0\&0\&-T\~x\~\\\\ 0\&1\&0\&-T\~y\~\\\\ 0\&0\&1\&-T\~z\~\\\\ 0\&0\&0\&1\\\\ \\end{matrix} 100001000010−T x −T y −T z 1 * 则我们的公式会变成如下样子: ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/7031e7d79db63586fbdc044d2b19f5ea.webp) ### 3、化简我们的矩阵 ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/1e15bf07d22e94511a4ac3b4676810a2.webp) * 这两个矩阵相乘,最后的一列的结果,可以化简为: − ( V w o r l d X d o t T ) − ( V w o r l d Y d o t T ) − ( V w o r l d Z d o t T ) 1 \\begin{matrix} -(V\~worldX\~ dot T) \\\\ -(V\~worldY\~ dot T) \\\\ -(V\~worldZ\~ dot T) \\\\ 1\\\\ \\end{matrix} −(V worldX dotT)−(V worldY dotT)−(V worldZ dotT)1 * 最后,公式化简为: ![在这里插入图片描述](https://file.jishuzhan.net/article/1738926294348861442/12689fbaf0cfae55929fc6c6eea24b83.webp)

相关推荐
牙膏上的小苏打233315 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海17 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss1 天前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮1 天前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge1 天前
【Unity网络编程知识】FTP学习
网络·unity
神码编程1 天前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay1 天前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_242 天前
【工具】Json在线解析工具
unity·json
ZKY_242 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎