unity3D数学基础-坐标系、向量、矩阵


坐标系

左右手坐标系

  1. 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
  2. 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
    请添加图片描述请添加图片描述请添加图片描述

3D笛卡尔坐标系:右手坐标系
OpenGL:右手坐标系
Direct3D:左手坐标系
Unity3D:左手坐标系(世界坐标系),即+x, +y, +z分别指向右方,上方和前方。​​​​

各种坐标空间(坐标系)

部分空间种类

  1. 模型空间
  • unity约定:使用的左手坐标系,XYZ分别对应着右上前。
  • 模型空间的原点和坐标轴通常由美术人员在建模软件里确定好的。当导入到unity中,我们可以在顶点着色器中访问到模型的顶点信息,其中包含了每个顶点的坐标,这些坐标都是相对于模型空间中的原点(通常位于模型的重心)定义的。
  • 检视视图中显示的为localPosition的值。
  • transform.localPosition(本地坐标)可以获得物体在父物体的局部坐标系中的位置点。
  1. 世界空间
  • unity约定:使用左手坐标系,但它的XYZ轴是固定不变的。
  • transform.position来获取游戏对象的世界坐标。
  1. 观察空间
  • 右手坐标系,这是符合OpenGL传统的,再这样的观察空间中,摄像机的正前方向指的是-z轴方向。
  • unity约定:摄像机位于原点,+x轴指向右方,+y轴指向上分,而+z轴指向的是摄像机的后方。
  1. 裁切空间
  • 目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。
  • 这块空间是由视椎体来决定。
  1. 屏幕空间
  • 左手坐标系
  • 以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值。
  • 屏幕空间是一个二维空间。
  • 鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。
  • 手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕时手指的坐标。
  1. 视口空间
  • 将Game视图的屏幕坐标系单位化
  • 左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。

相互空间转换

  1. shader中空间转换
    shader处理流程
  • 模型变换:顶点变换的第一步就是将顶点从模型空间变换到世界空间中。这个变换通常叫做模型变换。注意这里的变换顺序是不能互换的,即先进行缩放,然后进行旋转,最后是平移,然后我们可以构建出模型变换的变换矩阵(因为矩阵不满足交换律,所以不要随便调换变换顺序)
  • 观察变换:顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中,这个变换通常叫做观察变换。一种方法是计算观察空间中的三个坐标轴在世界空间下的表示,然后构建出观察空间变换到世界空间的变换矩阵,再对该矩阵求逆得到从世界空间变换到观察空间的变换矩阵。另一种方法是想象平移整个观察空间,让摄像机原点位于世界坐标的原点,坐标轴与世界空间中的坐标轴重合即可
  • 投影变换:顶点变换的第三步,就是将顶点坐标从观察空间变换到裁切空间(也被称为齐次裁剪空间)中,这个变换通常叫做投影变换,这个用于变换的矩阵叫做裁剪矩阵,也被称为投影矩阵。
    • 目的:首先是为投影做准备,真正的投影发生在后面的齐次除法过程中,而经过投影矩阵变换后,顶点的w分量将会有特殊的意义;其次是对x,y,z分量进行缩放。
    • 视椎体指的是空间中的一块区域,这块区域决定了摄像机可以看到的空间。视椎体由两种类型,这涉及两种投影:一种是正交投影,一种是透视投影。
    • 投影:可以理解成一个空间的降维,例如从四维空间投影到三维空间,而投影矩阵实际上并不会真正的进行投影,它会为真正的投影做准备工作。真正的投影会在屏幕映射时发生,通过齐次除法来得到二维坐标。
  • 屏幕映射:就是把顶点从裁剪空间投影到屏幕空间中,来生成对应的2D坐标。在unity中,从裁剪空间到屏幕空间的转换一般是底层帮我们完成的,我们顶点着色器只需要把顶点转换到裁剪空间即可。最后由此通过齐次除法和映射到屏幕。——分为两个步骤:首先进行标准齐次除法,也被称为透视除法。就是用齐次坐标系的w分量去除以x,y,z分量;经过齐次除法后,透视投影和正交投影的视椎体都变换到一个相同的立方体内。接下来可以根据 变换后的x和y坐标来映射输出窗口的对应像素坐标。
  1. unity中C#相关API
  • Transform.forward, Transform.right, Transform.up:当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向。
  • Transform.TransformPoint(Vector3 position) :将一个坐标点从局部坐标系转换到全局坐标系。
  • Transform.InverseTransformPoint(Vector3 position):将坐标点从全局坐标系转换到局部坐标系。
  • Transform.TransformDirection(Vector3 direction):将一个方向从局部坐标系转换到全局坐标系。
  • Transform.InverseTransformDirection(Vector3 direction):将一个方向从全局坐标系转换到局部坐标系。
  • Transform.TransformVector(Vector3 vector):将一个向量从局部坐标系转换到全局坐标系。
  • Transform.InverseTransformVector(Vector3 vector):将一个向量从全局坐标系转换到局部坐标系。
  • Camera.ScreenToWorldPoint(Vector3 position): 将屏幕坐标转换为全局坐标。
  • Camera.WorldToScreenPoint(Vector3 position):将全局坐标转换为屏幕坐标。
  • Camera.ScreenToViewportPoint(Vector3 position):将屏幕坐标转换为视口坐标。
  • Camera.ViewportToScreenPoint(Vector3 position):将视口坐标转换为屏幕坐标。
  • Camera.WorldToViewportPoint(Vector3 position):将全局坐标转换为视口坐标。
  • Camera.ViewportToWorldPoint(Vector3 position):将视口坐标转换为全局坐标。

