zoukankan      html  css  js  c++  java
  • Unity Shader入门精要读书笔记(三)Shader必须的数学基础

    Xyz三维坐标系如下:左手坐标系

     

    但是摄像机观察空间则是采用右手系:

     

    右手法则判断叉乘的结果的方向;

    正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性;

    列矩阵运算CBAv和行矩阵的运算vATBTCT一致;

    平移变换不是一个线性变换;

    仿射变换合并了线性变换和平移变换,在齐次坐标空间中进行;

    纯平移、纯旋转和纯放缩的变换称为基础变换,那么一个齐次坐标矩阵如下:

     

    其中M表示缩放和旋转,t表示平移,0表示0,1表示1

    为什么呢?

     

    从C空间变到P空间的矩阵:

    其中Oc是选取的原点,xcyczcC下的P的基矢量(不一定要是单位的);
    对于矢量从C空间变到P空间中,则只需要:

     

    如果是正交矩阵的话,可以轻易地得到反推的矩阵(读取行即可);

    [正交矩阵] 利用试探法写MA->B,已知B空间的基矢量是xbybzb(用A来描述),那么xb(用A系来描述Bx基矢量)经过AB的转换后,得到的应该是100

     

    模型变换:从模型空间到世界空间;

    先缩放、后旋转、后平移;

    摄像机的放置:缩放(不缩放)、旋转(镜头的旋转)、平移(镜头的平移),即摄像机有一个transform;由于观察空间是一个右手系,所以对z进行取反,即和[1000; 0100 ;00-10 ; 0001]相乘,得到观察变换矩阵,也就是以镜头位置为原点,以镜头指向为坐标轴(其中镜头后方为+z)的坐标系;

    齐次裁剪空间,这个空间的变换矩阵称为裁剪矩阵或者投影矩阵;

     

    利用三角形关系和FOV可以知道近裁平面和远裁平面的高度

     

     

     

    Aspect是宽高比,那么从观察空间(摄像机做原点)到裁剪空间为:

     

    经过裁剪变换后,所有不满足xyz限定在±w内的片元都被丢弃;

     

    正交投影的裁剪变换如下:

     

     

    所有不满足xyz在±1以内的,都被裁剪;

    透视除法:就是用w分量去除以xyz分量(限定在了-11的立方体内)

     

    正交投影的齐次除法就是除以1

     

    在Unity中屏幕空间左上角是原点,右下角是pixelWpixelH,那么就有最后一个从齐次除法后到屏幕映射:

     

    其中clipx是裁剪空间中的xclipw是裁剪空间中的w

     

    为了将法向量从A空间变换到B空间,直接和Mab相乘是不对的。变换到B切线方向记为TbNb记为变换到B的法线方向,那么满足点积为零的约束:(我们希望求得G表示法线从AB的变换矩阵)

    如果Mab是正交矩阵(即旋转),那么直接和Mab相乘是正确的,如果带有统一放缩k,那么

  • 相关阅读:
    codeforces 814B An express train to reveries
    codeforces 814A An abandoned sentiment from past
    codeforces 785D D. Anton and School
    codeforces 785C Anton and Fairy Tale
    codeforces 791C Bear and Different Names
    AOP详解
    Spring集成JUnit测试
    Spring整合web开发
    IOC装配Bean(注解方式)
    IOC装配Bean(XML方式)
  • 原文地址:https://www.cnblogs.com/JackSamuel/p/7272084.html
Copyright © 2011-2022 走看看