CG数据类型
--------------------------
float
half
int
fixed
bool
simpler
sampler
profile
string
==========
float[n] {data_0, data_1 ... data_n};
struct
{
};
CG数据类型
--------------------------
float
half
int
fixed
bool
simpler
sampler
profile
string
==========
float[n] {data_0, data_1 ... data_n};
struct
{
};
法线变换
--------------------------
M^T · G = I
G = (M^(-1))^T
如果M是正交矩阵
M^(-1) = M^T
(M^(-1))^T = M
正交:旋转变换
旋转和统一缩放 (M^T)^(-1) = (1/k)M
屏幕空间之屏幕映射
--------------------------
从Z轴方向看
(-1, 1) ( 1, 1)
┌────────────┐
│ │
│ ( 0, 0) │
│ │
└────────────┘
(-1,-1) ( 1,-1)
转换到屏幕(以Unity屏幕为例)
( w, h)
┌──────────────────┐
│ │
└──────────────────┘
( 0, 0)
x = ( (w/2)x + w/2 )
y = ( (h/2)y + h/2 )
z 深度缓存
裁剪空间完成之后的坐标
┌ Xclip ┐
│ Yclip │
│ Zclip │
└ Wclip ┘
整个屏幕空间的公式应为
Xscreen = (W Xclip) / 2Wclip + W/2
Yscreen = (H Yclip) / 2Wclip + H/2
屏幕空间之齐次除法
--------------------------
屏幕空间
1. 齐次除法 / 透视除法
2. 屏幕映射
剪裁 透视
┌ x(cot(FOV/2)/Aspect) ┐
│ y(cot(FOV/2)) │
│ -z((f+n)/(f-n)) - (2fn/(f-n)) │
└ -z ┘
openGL | Dx
NOC | CVV
x ∈(-1,1) | x ∈(-1,1)
y ∈(-1,1) | x ∈(-1,1)
z ∈(-1,1) | x ∈(0,1)
┌ -(x/z)(cot(FOV/2)/Aspect) ┐
│ -(y/z)(cot(FOV/2)) │
│ (f+n)/(f-n) + (2fn/z(f-n)) │
剪裁 正交
┌ x/(Aspect x size)) ┐
│ y/size │
│ -2/(f-n) - (f+n)/(f-n) │
└ 1 ┘
进行齐次除法后值不变,所以可以跳过直接进行屏幕映射
续矩阵知识总结-变换总结
--------------------------
行列式性质
1. 行列式与它的转制的值相等 D^T = D
2. 互换行列式两行(列),行列式变号
3. 行列式某一行(列)中所有元素都乘以同一数k,等于用k乘此行列式
4. 如果行列式中如果有两行(列)元素成比例,行列式D = 0
5. 若行列式中某一行(列)的元素都是两数之和,可以把行列式分开写
6. 把行列式某一行(列)的各元素乘以同一数后加到另一行(列)对应元素上,行列不变
==========================================================
代数余子式
A = (-1)^(i+j) M_(ij)
一个n阶行列式,如果其中第i行所有元素除(i,j)元以外都是0,则这个行列式等于 a_(ij) 与它代数余子式的乘积。
D = a_(ij) A_(ij)
行列式等于它的任意一行(列)的各个元素与其对应的代数余子式乘积之和。
D = a_(i1) A_(i1) + a_(i2) A_(i2) + ... + a_(in) A_(in) (i = 1,2, ... , n)
D = a_(1j) A_(1j) + a_(2j) A_(2j) + ... + a_(nj) A_(nj) (j = 1,2, ... , n)
==========================================================
逆矩阵
M(M^(-1)) = M^(-1) M = I
逆矩阵计算公式
M^(-1) = ( adjM )/ ( |M| )
note:adj M 表示 M的伴随矩阵
逆矩阵特性
1) 如果M是非奇异矩阵,则该矩阵的逆的逆等于原矩阵:(M^(-1))^(-1) = M;
2) 单位矩阵的逆是它本身:I^(-1) = I;
3) 矩阵转置的逆等于它的逆的转置:(M^T)^(-1) = ( M^(-1) )^T;
4) 矩阵乘积的逆等于矩阵的逆的相反顺序的乘积:(AB)^(-1) = B^(-1) A^(-1);
5) 根据4) 可拓展到多个矩阵的情况:(M_1 M_2 ... M_n)^(-1) = (M_n)^(-1) (M_(n-1))^(-1) ... (M_1)^(-1);
==========================================================
正交矩阵
M 正交 <=> M M^T = I
M 正交 <=> M^T = M^(-1)
r_1 · r_1 = 1 r_1 · r_2 = 0 r_1 · r_3 = 0
r_2 · r_1 = 0 r_2 · r_2 = 1 r_2 · r_3 = 0
r_3 · r_1 = 0 r_3 · r_2 = 0 r_3 · r_3 = 1
正交矩阵满足条件:
1) 矩阵的每一行都是单位向量
2) 矩阵的所有行相互垂直
正交基:
如果一组向量互相垂直,这组向量就被称作正交基。
标准正交基:
如果一组向量互相垂直并且所有向量都是单位向量,则称为标准正交基。
==========================================================
4 x 4 阶平移矩阵
┌ 1 0 0 0 ┐
[ x y z 1 ] =│ 0 1 0 0 │ = [ x+Δx y+Δy z+Δz 1]
│ 0 1 0 0 │
└ Δx Δy Δz 1 ┘
┌ r_11 r_12 r_13 0 ┐ ┌ 1 0 0 0 ┐ ┌ r_11 r_12 r_13 0 ┐
M = RT =│ r_21 r_22 r_23 0 │ │ 0 1 0 0 │ = │ r_21 r_22 r_23 0 │
│ r_31 r_32 r_33 0 │ │ 0 1 0 0 │ │ r_31 r_32 r_33 0 │
└ 0 0 0 1 ┘ └ Δx Δy Δz 1 ┘ └ Δx Δy Δz 1 ┘
==========================================================
仿射变换
=========================================================
透视投影
┌ x ┐ ┌ -dx/z ┐
p' = │ y │ = │ -dy/z │
└ z ┘ └ -d ┘
┌ 1 0 0 0 ┐
[ x y z 1 ] =│ 0 1 0 0 │ = [ x y z z/d]
│ 0 1 0 1/d│
└ 0 0 0 0 ┘
=========================================================
变换分类
=========================================================
空间变换
=========================================================
Unity 中透视投影矩阵
┌ n/r 0 0 0 ┐
│ 0 n/t 0 0 │
│ 0 1 -(f+n)/(f-n) (-2fn)/(f-n) │
└ 0 0 -1 0 ┘
存在Zfighting问题:
通过上述转换,得到的z值不是线性的,所以为了更精确的表达,所以希望远平面与近平面尽量接近
投影的FOV表达式
=========================================================
Unity 中正交投影矩阵
┌ 1/r 0 0 0 ┐
│ 0 1/t 0 0 │
O = │ 0 1 -2/(f-n) (f+n)/(f-n) │
└ 0 0 -1 0 ┘
改变成Unity的形式
矩阵知识总结
--------------------------
矩阵乘法特点:
1) MI = IM = M //矩阵乘以单位矩阵 等于 单位矩阵乘以矩阵
2) AB ≠ BA //矩阵不满足交换律
3) (AB)C = A(BC) //矩阵满足结合律
4) (kA)B = k(AB) = A(kB) //矩阵满足线性运算律
5) (vA)B = v(AB) //满足向量运算的结合律
6) (AB)^T = B^T A^T // 矩阵AB的转置 等于 矩阵B的转置乘以矩阵A的转置
7) (M_1 M_2 ... M_n)^T = (M_n)^T (M_(n-1))^T ... (M_1)^T
==========================================================
向量与矩阵相乘
1) 行向量只能左乘矩阵 //适用于DX
2) 列向量只能右乘矩阵 //适用于OpenGL
==========================================================
矩阵旋转
二维旋转矩阵
┌ p' ┐ ┌ Cosθ Sinθ ┐
R(θ) = └ q' ┘ └ -Sinθ Cosθ ┘
三维旋转矩阵
X轴旋转
┌ p' ┐ ┌ 1 0 0 ┐
R(θ) = │ q' │ │ 0 Cosθ Sinθ │
└ r' ┘ └ 0 -Sinθ Cosθ ┘
Y轴旋转
┌ p' ┐ ┌ Cosθ 0 -Sinθ ┐
R(θ) = │ q' │ │ 0 1 0 │
└ r' ┘ └ Sinθ 0 Cosθ ┘
Z轴旋转
┌ p' ┐ ┌ Cosθ Sinθ 0 ┐
R(θ) = │ q' │ │ -Sinθ Cosθ 0 │
└ r' ┘ └ 0 0 1 ┘
任意n轴旋转矩阵
┌ p' ┐ ┌ (n_x)^2(1-Cosθ)+Cosθ n_xn_y(1-Cosθ)-n_zSinθ n_xn_z(1-Cosθ)+n_ySinθ ┐
R(n,θ) = │ q' │ = │ n_xn_y(1-Cosθ)+n_zSinθ (n_y)^2(1-Cosθ)+Cosθ n_yn_z(1-Cosθ)-n_xSinθ │
└ r' ┘ └ n_xn_z(1-Cosθ)-n_ySinθ n_yn_z(1-Cosθ)+n_xSinθ (n_z)^2(1-Cosθ)+Cosθ ┘
==========================================================
矩阵缩放
二维沿轴缩放矩阵
┌ k_x 0 ┐
S(k_x, k_y) = └ 0 k_y ┘
三维沿轴缩放矩阵
┌ k_x 0 0 ┐
S(k_x, k_y, k_z) = │ 0 k_y 0 │
└ 0 0 k_z ┘
二维沿任意方向缩放矩阵
┌ p' ┐ ┌ 1 + (k-1)(n_x)^2 (k-1)n_xn_y ┐
S(n,k) = └ q' ┘ = └ (k-1)n_xn_y 1 + (k-1)(n_y)^2 ┘
note:缩放系数k,缩放轴n;
三维沿任意方向缩放矩阵
┌ p' ┐ ┌ 1 + (k-1)(n_x)^2 (k-1)n_xn_y (k-1)n_xn_z ┐
S(n,k) = │ q' │ = │ (k-1)n_xn_y 1 + (k-1)(n_y)^2 (k-1)n_yn_z │
└ r' ┘ └ (k-1)n_xn_z (k-1)n_zn_y 1 + (k-1)(n_z)^2 ┘
==========================================================
正交投影
二维
向X轴投影
┌ 1 0 ┐
p_x = S([ 0, 1 ], 0) =└ 0 0 ┘
向Y轴投影
┌ 0 0 ┐
p_y = S([ 1, 0 ], 0) =└ 0 1 ┘
向任意直线投影的2D矩阵
┌ 1 - (n_x)^2 -n_x n_y ┐
p(n) = S(n,0) = └ -n_x n_y 1 - (n_y)^2 ┘
三维
向XY平面投影
┌ 1 0 0 ┐
p_xy = S([0, 0, 1], 0) =│ 0 1 0 │
└ 0 0 0 ┘
向XZ平面投影
┌ 1 0 0 ┐
p_xz = S([0, 1, 0], 0) =│ 0 0 0 │
└ 0 0 1 ┘
向YZ平面投影
┌ 0 0 0 ┐
p_yz = S([1, 0, 0], 0) =│ 0 1 0 │
└ 0 0 1 ┘
向任意平面投影的3D矩阵
┌ 1 - (n_x)^2 -n_x n_y -n_x n_z ┐
p(n) = S(n,0) = │ -n_x n_y 1 - (n_y)^2 -n_y n_z │
└ -n_x n_z -n_z n_y 1- (n_z)^2 ┘
==========================================================
切变
2D切变矩阵
┌ 1 0 ┐
H_x(s) = └ s 1 ┘
┌ 1 s ┐
H_y(s) = └ 0 1 ┘
3D切变矩阵
┌ 1 0 0 ┐
H_(xy)(s,t) = │ 0 1 0 │
└ s t 1 ┘
┌ 1 0 0 ┐
H_(xz)(s,t) = │ s 1 t │
└ 0 0 1 ┘
┌ 1 s t ┐
H_(yz)(s,t) = │ 0 1 0 │
└ 0 0 1 ┘
==========================================================
行列式
e.g.
| m_11 m_12 |
|M| = | m_21 m_22 | = m_11m_22 - m_12m_21
e.g.2
| m_11 m_12 m_13 |
|M| = | m_21 m_22 m_23 |
| m_31 m_32 m_33 |
|M| = m_11m_22m33 +m_12m_23m_32 + m_13m_21m_32 - m_13m_22m_31 - m_32m_23m_11 - m_21m_12m_33 ;
学数学头大啊,不想学啊,但是又不能不学,TAT
1/r 0 0 0
0 1/t 0 0
0 0 -2/fn (-f+n)/(f-n)
0 0 0 0
Unity中透视投影矩阵
--------------------------
平面投影
--------------------------
结合初中知识 小孔成像 得出结论
当物体在原点前,投影平面在原点后,距离为d
┌ x ┐ ┌ x ┐ ┌ -dx/z ┐
p = │ y │ = > p' = │ y │ = │ -dy/z │
└ z ┘ └ z ┘ └ -d ┘
当投影平面也在原点前,距离为d时
┌ x ┐ ┌ -dx/z ┐
p' = │ y │ = │ -dy/z │
└ z ┘ └ -d ┘
一般仿射变换
--------------------------
当做 绕不通过原点的轴旋转 或 沿不穿过原点的平面缩放 等类似的题目时
1) P向量使用平移矩阵T移到原点
2) P向量使用矩阵R进行线性变换
3) P向量使用矩阵T的逆矩阵T^(-1)移到之前位置
P T R T^(-1)
平移只影响到了4x4阶矩阵的最后一行的元素,而对它的其他的旋转矩阵或者线性矩阵没有任何影响
==============
判断矩阵是否可逆: |M| ≠ 0
奇异矩阵/不可逆矩阵:一个不可逆矩阵 |M| = 0
变换分类
--------------------------
线性变换
F(a + b) = F(a) + F(b)
F(ka) = kF(a)
============
F(a) = am // m为任意方阵
F(a + b) = (a + b) m
= am + bm
= F(a) + F(b)
F( ka ) = (ka) M
= k (am)
= k F(a)
============
如果 F(0) = a, 且 a ≠ 0, 那么 F不可能是线性变换
F(k0) = a F(k0) ≠ kF(0)
线性变换不会出现平移,因为原点位置上不会变化
============
反射变换
反射变换是指线性变换后接着平移
Vector V
Matrix M
V' = VM + b //反射变换
============
可逆变换
V' = VM V = V'M^(-1)
============
等角变换
变换前后夹角大小方向不变
============
正交变换
============
刚体变换
============
旋转矩阵与平移矩阵结合
--------------------------
1) 已知旋转矩阵 R 和平移矩阵 T
2) 根据公式,可得矩阵
3) 如果把 [Δx, Δy, Δz] = t, 那么可得
平移矩阵
--------------------------
2D齐次坐标 (x, y, w) 3x3阶
3D齐次坐标 (x, y, z, w) 4x4阶
==================
4x4 阶平移矩阵
1) 一般三维坐标
2) 加入 w 变为齐次坐标
3) 转换矩阵为单位矩阵并加入 Δx, Δy和Δz来实现平移
齐次空间
--------------------------
对于一个2D的点 ( x, y ),在齐次空间中表示为 (x, y, w),那么2D点的真实表示发生为 2D(x/w, y/w )
在2D中 如果w = 0, 那么表示无限远的一个点
对于一个3D的点 ( x, y, z ),在齐次空间中表示为 (x, y, z, w),那么3D点的真实表示发生为 3D(x/w, y/w, z/w)
在3D中 如果w = 0, 那么表示无限远的一个点
======
目的:为了之后做平移点变换
正交基与标准正交基
--------------------------
一组正交基:基矢量直接互相垂直
标准正交基:给个基矢量长度为1
正交矩阵是一组标准正交基
如果使用一组正交基构建矩阵,不一定是正交矩阵
===========
施密特正交化
施密特正交化(Schmidt orthogonalization)是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm,使由α1,α2,……,αm与向量组β1,β2,……,βm等价,再将正交向量组中每个向量经过单位化,就得到一个标准正交向量组,这种方法称为施密特正交化。
Reference:
百度百科, 2018, 施密特正交化, Link: https://baike.baidu.com/item/%E6%96%BD%E5%AF%86%E7%89%B9%E6%AD%A3%E4%BA%A4%E5%8C%96/756386?fr=aladdin [Accessed Date: 2018/04/12]
正交矩阵
--------------------------
定义:MM^(T) = I
如果 M 是正交矩阵,那么 MM^(T) = I
结合之前的 M(M^(-1)) = I
那么 M^(T) = M^(-1)
===========
验证一个矩阵是否为正交矩阵,推导
1) 展开 M M^(T) = I
2) 计算 I 的值
3) 替换M 为三个向量 r_1, r_2, 和 r_3
4) 根具 1)、2) 和 3) 可得,再找出重复和特殊的
5) 得出结论
a. 只有当 r_1, r_2 和 r_3 为单位向量时,点积才为1
b. r_1 ⊥ r_2 ⊥ r_3
c. 矩阵每行为单位向量
d. 矩阵所有行互相垂直
逆矩阵计算及性质
--------------------------
特性
M 变化之后 可以用 M^(-1) 变化回去;
(M^(-1))^(-1) = M;
I^(-1) = I;
(M^T)^(-1) = ( M^(-1) )^T;
(AB)^(-1) = B^(-1) A^(-1);
(M_1 M_2 ... M_n)^(-1) = (M_n)^(-1) (M_(n-1))^(-1) ... (M_1)^(-1);
逆矩阵计算公式
--------------------------
e.g.
===========
结合 |M| 来看
MM* = |M| I = M*M
note:M* 为 M 的伴随矩阵
============
M M* = |M| I
M ( M* / |M| ) = I
M M^(-1) = I
M^(-1) = M* / |M|
伴随矩阵
--------------------------
行列式性质复习
1. 行列式与它的转置行列式相等
2. 互换行列式两行(列),行列式变号
3. 行列式的某一行)(列)中所有元素都乘以同一数k,等于用数k乘此行列式
4. 行列式中如果又两行(列)成比例,则此行列式等于零
5. 若行列式都某一行(列)的元素都是两数之和,那么可以拆分成两个行列式
6.把行列式的某一行(列)的个元素乘以同一数然后加到另一行(列)对应的元素上,行列式不变
==============
几何解释
2D中,行列式等于以基向量为两边的平行四边形的有符号面积
3D中,行列式等于以变换后的基向量为三边的平行六边形的有符号体积
==============
伴随矩阵:矩阵M每一个元素的代数余子式所围成的矩阵的转置
M = A^T
e.g.
伴随矩阵和矩阵的逆有关系
M (M^(-1)) = M^(-1) M = I
行列式按行按列展开法则
--------------------------
行列式等于它的任意行(列)的各元素与其对应的代数余子式乘积之和;
(更具性质:若行列式中某一行(列)的元素都是两数之和,可以把行列式分开写)