向量

认识向量

  • 在数学中,向量(也称为矢量),是指具有大小和方向的量;书写向量时,水平书写的向量叫做行向量
    [ 1 2 3 ] \begin{bmatrix} 1 & 2 & 3 \end{bmatrix} [123]
    垂直书写的向量叫做列向量。
    [ 1 2 3 ] \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} 123
  • 向量的大小就是向量的长度,也叫做模。向量的方向描述了空间中向量的指向;向量中的数表达了向量在每个维度上的有向位移。
  • 点中的数表示了一个位置,它没有大小、方向的概念;点只有位置,适量只有方向和大小,任何一个点都可以表示成一个从原点出发的矢量。

向量运算

特殊向量

  1. 零向量:大小为0,没有方向的向量,并且它不可以被归一化。
  2. 负向量:向量变负,将得到一个和原向量方向相反、大小相等的向量。
  3. 单位向量:也叫做标准化向量,就是大小为1的向量;对任意的非零向量,我们都可以计算出它的单位向量,即将其归一化(normalization)。单位向量的表示
    a ^ = a ∣ a ∣ \widehat{\bf{a}} =\frac{\bf{a}}{\begin{vmatrix} \bf{a} \end{vmatrix}} a =aa
  4. 在Unity中,可以使用Vector3.Normalize来归一化向量。使用Vector3.normalized来获得归一化后的单位向量;Vector3.Normalize改变当前向量,Vector3.normalized当前向量是不改变的并且返回一个新的规范化的向量。

向量的长度

  1. 即向量的大小,或者向量的模。
  2. 向量的大小就是向量各分量平方和的平方根
  3. 在Unity中,可以通过Vector3.magnitude计算向量的长度。Vector3.sqrMagnitude则返回向量长度的平方;Vector3.Distance(A,B)可以计算2个点A,B之间的距离,即返回向量AB或向量BA的长度。

向量与标量的乘/除法

  1. 向量与标量的乘法,即将向量的每个分量分别与标量相乘。
  2. 向量与非零标量的除法,即乘以该标量的倒数。

向量的加/减法

  1. 只有在两个向量的维度相同时,才可以相加或相减。
  2. 向量的加法和减法,即将向量的各个分量相加或相减。
  3. 向量的加法满足交换律和结合律,向量的减法仅满足结合律。
  4. 几何意义:对于加法,我们可以把矢量a的头连接到矢量b的尾,然后画一条从a的尾到b的头的矢量,来得到a和b相加后的矢量。减法类似
  5. 公式: a ⃗ + b ⃗ = ( a x + b x , a y + b y , a z + b z ) a ⃗ − b ⃗ = ( a x − b x , a y − b y , a z − b z ) \vec{a} + \vec{b}=(a_x+b_x,a_y+b_y,a_z+b_z) \\ \vec{a} - \vec{b}=(a_x-b_x,a_y-b_y,a_z-b_z) a +b =(ax+bx,ay+by,az+bz)a b =(axbx,ayby,azbz)

