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)

相关推荐
爱吃小胖橘1 天前
Unity网络开发--超文本传输协议Http(1)
开发语言·网络·网络协议·http·c#·游戏引擎
BrightMZM1 天前
记录一下Unity的BUG,Trial Version
unity·bug·打包·trial
▍ 小太阳 ☼1 天前
Unity2022Navigation系统打开方式
unity·游戏引擎
qq_170264751 天前
unity升级对ab变更的影响
unity·游戏引擎
AA陈超1 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-04 使用效果应用游戏标签
c++·游戏·ue5·游戏引擎·虚幻
不伤欣1 天前
Unity Mask镂空效果(常用于新手引导或高亮显示UI元素)
游戏·ui·unity·游戏引擎
zhangzhangkeji2 天前
cesium126,230217,Pixel Streaming in Unreal Engine 像素流 - 1 基本概念:
游戏引擎·虚幻
AA陈超3 天前
虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
c++·游戏·ue5·游戏引擎·虚幻
软泡芙3 天前
【Unity】HybridCLR:原生C#热更新革命
unity·游戏引擎
AA陈超3 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-05 游戏效果委托
c++·游戏·ue5·游戏引擎·虚幻