### OpenGL
- 默认使用右手坐标系
- 默认使用列主序矩阵
- 归一化的CVV (*Canonical View Volume*)的z范围是[-1, 1]
***

### DirectX
- 默认使用左手坐标系
- 默认使用行主序矩阵
- 归一化的CVV的z范围是[0, 1]
***

- (x, y, z, 0) 向量
- (x, y, z, 1) 点
***


***

### DirectX透视投影矩阵推导


  - $P(x, y, z) => P’(x’, y’, z’)$
  - $P(N\dfrac{x}{z}, N\dfrac{y}{z}, N)$, 投影后的$x’$和$y’$与$z’$不是线性关系, 与$\dfrac {1}{z'}$才是线性关系, 用$\dfrac{az+b}{z}$表示
  - 当:
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    \dfrac{az+b}{z}=0, z=N  &  \\  
    \dfrac{az+b}{z}=1, z=F  &    
    \end{array}  
\right.  
\end{equation}
  - 可得:
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    a=\dfrac{F}{F-N}   &  \\  
    b=-\dfrac{NF}{F-N}  &    
    \end{array}  
\right.  
\end{equation}
  - 反推投影矩阵, 可得:
$$(x, y, z, 1) * 
\begin{bmatrix}N & 0 & 0 & 0\\0 & N & 0 & 0\\0 & 0 & a & 1\\0 & 0 & b & 0\end{bmatrix}=
(Nx, Ny, az+b, Z)
$$

  - 给定$x$属于$[a, b]$, 对应于$y$属于$[c, d]$, 使得$x$与$a$的距离比上$ab$等于$y$与$c$的距离比上$cd$, 即$\dfrac{x-a}{b-a} = \dfrac{y-c}{d-c}$, 此时, $[a, b]$上任一点都能在$[c, d]$中找到对应点, 同理, 将$(x’, y’)$映射到$[-1, 1]$ (线性插值), 可得
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    \dfrac{\dfrac{Nx}{z}-left}{right-left}=\dfrac{X_{cvv}-(-1)}{1-(-1)}   &  \\  
    \dfrac{\dfrac{Ny}{z}-bottom}{top-bottom}=\dfrac{Y_{cvv}-(-1)}{1-(-1)}  &    
    \end{array}  
\right.  
\end{equation}

  - 上式可写成
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    \dfrac{\dfrac{Nx}{z}}{right-left}-{\dfrac{left}{right-left}}=\dfrac{X_{cvv}}{2}+\dfrac{1}{2}   &  \\  
    \dfrac{\dfrac{Ny}{z}}{top-bottom}-{\dfrac{bottom}{top-bottom}}=\dfrac{Y_{cvv}}{2}+\dfrac{1}{2}  &    
    \end{array}  
\right.  
\end{equation}

  - 当投影平面在$x$方向上居中, 且在$y$方向上居中, 即
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    left=-right, \dfrac{left}{right-left}=\dfrac{1}{2}   &  \\  
    bottom=-top, \dfrac{bottom}{top-bottom}=\dfrac{1}{2}  &    
    \end{array}  
\right.  
\end{equation}

  - 则上式可写成
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    \dfrac{\dfrac{Nx}{z}}{right-left}=\dfrac{X_{cvv}}{2}   &  \\  
    \dfrac{\dfrac{Ny}{z}}{top-bottom}=\dfrac{Y_{cvv}}{2}   &    
    \end{array}  
\right.  
\end{equation}  
\begin{equation}  
\left\{  
    \begin{array}{**lr**}  
    X_{cvv}=\dfrac{2Nx}{(right-left)z}   &  \\  
    Y_{cvv}=\dfrac{2Ny}{(top-bottom)z}   &    
    \end{array}  
\right.  
\end{equation}
  
  - 反推投影矩阵, 可得
$$(x, y, z, 1) * 
\begin{bmatrix}\dfrac{2N}{right-left} & 0 & 0 & 0\\0 & \dfrac{2N}{top-bottom} & 0 & 0\\0 & 0 & a & 1\\0 & 0 & b & 0\end{bmatrix}=
(\dfrac{2Nx}{right-left}, \dfrac{2Ny}{top-bottom}, az+b, Z)
$$

  - 也可根据FOV来求
  
  
  - 一般情况下的矩阵
$$
\begin{bmatrix}\dfrac{2N}{right-left} & 0 & \dfrac{right+left}{right-left} & 0\\0 & \dfrac{2N}{top-bottom} & \dfrac{top+bottom}{top-bottom} & 0\\0 & 0 & a & b\\0 & 0 & -1 & 0\end{bmatrix}
$$



addb4b51862368cfd0a593b2be93c4778eaa2512
ipynb
Jupyter Notebook
Doc/Jupyter Notebook/Transform.ipynb
Alpha255/Rockcat
f04124b17911fb6148512dd8fb260bd84702ffc1
MIT
Doc/Jupyter Notebook/Transform.ipynb
Alpha255/Rockcat
f04124b17911fb6148512dd8fb260bd84702ffc1
MIT
Doc/Jupyter Notebook/Transform.ipynb
Alpha255/Rockcat
f04124b17911fb6148512dd8fb260bd84702ffc1
MIT
Qwen/Qwen-72B
1. YES
2. YES