向量的点积

  1. 也叫做向量的内积。表示如下:其中点不可以省略
    a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a b
  2. 两种计算公式如下:
    a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ θ a ⃗ ⋅ b ⃗ = ( a x b x + a y b y + a z b z ) \vec{a} \cdot \vec{b}=\rvert \vec{a} \rvert \rvert \vec{b} \rvert \cos \theta \\ \vec{a} \cdot \vec{b}=(a_xb_x+a_yb_y+a_zb_z) a b =a b cosθa b =(axbx+ayby+azbz)
  3. 点积满足交换律。
  4. 向量点积的结果是一个标量
  5. 几何意义:
    • 点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近
    • 投影:向量b在向量a上的投影的长度可以表示为
      ∣ b ⃗ → a ⃗ ∣ = ∣ b ⃗ ∣ cos ⁡ θ = a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ \begin{vmatrix} \vec{b} \to \vec{a} \end{vmatrix}=\begin{vmatrix} \vec{b} \end{vmatrix} \cos \theta=\frac{\vec{a} \cdot \vec{b}}{\begin{vmatrix} \vec{a} \end{vmatrix}} b a =b cosθ=a a b
  6. 重要性质:
    • 点积可结合标量乘法
      ( k a ⃗ ) ⋅ b ⃗ = a ⃗ ⋅ ( k b ⃗ ) = k ( a ⃗ ⋅ b ⃗ ) (k \vec{a}) \cdot \vec{b} = \vec{a} \cdot (k \vec{b})=k ( \vec{a} \cdot \vec{b}) (ka )b =a (kb )=k(a b )
    • 点积可结合矢量加减法
      a ⃗ ⋅ ( b ⃗ + c ⃗ ) = a ⃗ ⋅ b ⃗ + a ⃗ ⋅ c ⃗ \vec{a} \cdot ( \vec{b}+\vec{c}) = \vec{a} \cdot \vec{b}+\vec{a} \cdot \vec{c} a (b +c )=a b +a c
    • 一个矢量和本身进行点积的结果是该矢量的模的平方

向量的叉积

  1. 也叫做向量的外积。表示如下:其中叉不可以省略
    a ⃗ × b ⃗ \vec{a} \times \vec{b} a ×b
  2. 计算公式如下:
    [ x 1 y 1 z 1 ] × [ x 2 y 2 z 2 ] = [ y 1 z 2 − z 1 y 2 z 1 x 2 − x 1 z 2 x 1 y 2 − y 1 x 2 ] \begin{bmatrix} x_{1}\\ y_{1}\\ z_{1} \end{bmatrix}\times\begin{bmatrix} x_{2}\\ y_{2}\\ z_{2} \end{bmatrix} =\begin{bmatrix} y_{1}z_{2}-z_{1}y_{2}\\ z_{1}x_{2}-x_{1}z_{2}\\ x_{1}y_{2}-y_{1}x_{2} \end{bmatrix} x1y1z1×x2y2z2=y1z2z1y2z1x2x1z2x1y2y1x2
  3. 三重积: a ⃗ ⋅ b ⃗ × c ⃗ = a ⃗ ⋅ ( b ⃗ × c ⃗ ) \vec{a} \cdot \vec{b} \times \vec{c}=\vec{a} \cdot (\vec{b} \times \vec{c}) a b ×c =a (b ×c )
  4. 点积不满足交换律,也不满足结合律。
  5. 向量叉积的结果仍是一个向量
  6. 几何意义:
    • 叉乘得到的向量垂直于原来的两个向量
    • 叉乘的长度等于向量的大小与向量夹角sin值的积
      ∣ a ⃗ × b ⃗ ∣ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin ⁡ θ \begin{vmatrix} \vec{a} \times \vec{b} \end{vmatrix} = \begin{vmatrix} \vec{a} \end{vmatrix} \begin{vmatrix} \vec{b} \end{vmatrix} \sin \theta a ×b =a b sinθ
    • 叉乘的长度也等于以ab为两边的平行四边形的面积

