Unity中Shader观察空间推导

文章目录


前言

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

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


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

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

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

Pview = W~view~ * Pworld

W~view~ = V~world~-1 = V~world~T

Pview = V~world~T * Pworld

  • Pview顶点在观察空间下的坐标
  • Pworld顶点在世界空间下的坐标
  • Wview世界空间的基向量 在 观察空间下的矩阵
  • Vworld观察空间的基向量 在 世界空间下的矩阵

二、怎么得到观察空间的基向量

  • 我们的观察空间使用的是右手坐标系

1、Z轴向量

  • Z轴正方向是从 模型顶点 指向 摄像机 方向
  • Z = ViewPos - ViewTarget

    现在只知道 Z轴,还需要求 X Y轴。

2、假设 观察空间的 Y假设 = (0,1,0)

  • X = Y 与 Z 的叉积
  • Y = X 与 Z 的叉积

3、X = Y 与 Z 的叉积

4、Y = X 与 Z 的叉积


最后,得到的就是 视图空间坐标轴方向上的向量,归一化后即可作为基向量使用


三、求 V~world~T

1、求Vworld

  • 把基向量一列一列的写来排列得到 Vworld

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中使用的公式

  • Pview = V~world~T * Pworld

1、偏移坐标轴

在之前的步骤中,我们只完成坐标系的旋转转化。
但是,我们的 观察空间 和 世界空间 的原点不在同一地方。
所以,需要进行平移变换

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

  • 则我们的公式会变成如下样子:

3、化简我们的矩阵

  • 这两个矩阵相乘,最后的一列的结果,可以化简为:

− ( 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

  • 最后,公式化简为:
相关推荐
寂寞的船2 小时前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无1 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气2 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船3 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
Martina_03214 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船5 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船6 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船6 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水6 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船6 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器