Unity中Shader观察空间推导


前言

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

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


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

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

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

Pview = [Wview] * Pworld

[Wview] = [Vworld]-1 = [Vworld]T

Pview = [Vworld]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 的叉积

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


三、求 [Vworld]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、求[Vworld]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 = [Vworld]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} 100001000010T 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

  • 最后,公式化简为:
    在这里插入图片描述

相关推荐

  1. UnityShader语义的理解

    2023-12-24 15:44:02       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-24 15:44:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-24 15:44:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-24 15:44:02       87 阅读
  4. Python语言-面向对象

    2023-12-24 15:44:02       96 阅读

热门阅读

  1. 用Python实现乒乓球游戏

    2023-12-24 15:44:02       56 阅读
  2. vivado I/O延迟约束

    2023-12-24 15:44:02       60 阅读
  3. android 13.0 Launcher3定制folder文件夹16宫格实现二

    2023-12-24 15:44:02       52 阅读
  4. R语言使用scitb包10分钟快速绘制论文基线表

    2023-12-24 15:44:02       72 阅读
  5. linux 文件概念

    2023-12-24 15:44:02       40 阅读
  6. 面积最大的蛋糕

    2023-12-24 15:44:02       58 阅读
  7. 软件工程-第二章 计算机系统工程

    2023-12-24 15:44:02       53 阅读
  8. 【Python爬虫】第四课 动态爬取数据

    2023-12-24 15:44:02       55 阅读
  9. 排序算法——基数排序

    2023-12-24 15:44:02       61 阅读
  10. C++学习——STL

    2023-12-24 15:44:02       62 阅读
  11. 60 贪心算法解优势洗牌-田忌赛马问题

    2023-12-24 15:44:02       60 阅读