矩阵

认识矩阵

  • 在数学中,矩阵是一个按照长方阵排列的复数或实数的集合。
  • 在一个m×n的矩阵A中,有m×n个数,这些数称为矩阵A的元素。数 aij 位于矩阵的第i行,第j列,称为矩阵A的(i,j)元素。
  • 矩阵中元素的下标是从1开始的。
    [ a 11 a 12 a 13 ⋯ a 1 j a 21 a 22 a 23 ⋯ a 2 j ⋮ ⋮ ⋮ ⋱ ⋮ a i 1 a i 2 a i 3 ⋯ a i j ] \begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1j} \\ a_{21} & a_{22} & a_{23} & \cdots & a_{2j} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{i1} & a_{i2} & a_{i3} & \cdots &a_{ij} \\ \end{bmatrix} a11a21ai1a12a22ai2a13a23ai3a1ja2jaij

矩阵和标量的乘法

  • 矩阵和标量相乘,得到的仍然是一个相同维度的矩阵。矩阵和标量的乘法,即矩阵的每个元素和该标量相乘

矩阵和矩阵的加/减法

  • 只有维度相同的矩阵,才可以相加相减
  • 矩阵和矩阵的相加/相减即矩阵各相同位置的元素的相加相减

矩阵和矩阵的乘法

  • 公式:一个r×n的矩阵A和一个n×c的矩阵B相乘,它们的结果AB将会是一个r×c大小的矩阵。这里第一个矩阵的列数必须和第二个矩阵的行数相同,他们相乘得到的矩阵的行数是第一个矩阵的行数,列数是第二个矩阵的列数。
  • 演示:请添加图片描述
  • 矩阵乘法不满足交换律,但是满足结合律及以下关系: A B ≠ B A ( A B ) C = A ( B C ) A B = B T A \mathbf{AB}\neq \mathbf{BA} \\ \left ( \mathbf{AB} \right )\mathbf{C}= \mathbf{A}\left ( \mathbf{BC} \right ) \\ \mathbf{AB}= \mathbf{B^{T}A} AB=BA(AB)C=A(BC)AB=BTA
  • 矩阵的几何意义
    1. 方阵的的行能被解释为坐标系的基向量;
    2. 为了将向量从原坐标系变换到新坐标系,用它乘以一个矩阵;
    3. 从原坐标系到这些基向量定义的新坐标系的变换是一种线性变换;线性变换保持直线和平行线,但角度、长度、面积和体积可能会被改变。
    4. 零向量乘以任何矩阵仍然得到零向量。因此,方阵代表的线性变换的原点和原坐标系的原点一致,变换不包含原点。
    5. 可以通过想象变换后的坐标系的基向量来想象矩阵,这些基向量在2D中构成“L”型,在3D中构成“三角架”型。

如何理解矩阵相乘的几何意义或现实意义?

  • 向量和矩阵相乘:行向量左乘矩阵时,结果是行向量;列向量右乘矩阵时,结果是列向量,其他相乘顺序是不允许的。

特殊矩阵

方阵

  • 行数和列数相等的矩阵被称为方块矩阵

对角矩阵

  • 对角线元素:方阵中行号和列号相同的元素,其他元素为非对角线元素
  • 如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵

单位矩阵

  • 对角线元素为1,其他元素为0。(乘法单位元)

转置矩阵

  • 一个r×c矩阵M,M的转置记作 M T \bf M^T MT是一个c×r矩阵,它的列由M的行组成。即
    M i j T = M j i M_{ij}^{T}=M_{ji} MijT=Mji
  • 性质1:矩阵转置的转置等于原矩阵:
    ( M T ) T = M \left (\mathbf{M} ^{T}\right )^{T}=\mathbf{M} (MT)T=M
  • 性质2:矩阵串接的转置等于反向串接各个矩阵的转置:
    ( A B ) T = B T A T \left ( \mathbf{AB} \right )^{T}=\mathbf{B}^{T}\mathbf{A}^{T} (AB)T=BTAT

