# Linear Algebra

点乘\vec a{\cdot}\vec b=|\vec a||\vec b|\cos\theta

常用于求夹角,判断向量前后等

![[Pasted image 20240922013742.png]]

叉乘\vec a{\times}\vec b=|\vec a||\vec b|\sin\theta{\hat n}=\vec c

\vec a\times\vec a=\vec 0

\vec a\times\vec b=-\vec b\times\vec a

\vec a\times(\vec b+\vec c)=\vec a\times\vec b+\vec a\times\vec c

![[Pasted image 20240921073852.png]]

图形学常用三维笛卡尔坐标系,记x、y、z轴的正方向的单位向量分别为$\vec i$、$\vec j$、$\vec k$ ,则有

\vec a=a_x\vec i+a_y\vec j+a_z\vec k

\vec b=b_x\vec i+b_y\vec j+b_z\vec k

$$

\begin{align}

\vec c&=\vec a\times\vec b \\

&=\begin{vmatrix}

\vec i & \vec j & \vec k \\

a_x & a_y & a_z \\

b_x & b_y & b_z

\end{vmatrix} \\

&=(a_yb_z-a_zb_y)\vec i+(a_zb_x-a_xb_z)\vec j+(a_xb_y-a_yb_x)\vec k

\end{align}

$$

常用于判断向量左右,点是否在三角形内,求法线等

![[Pasted image 20240922013713.png]]

3Dvector=(x, y, z, 0)^T

3Dpoint=(x,y,z,1)^T

homogenous coordinate齐次坐标: 在欧氏空间中,同一平面上的两条平行线不能相交,在投影空间中却不一样,此时就需要使用齐次坐标来代替原本的笛卡尔坐标$(x,y,z,w)$进行表示。想要把它变回笛卡尔坐标只需要除以$w$ 即可$(\frac{x}{w},\frac{y}{w},\frac{z}{w},1)$。

以下三个点在欧氏空间中表示同一个点。

![[Pasted image 20240922220232.png]]

矩阵具有结合律,不具有交换律,正交矩阵的逆是它的转置。

# Transformation

我们使用的模型,它的顶点数据多是相对于的model space定义的,需要对它进行一系列的变换使其到屏幕空间。

V^{\prime}=M_{viewport}M_{proj}M_{view}M_{model}V

## Model Transformation

model space -> world space

$$

M_{model}=T_{model}R_{model}S_{model}

$$

### Scale

$$

S(s_X,s_y,s_z)=

\begin{bmatrix}

s_x & 0 & 0 & 0 \\

0 & s_y & 0 & 0 \\

0 & 0 & s_z & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

### Rotation

$$

R_x(\alpha)=

\begin{bmatrix}

1 & 0 & 0 & 0 \\

0 & \cos\alpha & -\sin\alpha & 0 \\

0 & \sin\alpha & \cos\alpha & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

$$

R_y(\alpha)=

\begin{bmatrix}

\cos\alpha & 0 & \sin\alpha & 0 \\

0 & 1 & 0 & 0 \\

-\sin\alpha & 0 & \cos\alpha & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

$$

R_z(\alpha)=

\begin{bmatrix}

\cos\alpha & -\sin\alpha & 0 & 0 \\

\sin\alpha & \cos\alpha & 0 & 0 \\

0 & 0 & 1 & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma)

