当前位置: 首页 > ds >正文

齐次坐标变换+Unity矩阵变换

矩阵变换

        变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。

        变换类型

                线性变换:保留矢量加和标量乘的计算

                        f(x)+f(y)=f(x+y)

                        kf(x)=f(kx)

                        包含:旋转,缩放,镜像,投影

                        可以使用3x3矩阵,表示

                非线性变换

                        包含:平移

                        可以使用4x4矩阵,表示

                仿射变换:仿射变换就是合并线性变换与平移变换的变换类型,仿射变换可以

                使用一个4x4的矩阵表示,所以需要将矢量扩展到四维空间下,这就是齐次坐标

                空间,变换矩阵称为齐次矩阵

               齐次坐标:\begin{bmatrix} x\\ y\\ z\\ w \end{bmatrix}

                        点的列矩阵w分量:补1,因为点受到平移变化的影响

                        方向矢量列矩阵的w分量:补0,因为平移不会影响到方向向量的方向

               齐次矩阵构成

                         \begin{bmatrix} M_{3*3} &T_{3*1} \\ 0_{1*3}& 1 \end{bmatrix}

                        M_{3*3}:表示线性变换矩阵

                        T_{3*1}:表示平移变换矩阵

                平移矩阵

                        \begin{bmatrix} 1 & 0 & 0 &x \\ 0& 1& 0 & y\\ 0& 0& 1&z \\ 0& 0& 0 & 1 \end{bmatrix}        ( x,y,z分别代表x平移量,y平移量,z平移量)

                缩放矩阵(缩放是线性变换,所以可以用M_{33}表示这个变换的过程)

                        \begin{bmatrix} X_{s} & 0 &0 &0 \\ 0& Y_{s} & 0 &0 \\ 0& 0 & Z_{s} &0 \\ 0 & 0 & 0& 1 \end{bmatrix}

                旋转矩阵

                        绕X轴,旋转\theta角度

                                \begin{bmatrix} 1 & 0& 0 &0 \\ 0& cos\theta &-sin\theta &0 \\ 0 & sin\theta & cos\theta &0 \\ 0 & 0 & 0& 1 \end{bmatrix}

                        绕Y轴,旋转\theta角度

                                \begin{bmatrix} cos\theta & 0& sin\theta &0 \\ 0& 1 &0 &0 \\ -sin\theta & 0 & cos\theta &0 \\ 0 & 0 & 0& 1 \end{bmatrix}

                        绕Z轴,旋转\theta角度

                                \begin{bmatrix} cos\theta & -sin\theta& 0 &0 \\ sin\theta& cos\theta &0 &0 \\ 0 & 0 & 1 &0 \\ 0 & 0 & 0& 1 \end{bmatrix}

      复合变换

             一个点P(1,1,1),需要做绕z轴旋转30度,平移(5,4,2),

             缩放(3,2,1)复合变换,是存在顺序的,因为矩阵乘运算,不满足乘法交换律

                        \begin{bmatrix} 3 & 0 & 0&0 \\ 0& 2&0 & 0\\ 0& 0& 1 &0 \\ 0& 0 & 0 & 1 \end{bmatrix} x \begin{bmatrix} 1 & 0 &0 &5 \\ 0& 1&0 & 4\\ 0& 0& 1& 2\\ 0 &0 & 0 & 1 \end{bmatrix} x \begin{bmatrix} cos30 &-sin30 &0 &0 \\ sin30& cos30 & 0 &0 \\ 0& 0 &1 &0 \\ 0& 0 &0 & 1 \end{bmatrix} x \begin{bmatrix} 1\\ 1\\ 1\\ 1 \end{bmatrix} = \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}

            复合变换的顺序,决定了变换矩阵相乘的顺序,根据需求        

                        M_{s} x M_{m} x M_{r} x P

            因为矩阵满足结合律,所以可以得出变换矩阵为(M_{s} x M_{m} x M_{r}

            最后的结果是:(M_{s} x M_{m} x M_{r})x P

坐标空间

        模型空间:模型内部点的位置都存储在模型文件内,所以点都是相对于模型空间的

        世界空间:模型在游戏运行时,需要加载到场景中,所以点存储在世界空间中

        观察(摄像机)空间:物体是否被投射到屏幕中,是由相机控制的,相机相对于物体

                的位置,决定了显示效果。

        裁剪空间:需要判定点,是否存在于摄像机裁剪视锥体下,如果存在于视锥体内,则

                点可以进行显示。

        屏幕空间:最终显示的设备为显示器,所以需要将点投影到显示器上,算出屏幕坐标

                点,由显示器显示

Unity着色器中常见矩阵

        UNITY_MATRIX_MVP:将点从模型空间下,转换到裁剪空间下

        UNITY_MATRIX_M:将点从模型空间下,转换到世界空间下

        UNITY_MATRIX_V:将点从世界空间下,转换到观察空间下

        UNITY_MATRIX_P:将点从观察空间下,转换到裁剪空间下

        UNITY_MATRIX_MV:将点从模型空间下,转换到观察空间下

        UNITY_MATRIX_VP:将点从世界空间下,转换到裁剪空间下

        

        _Object2World:将点从模型到世界空间转换(互为逆矩阵)

        _World2Object:将点从世界空间到模型转换(互为逆矩阵)

                        

                        

           该系列专栏为网课课程笔记,仅用于学习参考。                  

http://www.xdnf.cn/news/458.html

相关文章:

  • 【Tauri2】026——Tauri+Webassembly
  • 代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南
  • vue3 watch和watchEffect 的用法和区别
  • 计算机视觉算法实现——智能座椅坐姿识别
  • 基于GRPO将QWEN训练为和deepseek一样的推理模型!
  • linux kernel irq相关函数详解
  • 国产的 Java Solon v3.2.0 发布(央企信创的优选)
  • Day10【基于encoder- decoder架构实现新闻文本摘要的提取】
  • 第3章 垃圾收集器与内存分配策略《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
  • 从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题
  • Flask应用部署通用指南
  • [Windows] Wireshark 网络抓包工具 v4.4.6
  • 【MATLAB海洋专题】历史汇总
  • C++学习之路,从0到精通的征途:vector类的模拟实现
  • 算法期末复习
  • 基于Fabric.js的选座布局系统开发笔记
  • 如何系统地入门学习stm32?
  • Linux419 三次握手四次挥手抓包 wireshark
  • python程序的流程
  • 移动自动化测试-appium
  • thanos rule组件和prometheus区别?
  • 5G基站设计难题:尺寸、重量、功耗和散热
  • HashMap 初步理解 put 操作流程 HashMap 的线程安全问题
  • 精益数据分析(5/126):解锁创业成功的关键密码
  • FPGA练习———DDS波形发生器
  • 一个项目中多个Composer的使用方法
  • 读文献方法
  • Linux系统之diff3命令详解
  • Nodejs数据库单一连接模式和连接池模式的概述及写法
  • 2024-04-19| Java: Documented注解学习 JavaDoc