逆矩阵

  • 给定一个方阵M,它的逆矩阵表示:
    M − 1 \bf{M}^{-1} M1
  • 如果一个矩阵有相应的逆矩阵,则可以说这个矩阵是可逆的,或者说是非奇异的。如果一个矩阵没有相应的逆矩阵,则可以说这个矩阵是不可逆的,或者说是奇异的。
  • 性质1:只有方块矩阵才可能有逆矩阵,因为一个矩阵A和它的逆矩阵B需要满足条件:AB = I(I是单位矩阵)。
    M M − 1 = M − 1 M = I \mathbf{M}\mathbf{M}^{-1}=\mathbf{M}^{-1}\mathbf{M}=\mathbf{I} MM1=M1M=I
  • 性质2:逆矩阵的逆矩阵是原矩阵本身。
    ( M − 1 ) − 1 = M \left ( \mathbf{M}^{-1} \right )^{-1}=\mathbf{M} (M1)1=M
  • 性质3:单位矩阵的逆矩阵是它本身
    I − 1 = I \mathbf{I}^{-1}=\mathbf{I} I1=I
  • 性质4:转置矩阵的逆矩阵是逆矩阵的转置
    ( M T ) − 1 = ( M − 1 ) T \left ( \mathbf{M}^{T} \right )^{-1}=\left ( \mathbf{M}^{-1} \right )^{T} (MT)1=(M1)T
  • 性质5:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵(这个性质可以扩展到更多矩阵相乘)
    ( A B ) − 1 = B − 1 A − 1 \left ( \mathbf{AB} \right )^{-1}=\mathbf{B}^{-1}\mathbf{A}^{-1} (AB)1=B1A1
  • 对于所有元素都为0的矩阵,没有对应的逆矩阵。
  • ​矩阵的逆的几何解释:如果向量v用矩阵M来进行变换,接着用M的逆进行变换,将会得到原向量。

正交矩阵

  • 如果一个方阵M和它的转置矩阵的乘积是单位矩阵的话,我们就说这个矩阵是正交的: M M T = M T M = I \mathbf{M}\mathbf{M}^{T}=\mathbf{M}^{T}\mathbf{M}=\mathbf{I} MMT=MTM=I

  • 推理:如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的。

  • 几何意义:若一个矩阵是正交矩阵,它必须满足下列条件:

    1. 矩阵的每一行都是单位向量
    2. 矩阵的所有行互相垂直
  • 线性代数中一组向量互相垂直,这组向量被认为是正交基;如果他们同时满足都是单位向量,则称他们是标准正交基