罗德里格斯旋转公式(Rodrigues' Rotation Formula):

$$

R(\vec n,\alpha)=\cos(\alpha)\bf I+(1-\cos(\alpha)){\hat v}{\hat v}^T+\sin(\alpha)

\begin{pmatrix}

0 & -n_z & n_y \\

n_z & 0 & -n_x \\

-n_y & n_x & 0

\end{pmatrix}

$$

欧拉角:以上使用欧拉角来表示旋转角度

四元数

### Translation

位移变换不是线性变换

$$

T(t_x,t_y,t_z)=

\begin{bmatrix}

1 & 0 & 0 & t_x \\

0 & 1 & 0 & t_y \\

0 & 0 & 1 & t_z \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

## View Transformation

model space -> view space

$$

M_{view}=R_{view}T_{view}

$$

![[Pasted image 20240921140802.png]]

$$

T_{view}=

\begin{bmatrix}

1 & 0 & 0 & -x_e \\

0 & 1 & 0 & -y_e \\

0 & 0 & 1 & -z_e \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

$$

R^{-1}_{view}=

\begin{bmatrix}

x_{\hat g\times\hat t} & x_t & x_{-g} & 0 \\

y_{\hat g\times\hat t} & y_t & y_{-g} & 0 \\

z_{\hat g\times\hat t} & z_t & z_{-g} & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

$$

R_{view}=(R_{view}^{-1})^T

$$

## Projection Transformation

view space -> clip space

![[Pasted image 20240921141344.png]]

#### Orthographic Projection

$$

M_{ortho}=

\begin{bmatrix}

\frac{2}{r-l} & 0 & 0 & 0 \\

0 & \frac{2}{t-b} & 0 & 0 \\

0 & 0 & \frac{2}{n-f} & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

\begin{bmatrix}

1 & 0 & 0 & -\frac{r+l}{2} \\

0 & 1 & 0 & -\frac{t+b}{2} \\

0 & 0 & 1 & -\frac{n+f}{2} \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

#### Perspective projection

$$

M_{persp}=M_{ortho}M_{persp\rightarrow{ortho}}

$$

$$

M_{persp\rightarrow{ortho}}=

\begin{bmatrix}

n & 0 & 0 & 0 \\

0 & n & 0 & 0 \\

0 & 0 & n+f & -nf \\

0 & 0 & 1 & 0

\end{bmatrix}

$$

### Clipping

cilp space -> NDC

将齐次坐标变为欧氏空间坐标

## Viewport Transformation

NDC -> screen space

$$

M_{viewport}=

\begin{bmatrix}

\frac{width}{2} & 0 & 0 & \frac{width}{2} \\

0 & \frac{height}{2} & 0 & \frac{height}{2} \\

0 & 0 & 1 & 0 \\

0 & 0 & 0 & 1

\end{bmatrix}

$$

# Rasterization

图元Primitive: 之前的一系列顶点装配为指定的图形结构(线、三角形之类)

但我们直到屏幕上显示的像素,还需要将顶点变为像素,光栅化要做的就是把图元转为片段/片元(比pixel多携带了一些信息)

## 光栅化算法

### DDA数值微分算法

任何直线都可以用$y=kx+b$表示,可以通过斜率得知直线在那个轴上的变化比较快。

当$|k|<1$时,从起点开始画起,每次$x=x+1$,$y=\lfloor{y+k}\rfloor$,来得到屏幕坐标。

当$|k|>1$时,从起点开始画起,每次$y=y+1$,$x=\lfloor\frac{x+1}{k}\rfloor$,来得到屏幕坐标。

### 中点Bresenham算法

### 三角形光栅化算法

可以直接扫描整个屏幕或者三角形的AABB,判断每个像素是否在三角形内即可。

或者更省一些直接从三角形的左下角开始往右扫描,碰到不在三角形内的就换一行继续扫。

![[Pasted image 20240923032252.png]]

## 抗锯齿

上述光栅化工程可以看作对图元的采样,会不可避免的出现走样,此时可以使用一些反走样技术来进行缓解。

### SSAA

### MSAA

## 可见性/遮挡

### z-buffer

## 插值

重心坐标

# Shading

## 光照模型

### Lambert

### Phong

### Blin-Phong

## 光源类型

### ambient

###

## 着色频率

### Flat

### Gouraud

### Phong

# Texture

## 纹理映射

## 走样

### 插值

### Mipmap

### 应用

### SAT

# Geometry

## 表示

### 隐

### 显

## 曲线

## 曲面

### 细分

### 简化

# Material

# Pipeline