矩阵的行列式

  • 定义
    • 在任意方阵中都存在一个标量,称作该方阵的行列式;非方阵的行列式是未定义的。
      在书写行列式时,两边用竖线将数字块围起来,省略方括号。
    • 2D:帮助记忆法:将主对角线和反对角线上的元素各自相乘,然后用主对角线元素的积减去反对角线元素的积。
      ∣ M ∣ = ∣ m 11 m 12 m 21 m 22 ∣ = m 11 m 22 − m 12 m 21 \left | M \right |=\begin{vmatrix} m_{11} &m_{12} \\ m_{21} & m_{22} \end{vmatrix}=m_{11}m_{22}-m_{12}m_{21} M=m11m21m12m22=m11m22m12m21
    • 3D:帮助记忆法:把矩阵M连写两遍,将主对角线上的元素和反对角线上的元素各自相乘,然后用主对角线上元素积的和减去反对角线上元素积的和。
      ∣ M ∣ = ∣ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ∣ = m 11 m 22 m 33 + m 12 m 23 m 31 + m 13 m 21 m 32 − m 13 m 22 m 31 − m 12 m 21 m 33 − m 11 m 23 m 32 = m 11 ( m 22 m 33 − m 23 m 32 ) + m 12 ( m 23 m 31 − m 21 m 33 ) + m 13 ( m 21 m 32 − m 22 m 31 ) \left | M \right |=\begin{vmatrix} m_{11} & m_{12} &m_{13} \\ m_{21} & m_{22} &m_{23} \\ m_{31} & m_{32} &m_{33} \end{vmatrix}=m_{11}m_{22}m_{33}+m_{12}m_{23}m_{31}+m_{13}m_{21}m_{32}-m_{13}m_{22}m_{31}-m_{12}m_{21}m_{33}-m_{11}m_{23}m_{32}=m_{11}(m_{22}m_{33}-m_{23}m_{32})+m_{12}(m_{23}m_{31}-m_{21}m_{33})+m_{13}(m_{21}m_{32}-m_{22}m_{31}) M=m11m21m31m12m22m32m13m23m33=m11m22m33+m12m23m31+m13m21m32m13m22m31m12m21m33m11m23m32=m11(m22m33m23m32)+m12(m23m31m21m33)+m13(m21m32m22m31)
    • 在这里插入图片描述
  • 行列式的一些性质:
    • 任意行或列的非零积加到另一行或列上不会改变行列式的值
    • 交换矩阵的任意两行或两列,行列式变负
    • 如果矩阵的任意行或列全为零,那么它的行列式等于零
    • 矩阵积的行列式等于矩阵行列式的积;这个性质可以扩展到多个矩阵情况.
      ∣ A B ∣ = ∣ A ∣ ∣ B ∣ \left | AB \right |=\left| A \right|\left| B \right| AB=AB
    • 矩阵转置的行列式等于原矩阵的行列式。
      ∣ M T ∣ = ∣ M ∣ \left | M^{T} \right |=\left | M \right | MT=M
  • 矩阵的行列式的几何意义:
    • 2D中,行列式等于以基向量为两边的平行四边形的有符号面积;(有符号面积是指如果平行四边形相对于远来的方位“翻转”,那么面积变负。)
    • 3D中,行列式等于以变换后的基向量为三边的平行六面体的有符号体积,3D中,如果变换使得平行六面体“由里向外”翻转,则行列式变负。
    • 行列式和矩阵变换导致的尺寸改变相关。其中行列式的绝对值和面积(2D),体积(3D)的改变相关。行列式的符号说明了变换矩阵是否包含镜像或投影。
    • 矩阵的行列式还可以对矩阵所代表的变换分类:如果矩阵行列式为零,那么该矩阵包含投影;如果矩阵行列式为负,那么该矩阵包含镜像。

变换

齐次坐标

齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。

线性变换

  • 定义:从代数上,是指可以保留矢量加和标量乘的变换。需要满足下面的2个条件。
    A ( α + β ) = A ( α ) + A ( β ) A ( k α ) = k A ( α ) A(α+β)=A(α)+A(β)\\[1ex] A (kα)=kA(α) A(α+β)=Aα+AβA(kα)=kA(α)
    从几何的角度上去理解,需要满足:
    1. 变换前是直线的,变换后依然是直线。
    2. 直线比例保持不变。
    3. 变换前是原点的,变换后依然是原点。
  • 旋转和缩放都属于线性变换
    1. 旋转
      2D旋转
      R ( θ ) = [ p ′ q ′ ] = [ c o s θ s i n θ − s i n θ c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'} \end{bmatrix}=\begin{bmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{bmatrix} R(θ)=[pq]=[cosθsinθsinθcosθ]
      3D旋转
      绕X轴
      R ( θ ) = [ p ′ q ′ r ′ ] = [ 1 0 0 0 c o s θ s i n θ 0 − s i n θ c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} 1&0&0 \\ 0&cos\theta&sin\theta \\ 0&-sin\theta&cos\theta \end{bmatrix} R(θ)=pqr=1000cosθsinθ0sinθcosθ
      绕Y轴
      R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ 0 − s i n θ 0 1 0 s i n θ 0 c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} cos\theta&0&-sin\theta \\ 0&1&0 \\ sin\theta&0&cos\theta \end{bmatrix} R(θ)=pqr=cosθ0sinθ010sinθ0cosθ
      绕Z轴
      R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} cos\theta&sin\theta&0 \\ -sin\theta&cos\theta&0 \\ 0&0&1 \end{bmatrix} R(θ)=pqr=cosθsinθ0sinθcosθ0001
      2.缩放(沿着每个坐标轴应用单独的缩放因子k)
      2D缩放
      S ( k x , k y ) = [ p ′ q ′ ] = [ k x 0 0 k y ] S(k_{x},k_{y})=\begin{bmatrix} p^{'} \\ q^{'} \end{bmatrix}=\begin{bmatrix} k_{x} & 0\\ 0 & k_{y} \end{bmatrix} S(kx,ky)=[pq]=[kx00ky]
      3D缩放
      S ( k x , k y , k y ) = [ p ′ q ′ r ′ ] = [ k x 0 0 0 k y 0 0 0 k z ] S(k_{x},k_{y},k_{y})=\begin{bmatrix} p^{'} \\ q^{'} \\ r^{'} \end{bmatrix}=\begin{bmatrix} k_{x}&0&0 \\ 0&k_{y}&0 \\ 0&0&k_{z} \end{bmatrix} S(kx,ky,ky)=pqr=kx000ky000kz

仿射变换

  • 定义:从几何的角度去理解,需要满足:
    1. 变换前是直线的,变换后依然是直线。
    2. 直线比例保持不变。
  • 推理:平移、旋转、缩放都属于仿射变换。
    1. 对点平移
      [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] = [ x + t x y + t y z + t z 1 ] \begin{bmatrix} 1 & 0 & 0 & t_{x}\\ 0 & 1 & 0 & t_{y}\\ 0 & 0 & 1 & t_{z}\\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}=\begin{bmatrix} x+t_{x}\\ y+t_{y}\\ z+t_{z}\\ 1 \end{bmatrix} 100001000010txtytz1xyz1=x+txy+tyz+tz1
    2. 性质
      1、平移变换不会对方向矢量产生任何影响。
      2、平移矩阵的逆矩阵就是反向平移得到的矩阵
    3. 复合变换
      由于上面我们使用的是列矩阵,因此阅读顺序是从右向左,即先缩放,在旋转,最后平移。顺序很重要。
      在这里插入图片描述
  • 透视投影
    1. 将3D空间投影到2D平面上,该平面称作投影平面,使用的是正交投影。正交投影也称作平行投影;透视投影的投影线不再是平行的,它们相交于一点,该点称作投影中心。因为投影中心在投影平面前面,投影线到达平面之前已经相交,所以投影平面上的图像是翻转的。。。当物体原理投影中心时,正交投影仍保持不变,但透视投影变小了,这种视觉现象称作透视缩略。
    2. 小孔成像:
      公式:(向z=d平面投影)
      p ′ = [ x ′ y ′ z ′ ] = [ d x / z d y / z d ] {p}'=\begin{bmatrix} {x}'\\ {y}'\\ {z}' \end{bmatrix}=\begin{bmatrix} dx/z\\ dy/z\\ d \end{bmatrix} p=xyz=dx/zdy/zd
      使用矩阵进行透视投影
      [ x y z 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 1 / d 0 0 0 0 ] = [ x y z z / d ] \begin{bmatrix} x & y & z & 1 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 1/d\\ 0 & 0 & 0 & 0 \end{bmatrix}=\begin{bmatrix} x & y & z & z/d \end{bmatrix} [xyz1]100001000010001/d0=[xyzz/d]
  • unity相关API
    1. 使用Matrix4x4.Translate创建一个平移矩阵。
    2. 使用Matrix4x4.Rotate创建一个旋转矩阵。
    3. 使用Matrix4x4.Scale创建一个缩放矩阵。
    4. 使用Matrix4x4.TRS创建一个移动、旋转、缩放的复合矩阵。
    5. 使用Matrix4x4.MultiplyPoint或者Matrix4x4.MultiplyPoint3x4来变换一个点。
    6. 使用Matrix4x4.MultiplyVector来变换一个向量。

猜你喜欢

转载自blog.csdn.net/cgExplorer/article/details/120624267